靜態順序表

順序表是在計算機內存中以數組的形式保存的線性表,是指用一組地址連續的存儲單元依次存儲數據元素的線性結構。線性表采用順序存儲的方式存儲就稱之為順序表。順序表是將表中的結點依次存放在計算機內存中一組地址連續的存儲單元中。

順序表分為靜態存儲的順序表和動態存儲的順序表。

這里先說明靜態順序表的基本操作的實現:

//SeqList.h
#ifndef?__SEQLIST_H__
#define?__SEQLIST_H__
#include<string.h>
#include<assert.h>
#define?MAX_SIZE?100
typedef?int?DataType;
typedef?struct?SeqList
{DataType?array[MAX_SIZE];size_t?size;
}SeqList,*pSeqList;void?InitSeqList(pSeqList?pSeq);
void?PrintSeqList(pSeqList?pSeq);void?PushBack(pSeqList?pSeq,?DataType?x);
void?PopBack(pSeqList?pSeq);
void?PushFront(pSeqList?pSeq,?DataType?x);
void?PopFront(pSeqList?pSeq);void?Insert(pSeqList?pSeq,?int?pos,?DataType?x);
void?Remove(pSeqList?pSeq,?DataType?x);
void?RemoveAll(pSeqList?pSeq,?DataType?x);int?Find(pSeqList?pSeq,DataType?x);
void?Erase(pSeqList?pSeq,DataType?pos);
void?ReverseList(pSeqList?pSeq);
void?SortList(pSeqList?pSeq);
int??BinarySearch(pSeqList?Seq,?DataType?x);void?InitSeqList(pSeqList?pSeq)
{memset(pSeq->array,0,sizeof(DataType)*MAX_SIZE);pSeq->size?=?0;
}void?PushBack(pSeqList?pSeq,?DataType?x)
{assert(pSeq);if(pSeq->size?>=?MAX_SIZE){printf("SeqList?is?Full");return;}pSeq->array[pSeq->size]?=?x;pSeq->size++;
}void?PopBack(pSeqList?pSeq)
{assert(pSeq);if(pSeq->size?<=?0){printf("SeqList?is?empty");return;}pSeq->array[pSeq->size-1]?=?NULL;pSeq->size--;
}void?PushFront(pSeqList?pSeq,?DataType?x)
{int?i?=?0;assert(pSeq);if(pSeq->size?>=?MAX_SIZE){printf("SeqList?is?Full");return;}for(i?=?pSeq->size-1;?i?>=?0;?i--){pSeq->array[i+1]?=?pSeq->array[i];}pSeq->array[0]?=?x;pSeq->size++;
}void?PopFront(pSeqList?pSeq)
{int?i?=?0;assert(pSeq);if(pSeq->size?<=?0){printf("SeqList?is?empty");return;}for(i?=?1;?i?<?pSeq->size;?i++){pSeq->array[i-1]?=?pSeq->array[i];}pSeq->size--;
}void?PrintSeqList(pSeqList?pSeq)
{int?i?=?0;assert(pSeq);for(i?=?0;?i?<?pSeq->size;i++){printf("%d?",pSeq->array[i]);}
}void?Insert(pSeqList?pSeq,?int?pos,?DataType?x)
{int?i?=?0;assert(pSeq);if(pSeq->size?>=?MAX_SIZE){printf("SeqList?is?Full");return;}for(i?=?pSeq->size-1;?i?>=?pos;?i--){pSeq->array[i+1]?=?pSeq->array[i];}pSeq->array[pos]?=?x;pSeq->size++;
}int?Find(pSeqList?pSeq,DataType?x)
{int?i?=?0;assert(pSeq);if(pSeq->size?<=?0){printf("SeqList?is?empty");return;}for(i?=?0;?i?<?pSeq->size;?i++){if(pSeq->array[i]?==?x){return?i;}}return?-1;
}void?Erase(pSeqList?pSeq,DataType?pos)
{int?i?=?0;assert(pSeq);if(pSeq->size?<=?0){printf("SeqList?is?empty");return;}for(i?=?pos+1;?i?<?pSeq->size;?i++){pSeq->array[i-1]?=?pSeq->array[i];}pSeq->size--;
}void?Remove(pSeqList?pSeq,?DataType?x)
{int?pos?=?Find(pSeq,x);assert(pSeq);if(pos?!=?-1){Erase(pSeq,pos);}else{printf("not?exist");}
}void?RemoveAll(pSeqList?pSeq,?DataType?x)
{int?count?=?0;int?i?=?0;assert(pSeq);if(pSeq->size?<=?0){printf("SeqList?is?empty");return;}for(i?=?0;?i?<?pSeq->size;?i++){if(pSeq->array[i]?==?x){count++;}else{pSeq->array[i-count]?=?pSeq->array[i];}}pSeq->size-=count;
}void?ReverseList(pSeqList?pSeq)
{int?left?=?0;int?right?=?pSeq->size-1;assert(pSeq);while(left?<?right){int?tmp?=?pSeq->array[left];pSeq->array[left]?=?pSeq->array[right];pSeq->array[right]?=?tmp;left++;right--;}
}void?SortList(pSeqList?pSeq)
{int?i?=?0,?j?=?0;assert(pSeq);for(i?=?0;?i?<?pSeq->size-1;?i++){for(j?=?0;?j?<?pSeq->size-i-1;?j++){if(pSeq->array[j]?>?pSeq->array[j+1]){int?tmp?=?pSeq->array[j];pSeq->array[j]?=?pSeq->array[j+1];pSeq->array[j+1]?=?tmp;}}}
}int?BinarySearch(pSeqList?pSeq,?DataType?x)
{int?left?=?0;int?right?=?pSeq->size-1;assert(pSeq);while(left?<=?right){int?mid?=?left?-?(left?-?right)/2;if(pSeq->array[mid]?>?x){right?=?mid-1;}else?if(pSeq->array[mid]?<?x){left?=?mid+1;}else{return?mid;}}return?-1;
}#endif?//__SEQLIST_H__?//SeqList.c#include<stdio.h>
#include"SeqList.h"void?Test1()
{SeqList?seq;InitSeqList(&seq);PushBack(&seq,1);PushBack(&seq,2);PushBack(&seq,3);PushBack(&seq,4);PopBack(&seq);PrintSeqList(&seq);
}
void?Test2()
{SeqList?seq;int?ret;InitSeqList(&seq);PushBack(&seq,1);PushBack(&seq,2);PushBack(&seq,3);PushBack(&seq,4);PushFront(&seq,0);PopFront(&seq);Insert(&seq,2,6);ret?=?Find(&seq,6);printf("%d\n",ret);PrintSeqList(&seq);
}
void?Test3()
{SeqList?seq;InitSeqList(&seq);PushBack(&seq,1);PushBack(&seq,2);PushBack(&seq,3);PushBack(&seq,4);PushBack(&seq,4);PushBack(&seq,2);PushBack(&seq,5);PushBack(&seq,6);PopBack(&seq);Erase(&seq,2);Remove(&seq,2);RemoveAll(&seq,4);PrintSeqList(&seq);
}
void?Test4()
{SeqList?seq;int?pos;InitSeqList(&seq);PushBack(&seq,1);PushBack(&seq,2);PushBack(&seq,3);PushBack(&seq,4);PushBack(&seq,4);PushBack(&seq,5);ReverseList(&seq);SortList(&seq);pos?=?BinarySearch(&seq,2);printf("%d\n",pos);PrintSeqList(&seq);
}int?main()
{//Test1();?//Test2();//Test3();Test4();return?0;
}



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382890.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 淺談可變參數

1.可變參數產生原因 首先來看一個簡單的例子。 int Add(int x, int y) {return x y; } int main() {int sum 0;sum Add(1, 2);//sum Add(1, 2, 3);//sum Add(1);system("pause");return 0; } 我們可以看到&#xff0c;對于這個代碼只可以計算兩個數的加法。 …

有兩個鏈表a,b,設結點包括學號,姓名。從a鏈表中刪去與b鏈表中有相同學號的那些結點。

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct linknode { int num;char name[20];struct linknode *next; }node; node *creat() { node *h NULL,*s,*t;int d;int i 1; char name1[20];while(1) { printf("輸入第…

C語言模擬實現標準庫函數之strlen()

strlen() strlen所作的僅僅是一個計數器的工作&#xff0c;它從內存的某個位置 &#xff08;可以是字符串開頭&#xff0c;中間某個位置&#xff0c;甚至是某個不確定的內存區域&#xff09; 開始掃描&#xff0c;直到碰到第一個字符串結束符\0為止&#xff0c;然后返回計數…

C語言模擬實現標準庫函數之strcpy()

strcpy(dest,src) strcpy是一種C語言的標準庫函數&#xff0c;strcpy把從src地址開始且含有\0結束符的字符串復制到以dest開始的地址空間&#xff0c;返回值的類型為char*。 char * my_strcpy(char *str2, char *str1) {assert(*str2);assert(*str1);while(*str1!0){ *str2 …

C語言模擬實現標準庫函數之strcat()

strcat() strcat用于將兩個char類型鏈接的函數。 char * my_strcat(char *str1, char *str2) {assert(str2);assert(str1);char * p str1;while (*str1 ! 0){str1;}while (*str1 *str2){;}return p; } int main() {char str1[10] "abc";char str2[10] "de…

模板

模板是泛型編程的基礎&#xff0c;即與類型無關的邏輯代碼。 利用模板機制可以顯著減少冗余信息&#xff0c;能大幅度地節約程序代碼&#xff0c;進一步提高面向對象程序的可重用性和可維護性。 模板是實現代碼重用機制的一種工具&#xff0c;它可以實現類型參數化&#xff1b;…

C語言模擬實現標準庫函數之strstr()

strstr() strstr(str1,str2) 函數用于判斷字符串str2是否是str1的子串。如果是&#xff0c;則該函數返回str2在str1中首次出現的地址&#xff1b;否則&#xff0c;返回NULL。 char* my_strstr(const char* dest, const char* src) {char * str1 dest;char * str2 src;char …

linux-----強大的find

我又回來了。哈哈。今天我們來說一下linux中的另一個強大的find命令&#xff0c;灰常重要&#xff0c;灰常重要&#xff0c;灰常重要。顯而易見&#xff0c;find就是對某一個文件或者目錄的查找嘍。但是它的一個顯著的特點就是&#xff1a;一般放在后臺執行&#xff0c;從整個文…

C語言模擬實現標準庫函數之strchr()

strchr() 查找字符串s中首次出現字符c的位置 char * my_strchr(char *str1, char str2) {while (*str1 ! str2 && *str1 ! NULL){str1;}return str1; }int main() {char string[17];char *ptr, c r;strcpy(string, "Thisisastring");ptr my_strchr(string…

python 多人連接mysql 進行事務操作 對mysql加鎖與釋放鎖

python 多人連接mysql 對mysql進行事務操作 對mysql加鎖與釋放鎖 下面這個是user1代碼塊 # -*- coding: utf-8 -*- # user1 import pymysql import timeconn pymysql.connections.Connection(host"localhost", userdebian-sys-maint, passwordwL5wsDKDub4gT2EU…

C語言模擬實現標準庫函數之strcmp()

strcmp() C/C函數&#xff0c;比較兩個字符串 設這兩個字符串為str1&#xff0c;str2&#xff0c; 若str1str2&#xff0c;則返回零&#xff1b; 若str1<str2&#xff0c;則返回負數&#xff1b; 若str1>str2&#xff0c;則返回正數。 char * my_strcmp(char *key,…

linux之task_struct

每個進程中都有一個進程控制塊--PCB。PCB--維護進程相關的信息。然而&#xff0c;linux內核的進程控制塊就是task_struct結構體&#xff0c;它可以保存進程的信息。 所有運行在系統里的進程都以task_struct鏈表的形式存在內核里。 每個進程都將它的信息放在task_struct結構體…

python 用元類 type 實現對數據庫的ORM 映射

python 實現對數據庫的ORM 映射 如果使用pymysql 操作數據庫 不借助框架的話&#xff0c;頻繁寫sql語句, 的確比較麻煩 這里借助 type 元類 對 數據表類實現了 與mysql之間的 映射 直接上代碼 import pymysqldef conn_database_execute(sql_str):conn pymysql.connect(host…

C語言模擬實現標準庫函數之memcpy()

memcpy&#xff08;&#xff09; 1.如果我們需要對一個數組初始化&#xff0c;把數組的內容全部置0&#xff0c;那么能不能用strcpy() int main() {char arr1[10] { 0 };char arr2[10] " abcdefg ";strcpy(arr2, arr1);system("pause");return 0; } 我…

說說堆及堆排序

堆&#xff1a;是一種數組對象&#xff0c;它可以被看成是一種二叉樹結構。 我們把堆的二叉樹存儲方式分為兩種&#xff1a;即大堆和小堆。那么問題來了&#xff0c;什么大堆&#xff1f;什么是小堆&#xff1f; 大堆&#xff1a;讓每個父節點的值都大于孩子節點的值。 小堆…

運算符優先級 速查表

運算符優先級 優先級【高到低】&#xff1a; 第一級&#xff1a; 圓括號【&#xff08;&#xff09;】、下標運算符【[]】、分量運算符的指向結構體成員運算符【->】、結構體成員運算符【.】 第二級&#xff1a; 邏輯非運算符【!】、按位取反運算符【~】、自增自減運…

linux--幾種常見的進程調度算法

進程調度&#xff1a;在操作系統中調度是指一種資源分配&#xff0c;因而調度算法是指:根據系統的資源分配策略所規定的資源分配算法。操作系統管理了系統的有限資源&#xff0c;當有多個進程(或多個進程發出的請求)要使用這些資源時&#xff0c;因為資源的有限性&#xff0c;必…

指針數組和數組指針和函數指針

文章目錄1.指針數組和數組指針1.int *p1[10];2.int (*p2)[10];2.函數指針char *(*fun1)(char * p1,char *p2)函數指針的概念函數指針的作用&#xff1a;例子1 .調用方式例子2&#xff1a;&#xff08;帶注釋&#xff09;例子33.做題的小技巧1.指針數組和數組指針 1.int *p1[10…

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied:

使用虛擬環境virtualenv 創建虛擬環境出現PermissionError: [Errno 13] Permission denied: 原因&#xff1a;虛擬環境安裝的目錄所屬用戶非當前用戶 解決辦法&#xff1a;將目錄及其文件的所有者改為當前用戶 解決命令&#xff1a;sudo chown -R 當前用戶 待更改用戶的目錄/ …

linux之父子進程的輸出

首先&#xff0c;我們來回憶一下父進程與子進程&#xff0c;前幾節講了如何創建子進程&#xff0c;像這樣的&#xff0c;pid_t id fork(); 這樣我們就創建好了一個子進程&#xff0c;然而fork()函數的返回值是什么呢&#xff1f;這里要記住&#xff1a;子進程返回0&#xff0c…