c语言动态实现顺序表

来源:互联网 发布:深圳正规软件培训 编辑:程序博客网 时间:2024/06/01 10:11

之前写到过c语言静态顺序表,接着我们来实现动态的顺序表

我们先来分析下这两者的不同

静态顺序表:结构体只需两个成员,其中一个固定大小的数组(MAX)的数组,用来存放我们的数据。当数据增多时,可以通过改变数组大小而存                                                                                  放更多数据。

动态顺序表:在内存中开辟一块空间,可以随着我们数据数量的增多来扩容。

接着来看代码:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<assert.h>#define MAX 3//最开始开辟可存放MAX个数据的空间#define INCS 2//每次增容的大小typedef int DataType;typedef struct SeqList{DataType*data;int capacity;int sz;}Seqlist, *pSeqList;void InitSeqList(pSeqList ps)//先开辟一块空间并且初始化{ps->data = (DataType*)malloc(MAX*sizeof(DataType));if (ps->data == NULL){perror("malloc");exit(EXIT_FAILURE);}memset(ps->data, 0, MAX*sizeof(DataType));ps->sz = 0;ps->capacity = MAX;}void Check(pSeqList ps)//检查是否要增容{assert(ps != NULL);if (ps->sz == ps->capacity){DataType*tmp = (DataType*)realloc(ps->data, (ps->capacity + INCS)*sizeof(DataType));if (tmp == NULL){perror("realloc");exit(EXIT_FAILURE);}ps->data = tmp;ps->capacity += INCS;}}void PushBack(pSeqList ps, DataType x){assert(ps != NULL);Check(ps);ps->data[ps->sz] = x;ps->sz++;}void PrintSeqList(pSeqList ps)//打印{assert(ps != NULL);if (ps->sz == 0){return;}int i = 0;for (i = 0; i < ps->sz; i++){printf("%d", ps->data[i]);}printf("\n");}void PopBack(pSeqList ps)//尾部删除{assert(ps != NULL);if (ps->sz == 0){return;}ps->sz--;}void PushFront(pSeqList ps, DataType x)//头插{assert(ps != NULL);Check(ps);memmove(ps->data + 1, ps->data, (ps->sz)*sizeof(DataType));ps->data[0] = x;ps->sz++;}void PopFront(pSeqList ps)//头删{assert(ps != NULL);if (ps->sz == 0){return;}memmove(ps->data, ps->data + 1, (ps->sz - 1)*sizeof(DataType));ps->sz--;}void Insert(pSeqList ps, int pos, DataType x)//指定位置插入{assert(ps != NULL);Check(ps);memmove(ps->data + pos + 1, ps->data + pos, (ps->sz - pos)*sizeof(DataType));ps->data[pos] = x;ps->sz++;}int Find(pSeqList ps, DataType x)//查找某指定值元素{assert(ps != NULL);if (ps->sz == 0){return -1;}int i = 0;for (i = 0; i < ps->sz; i++){if (ps->data[i] == x){return i;}}return -1;}void Remove(pSeqList ps, DataType x)//删除某指定指定值元素{int ret = -1;assert(ps != NULL);if (ps->sz == 0){return;}ret = Find(ps, x);if (ret != -1){memmove(ps->data + ret, ps->data + ret + 1, (ps->sz - ret - 1)*sizeof(DataType));ps->sz--;}}void RemoveAll(pSeqList ps, DataType x)//删除某指定值所有元素{assert(ps != NULL);if (ps->sz == 0){return;}int i = 0;for (i = 0; i < ps->sz; i++){if (x == ps->data[i]){memmove(ps->data + i, ps->data + i + 1, (ps->sz - i - 1)*sizeof(DataType));ps->sz--;i--;}}}void ReverseList(pSeqList ps)//逆序{int left = 0;int right = ps->sz - 1;assert(ps != NULL);if (ps->sz == 0){return;}while (left < right){int tmp = ps->data[left];ps->data[left] = ps->data[right];ps->data[right] = tmp;left++;right--;}}int BinarySearch(pSeqList ps, DataType x)//二分查找{int left = 0;int right = ps->sz - 1;int mid = 0;assert(ps != NULL);while (left <right){mid = left + (right - left) / 2;if (ps->data[mid] < x){left = mid + 1;}else if (ps->data[mid] > x){right = mid - 1;}else{return mid;}}return -1;}void SortList(pSeqList ps)//排序{int i = 0;int j = 0;assert(ps != NULL);if (ps->sz == 0){return;}for (i = 0; i < ps->sz - 1; i++){for (j = 0; j < ps->sz - i - 1; j++){if (ps->data[j]>ps->data[j + 1]){int tmp = ps->data[j];ps->data[j] = ps->data[j + 1];ps->data[j + 1] = tmp;}}}}void Distory(pSeqList ps)//释放动态开辟的内存{assert(ps != NULL);free(ps->data);ps->data = NULL;ps->sz = 0;ps->capacity = 0;}void test1(){SeqList plist;InitSeqList(&plist);PushBack(&plist, 1);PushBack(&plist, 2);PushBack(&plist, 3);PushBack(&plist, 4);PushBack(&plist, 5);PrintSeqList(&plist);PopBack(&plist);PrintSeqList(&plist);PopBack(&plist);PrintSeqList(&plist);PopBack(&plist);PrintSeqList(&plist);PopBack(&plist);PrintSeqList(&plist);PopBack(&plist);PrintSeqList(&plist);printf("\n");Distory(&plist);}void test2(){SeqList plist;InitSeqList(&plist);PushFront(&plist, 1);PrintSeqList(&plist);PushFront(&plist, 2);PushFront(&plist, 3);PushFront(&plist, 4);PushFront(&plist, 5);PrintSeqList(&plist);PopFront(&plist);PrintSeqList(&plist);PopFront(&plist);PrintSeqList(&plist);PopFront(&plist);PrintSeqList(&plist);PopFront(&plist);PrintSeqList(&plist);PopFront(&plist);PrintSeqList(&plist);printf("\n");Distory(&plist);}void test3(){SeqList plist;InitSeqList(&plist);PushFront(&plist, 1);PushFront(&plist, 2);PushFront(&plist, 3);PushFront(&plist, 4);PushFront(&plist, 5);Insert(&plist, 2, 6);PrintSeqList(&plist);printf("\n");Distory(&plist);}void test4(){SeqList plist;InitSeqList(&plist);PushBack(&plist, 1);PushBack(&plist, 2);PushBack(&plist, 2);PushBack(&plist, 4);PushBack(&plist, 2);PrintSeqList(&plist);RemoveAll(&plist, 2);PrintSeqList(&plist);printf("\n");Distory(&plist);}void test5(){SeqList plist;InitSeqList(&plist);PushBack(&plist, 1);PushBack(&plist, 2);PushBack(&plist, 3);PushBack(&plist, 4);PushBack(&plist, 5);PrintSeqList(&plist);int ret = Find(&plist, 2);printf("%d\n", ret);Remove(&plist, 3);PrintSeqList(&plist);printf("\n");Distory(&plist);}void test6(){SeqList plist;InitSeqList(&plist);PushBack(&plist, 1);PushBack(&plist, 3);PushBack(&plist, 5);PushBack(&plist, 4);PushBack(&plist, 2);PrintSeqList(&plist);SortList(&plist);PrintSeqList(&plist);Distory(&plist);ReverseList(&plist);PrintSeqList(&plist);Distory(&plist);printf("\n");Distory(&plist);}void test7(){SeqList plist;InitSeqList(&plist);PushBack(&plist, 1);PushBack(&plist, 2);PushBack(&plist, 3);PushBack(&plist, 4);PushBack(&plist, 5);int ret = BinarySearch(&plist, 4);printf("%d\n", ret);Distory(&plist);}int main(){test1();test2();test3();test4();test5();test6();test7();system("pause");return 0;}
运行结果:



原创粉丝点击