[数据结构]顺序表的C语言简单实现
来源:互联网 发布:ps3下载版淘宝 编辑:程序博客网 时间:2024/04/29 06:21
线性表分为顺序表和链表。
以下是顺序表的实现,为了简单,没用考虑健壮性(没有对i的合法性进行判断等。)
#include <stdio.h>#include <stdlib.h>#define SIZE 100#define INCREMENT 50typedef int BOOL;#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct{ ElemType data[SIZE]; //元素数组 int length; //长度 int capacity; //容量}SqList;void InitList(SqList* list); //初始化顺序表BOOL Insert(SqList* list, ElemType e, int i); //插入BOOL Delete(SqList* list, ElemType e); //删除BOOL IsEmpty(SqList* list); //判断为空int main(){ SqList list; InitList(&list); printf("%d\n", IsEmpty(&list)); Insert(&list, 'a', 1); printf("%d\n", IsEmpty(&list)); Delete(&list, 'b'); printf("%d\n", IsEmpty(&list)); Delete(&list, 'a'); printf("%d\n", IsEmpty(&list)); return 0;}void InitList(SqList* list){ list->length = 0; list->capacity = SIZE;}BOOL Insert(SqList* list, ElemType e, int pos){ //pos的范围1<=pos<=n int i; ++list->length; for (i = list->length; i > pos-1; --i){ list->data[list->length] = list->data[list->length-1]; } list->data[pos-1] = e; return TRUE;}BOOL Delete(SqList* list, ElemType e){ int i, j; for (i = 0; i < list->length; ++i){ if (list->data[i] == e){ //找到该元素 for (j = i; j < list->length; ++j){ list->data[j] = list->data[j+1]; --list->length; return TRUE; } } } return FALSE;}BOOL IsEmpty(SqList* list){ if (list->length == 0) { return TRUE; } else { return FALSE; }}
这里我建议你打开两个窗口来讲下面的解释和代码一一对应来看。
Line 1~2 导入头文件
Line 4~5 数组的大小,以及增长的长度(这里我并没有用到,因为为了考虑健壮性)
Line 12~16 顺序表的数据结构,一个是元素数组,存放元素的,一个是顺序表的大小,一个是容量(数组有容量的大小,比如我们这里就分配了100个,超过了就会溢出,这时的解决办法就是重新分配一块更大的数组,这也就是上面增长长度的作用)。
Line 18~21 真实的一些操作远不止这些,说过了,这是简单实现,太多的代码很容易击退自信心,然后有注释,可以看一下
Line 23~35 主要是在main函数里,对表的操作进行测试
Line 37~39 为顺序表进行初始化,刚开始数组大小为0,然后容量是100
Line 42~50 这里注意,因为C语言里(包括很多别的类C语言)数组是从0开始的,而我们为了通用性,不考虑这些实现,所以那个pos的大小为1<=pos<=n,当把元素插入其中的位置时,我们需要后移元素(你们可以画个数组,比如现在有个顺序表是1 3 4 5 6,你们要元素10插入到2的位置时,先要把3 4 5 6后移,变成1 3 3 4 5 6,然后把第二个3换成10,最终形成1 10 3 4 5 6)。
Line 44 先把顺序表长度增加1位
Line 45~47 元素后移
Line 48 把插入的元素写到当前的位置,为什么是pos-1,说过了,数组是从0开始的,我们要插入第2个位置就是数组里面下标为1的那个位置。
Line 52~64 要删除顺序表的一个元素。思路就是先走到那个元素,还是刚才那个表(1 10 3 4 5 6),比如要删除3,只要找到3的位置,然后把4 5 6向前移动,变成(1 10 4 5 6 6 ),还有个6在数组怎么办,我们逻辑删除它,就是把顺序表的长度减少一位就可以了。
Line 54 循环,找到要删除的元素
Line 55 如果相等,说明找到了
Line 56~59 把元素向前移动,并且--list->length;
,把长度减少。并且返回真
Line 63 如果没找到要删除的元素,会执行这句代码,返回假
Line 66~72 判断顺序表的大小是否为0就知道是否为空。
- [数据结构]顺序表的C语言简单实现
- [c语言]数据结构 顺序表的实现
- C语言顺序表的简单实现
- 数据结构:顺序表的实现(C语言实现)
- <数据结构>顺序列表的C语言实现
- <数据结构>顺序栈的C语言实现
- 数据结构之---c语言实现线性表的顺序表
- C语言数据结构之:顺序表的实现
- 数据结构 顺序表的实现(C语言)
- c语言实现数据结构中顺序表的源代码
- C语言实现数据结构中的顺序表
- c语言实现数据结构顺序表源代码
- 数据结构C语言实现之顺序表
- 数据结构--顺序表c语言实现
- 【数据结构】C语言实现顺序表
- 【数据结构】C语言实现顺序链表
- 【数据结构】实现顺序表(c语言)
- 数据结构-队列-顺序表实现-C语言
- jenkins+docker 持续构建非docker in docker
- Vue学习日志:条件渲染(6)
- fork()函数
- 一个方法中多种不同返回结果形式
- windos下QT实现usb热插拔检测
- [数据结构]顺序表的C语言简单实现
- 11月16日云栖精选夜读:阿里云 oss JavaScript客户端签名文件上传 vue2.0
- Solr集群的搭建(solr集群架构 solr部分)
- IPSG
- 关于Fortify 代码安全扫描常见问题
- Sql Pivot行转列/列转行应用
- 1px边框问题和retina屏下的background-image
- 2017云栖社区之星评选暨年度颁奖盛典_投票即可参与抽奖
- fork遗留习题详解