標籤:c語言 結構體
順序表是C語言中一種基本的結構,可以儲存各種基本類型的資料,而且不但可以儲存基本類型的資料,也可以儲存一種結構。所以順序表是一種在學C的過程中必須掌握的結構,通過學習整理,下面來實現一下:
首先,先要想好用什麼實現,一般實現最基本的順序表的話直接用數組實現,我們在這用一個結構體來封裝這個順序表(封裝這一概念是在C++中最常用的概念)
#define ARRAY_EMPTY -2#define ARRAY_FULL -1#define MAX_SIZE 10000typedef int Datatype;typedef struct Seqlist{Datatype array[MAX_SIZE];size_t size;}Seqlist;
對於無法確定數組大小,我們可以用宏來表示。
把大體結構搭建好了之後,就可以思考一個順序表應該具有的功能,頭插,尾插,定點插入,排序等等都是一些最基本的功能:
void PrintSeqlist(Seqlist* pSeq);void InitSeqlist(Seqlist* pSeq);void PushBack(Seqlist* pSeq, Datatype x);void PushFront(Seqlist* pSeq, Datatype x);void PopBack(Seqlist* pSeq);void PopFront(Seqlist* pSeq);void Insert(Seqlist* pSeq,size_t pos, Datatype x);int Find(Seqlist* pSeq, size_t pos, Datatype x);void Erase(Seqlist* pSeq, size_t pos);int Remove(Seqlist* pSeq, Datatype x);int Removeall(Seqlist* pSeq, Datatype x);void Bubblesort(Seqlist* pSeq);void Selectsort(Seqlist* pSeq);int BinarySearch(Seqlist* pSeq, Datatype x);
下面就是一些關鍵函數的實現:
void PrintSeqlist(Seqlist* pSeq)//輸出順序表{assert(pSeq);size_t i = 0;if (pSeq->size <= 0){printf("Array is empty\n");return;}else if (pSeq->size >= MAX_SIZE){printf("Array is full\n");}for (; i < pSeq->size; ++i){printf("%-4d", pSeq->array[i]);}}void InitSeqlist(Seqlist* pSeq)//初始化順序表{pSeq->size = 0;//printf("Initialization is complete\n");}void PushBack(Seqlist* pSeq, Datatype x)//後插入{assert(pSeq);if (pSeq->size >= MAX_SIZE){printf("Array is full, insert the failure\n");return;}pSeq->array[pSeq->size] = x;pSeq->size++;}void PushFront(Seqlist* pSeq, Datatype x)//前插入{assert(pSeq);size_t i = 0;if (pSeq->size >= MAX_SIZE){printf("Array is full, insert the failure\n");return;}for (i = pSeq->size; i > 0; --i){pSeq->array[i] = pSeq->array[i - 1];}pSeq->array[0] = x;pSeq->size++;}void PopBack(Seqlist* pSeq)//後刪除{assert(pSeq);if (pSeq->size <= 0){printf("Array is empty,popback is eeror\n");return;}pSeq->array[pSeq->size-1] = 0;pSeq->size--;}void PopFront(Seqlist* pSeq)//前刪除{assert(pSeq);size_t i = 0;if (pSeq->size <= 0){printf("Array is empty,popback is eeror\n");return;}for (i = 1; i < pSeq->size; i++){pSeq->array[i - 1] = pSeq->array[i];}pSeq->size--;}void Insert(Seqlist* pSeq, size_t pos, Datatype x)//定點刪除{assert(pSeq);size_t i = 0;if (pSeq->size >= MAX_SIZE){printf("Array is full, insert the failure\n");return;}for (i = pSeq->size ; i > pos; i--){pSeq->array[i] = pSeq->array[i - 1];}pSeq->array[pos] = x;pSeq->size++;}int Find(Seqlist* pSeq, size_t pos, Datatype x)//尋找資料{assert(pSeq);size_t i = 0;if (pSeq->size <= 0){printf("Array is empty,erase error\n");return ARRAY_EMPTY;}if (pos < 0 || pos >= MAX_SIZE){printf("Began to find the position error\n");return -1;}for (i = pos; i < pSeq->size; i++){if (pSeq->array[i] == x){return i;}}return -2;}void Erase(Seqlist* pSeq, size_t pos)//刪除特定資料{assert(pSeq);size_t i = 0;if (pSeq->size <= 0){printf("Array is empty,erase error\n");return;}if (pos < 0 || pos >= MAX_SIZE){printf("Began to find the position error\n");return;}for (i = pos; i < pSeq->size; i++){pSeq->array[i] = pSeq->array[i + 1];}pSeq->size--;}int Remove(Seqlist* pSeq, Datatype x){assert(pSeq);size_t i = 0;if (pSeq->size <= 0){printf("Array is empt,remove error\n");return ARRAY_EMPTY;}for (; i < pSeq->size; i++){if (pSeq->array[i] == x){size_t j = i + 1;for (; j < pSeq->size; j++){pSeq->array[j - 1] = pSeq->array[j];}pSeq->size--;return 0;}}return -1;}int Removeall(Seqlist* pSeq, Datatype x){assert(pSeq);size_t i = 0;int flag = 0;if (pSeq->size <= 0){printf("Array is empt,remove error\n");return ARRAY_EMPTY;}for (; i < pSeq->size; i++){if (pSeq->array[i] == x){size_t j = i + 1;for (; j < pSeq->size; j++){pSeq->array[j - 1] = pSeq->array[j];}pSeq->size--;flag++;if (pSeq->size <= 0)//如果順序表的元素為空白就不能再刪除了,返回{return 0;}else{i--;}}}if (flag > 0)return 0;elsereturn -1;}void Bubblesort(Seqlist* pSeq)//冒泡排序{assert(pSeq);size_t i = 0;for (; i < pSeq->size; i++){size_t j = 0;for (; 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;}}}}void Selectsort(Seqlist* pSeq)//選擇排序{assert(pSeq);size_t i = 0;for (; i < pSeq->size; i++){int flag = pSeq->array[i];size_t j = i;for (; j < pSeq->size; j++){if (pSeq->array[j] < flag){int tmp = pSeq->array[j];pSeq->array[j] = flag;flag = tmp;}}pSeq->array[i] = flag;}}int BinarySearch(Seqlist* pSeq, Datatype x)//二分尋找{assert(pSeq);size_t left = 0;size_t right = pSeq->size - 1;while (left <= right){size_t mid = left + (right - left) / 2;if (x > pSeq->array[mid]){left = mid + 1;}else if (x < pSeq->array[mid]){right = mid - 1;}else if (x == pSeq->array[mid]){return (int)mid;}}return -1;}
這隻是最基本的順序表,只能夠儲存基本類型的資料,如果想要儲存結構體或者string之類的資料的話會涉及C++的深淺拷貝問題,而且用一個數組來存未知大小的資料結構的話是做不到的。
本人的部落格後面會更新順序表的一些最佳化寫法,希望對朋友微小的協助。
C語言實現順序表