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;}运行结果:
阅读全文
0 0
- C语言实现动态顺序表
- c语言实现动态顺序表
- 利用C语言实现动态顺序表
- C语言实现动态顺序表
- c语言顺序表动态实现
- 动态顺序表----C语言实现
- C语言实现动态顺序表
- C语言动态顺序表的实现
- C语言实现动态顺序表
- C语言实现动态顺序表
- 动态顺序表(C语言实现)
- C语言实现动态顺序表
- c语言动态顺序表的实现
- C语言简单实现动态顺序表
- 【C语言】动态顺序表的实现
- 动态顺序表-c语言实现
- 【C语言】实现动态顺序表
- C语言实现动态顺序表
- caffemodel做分类所有类别得分一样的解决办法
- 【BZOJ2118】墨墨的等式
- ios-数据库基础
- C++并查集——通过一道实例说明
- springMVC自定义拦截器
- c语言动态实现顺序表
- echo ,print,print_r,var_dump有什么区别?
- Struts2 遍历输出WEB-INF文件目录,并提供下载功能
- noip 2015 T5 子串 字符串dp
- 自己写的ajax,网页奔溃
- BZOJ 1222 [HNOI2001]产品加工 动态规划
- NOIP2010关押罪犯——10.20晚间演说ADA
- hdu1503 Advanced Fruits【dp】【LCS】
- [INS-30502] No ASM disk group found.