动态顺序表的实现
来源:互联网 发布:加内特职业生涯总数据 编辑:程序博客网 时间:2024/06/06 00:39
上次实现静态的顺序表,今天我们来实现一下动态的顺序表(动态开辟内存空间)
SeqListD.h
#ifndef __SEQLISTD_H__#define __SEQLISTD_H__#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#define DEFAULT_SZ 2#define INC 2typedef int DataType;typedef struct SeqList{ DataType *data; int sz; int capacity; //容量}SeqList, *pSeqList; //pSeqList是SeqList*的重命名void InitSeqList(pSeqList ps); //初始化void Checkcapacity(pSeqList ps); //检查是否需要扩容void DestroySeqList(pSeqList ps); //销毁void PushBack(pSeqList ps, DataType d); //在尾部插入元素void PopBack(pSeqList ps); //在尾部删除元素void Display(const pSeqList ps); //打印void PushFront(pSeqList ps, DataType d); //在头部插入一个元素void PopFront(pSeqList ps); //在头部删除一个元素int Find(pSeqList ps, DataType d); //查找void Insert(pSeqList ps, DataType d, int pos); //在指定位置插入元素void Remove(pSeqList ps, DataType d); //删除指定的某个元素void RemoveAll(pSeqList ps, DataType d); //删除所有指定的某个元素void Reverse(pSeqList ps); //逆序void Sort(pSeqList ps); //排序int BinarySearch(pSeqList ps, DataType d); //二分查找#endif //__SEQLISTD_H__
SeqListD.c
#include "SeqListD.h"void InitSeqList(pSeqList ps)//初始化顺序表{ ps->sz = 0; ps->data = malloc(DEFAULT_SZ*sizeof(DataType)); if(ps->data == NULL) { perror("use malloc"); exit(EXIT_FAILURE); } memset(ps->data, 0, sizeof(ps->data)); ps->capacity = DEFAULT_SZ;}void Checkcapacity(pSeqList ps){ if(ps->sz == ps->capacity) { DataType *ptr = realloc(ps->data, sizeof(DataType)*(ps->capacity+INC)); if(ptr == NULL) { perror("use realloc"); exit(EXIT_FAILURE); } else { ps->data = ptr; } ps->capacity += INC; }}void DestroySeqList(pSeqList ps){ free(ps->data); ps->data = NULL; ps->sz = 0; ps->capacity = 0;}void PushBack(pSeqList ps, DataType d){ assert(ps != NULL); Checkcapacity(ps); ps->data[ps->sz] = d; ps->sz++;}void PopBack(pSeqList ps){ assert(ps != NULL); if(ps->sz == 0) { return; } ps->sz--;}void PushFront(pSeqList ps, DataType d){ int i = 0; assert(ps != NULL); Checkcapacity(ps); //if(ps->sz < MAX) //{ memmove(ps->data+1,ps->data,sizeof(DataType)*(ps->sz)); /*for(i=ps->sz;i>0;i--) { ps->data[i] = ps->data[i-1]; }*/ ps->data[0] = d; ps->sz++; //}}void PopFront(pSeqList ps){ int i = 0; assert(ps != NULL); if(ps->sz == 0) { return; } for(i=0;i<ps->sz-1;i++) { ps->data[i] = ps->data[i+1]; } ps->sz--;}int Find(pSeqList ps, DataType d)//遍历查找{ int i = 0; assert(ps != NULL); for(i=0; i<ps->sz; i++) { if(d == ps->data[i]) return i; } return -1;}void Insert(pSeqList ps, DataType d, int pos)//在指定位置插入元素{ int i = 0; assert(ps != NULL); Checkcapacity(ps); /*if(ps->sz == MAX) { return; }*/ for(i=ps->sz;i>pos;i--) { ps->data[i] = ps->data[i-1]; } ps->data[pos] = d; ps->sz++;}void Remove(pSeqList ps, DataType d) //删除指定元素{ int pos = 0; assert(ps != NULL); if(ps->sz == 0); { return; } pos = Find(ps, d); if(pos != -1) { memmove(ps->data+pos, ps->data+pos+1, (ps->sz-pos-1)*sizeof(DataType)); ps->sz--; }}void RemoveAll(pSeqList ps, DataType d){ int pos = 0; assert(ps != NULL); while(pos = Find(ps, d) != -1) { Remove(ps, d); }}void Reverse(pSeqList ps) //逆序{ DataType *left = ps->data; DataType *right = ps->data + ps->sz - 1; assert(ps != NULL); while(left<right) { DataType tmp = *left; *left = *right; *right = tmp; *left++; *right--; }}void Sort(pSeqList ps) //排序(冒泡法){ int i = 0; int j = 0; assert(ps != NULL); for(i=0; i<ps->sz-1; i++) { for(j=0; j<ps->sz-1-i; j++) { if(ps->data[j] > ps->data[j+1]) { DataType tmp = ps->data[j]; ps->data[j] = ps->data[j+1]; ps->data[j+1] = tmp; } } }}int BinarySearch(pSeqList ps, DataType d) //二分查找(找到返回数字的下标,找不到返回-1){ int left = 0; int right = ps->sz; int mid = left+((right - left)>>1); while(left <= right) { if(ps->data[mid]<d) { left = mid + 1; } else if(ps->data[mid]>d) { right = mid - 1; } else if(d == ps->data[mid]) { return mid; } } return -1;}void Display(const pSeqList ps){ int i = 0; assert(ps != NULL); for(i=0;i<ps->sz;i++) { printf("%d ",ps->data[i]); } printf("\n");}
测试
test.c
#include "SeqListD.h"void test1(){ SeqList my_list; InitSeqList(&my_list); PushBack(&my_list, 1); PushBack(&my_list, 2); PushBack(&my_list, 3); PushBack(&my_list, 4); Display(&my_list); PopBack(&my_list); Display(&my_list); DestroySeqList(&my_list);}void test2(){ SeqList my_list; InitSeqList(&my_list); PushFront(&my_list, 1); PushFront(&my_list, 2); PushFront(&my_list, 3); PushFront(&my_list, 4); Display(&my_list); PopFront(&my_list); Display(&my_list); PopFront(&my_list); Display(&my_list); DestroySeqList(&my_list);}void test3(){ int pos = 0; SeqList my_list; InitSeqList(&my_list); PushFront(&my_list, 1); PushFront(&my_list, 2); PushFront(&my_list, 3); PushFront(&my_list, 4); pos = Find(&my_list, 1); if(pos == -1) { printf("要查找的元素不存在\n"); } else { Insert(&my_list, 6, pos); } Display(&my_list); DestroySeqList(&my_list);}void test4(){ int pos = 0; SeqList my_list; InitSeqList(&my_list); PushFront(&my_list, 1); PushFront(&my_list, 2); PushFront(&my_list, 3); PushFront(&my_list, 4); pos = Find(&my_list, 6); if(pos == -1) { printf("要查找的元素不存在\n"); } else { Remove(&my_list,pos); } Display(&my_list); DestroySeqList(&my_list);}void test5(){ int pos = 0; SeqList my_list; InitSeqList(&my_list); PushFront(&my_list, 3); PushFront(&my_list, 2); PushFront(&my_list, 3); PushFront(&my_list, 4); PushFront(&my_list, 3); PushFront(&my_list, 1); pos = Find(&my_list, 3); if(pos == -1) { printf("要查找的元素不存在\n"); } else { RemoveAll(&my_list,pos); } Display(&my_list); DestroySeqList(&my_list);}void test(){ int pos = 0; SeqList my_list; InitSeqList(&my_list); PushFront(&my_list, 3); PushFront(&my_list, 2); PushFront(&my_list, 3); PushFront(&my_list, 4); PushFront(&my_list, 3); PushFront(&my_list, 1); Display(&my_list); Reverse(&my_list); Display(&my_list); Sort(&my_list); Display(&my_list); pos = BinarySearch(&my_list, 4); printf("%d\n",pos); DestroySeqList(&my_list);}int main(){ test1(); return 0;}
注:malloc开辟一块空间之后要记得去释放所开辟的空间,并制空
若mslloc开辟的空间不够用时用realloc函数去重新开辟新空间。
今天就到这,谢谢阅读!
阅读全文
0 0
- 顺序表的动态实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态实现顺序表
- 实现动态顺序表
- 动态顺序 线性表 的实现源码
- 线性表的动态顺序存储实现
- 数据结构—动态顺序表的实现
- 动态顺序表的功能实现
- 简单的动态顺序表实现
- 线性表的动态顺序存储实现
- c::动态顺序表的简单实现
- 顺序表的静态和动态实现
- 退了实验室之后的生活
- 图片在块级元素中的对齐问题(取消图片在垂直和水平方向上的空隙)
- HDU 6043 KazaQ's Socks【规律】
- Mac下的解压命令
- 使用wsimport生成客户端java类
- 动态顺序表的实现
- 嵌入式Linux驱动笔记(七)------浅析tty与uart框架
- 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
- Activiti教学项目Lemon OA
- poj2828(线段树单点更新)
- 1、指针与递归
- SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
- TextView中android:textIsSelectable属性的坑
- 报错Can't find bundle for base name ClientMessages, locale zh_CN