顺序表(C语言)

'''

1 .顺序表的概念及结构

在了解顺序表的概念前我们先来了解一个概念——线性表。

什么是线性表呢?线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...通俗一点,线性表在逻辑中是像线一样连续的,但它在物理结构上不一定连续,线性表在物理上存储时,通常以数组和链式结构的形式存储。

我们要讲的顺序表就是线性表的一种,它的底层是数组,所以顺序表的特点就是在逻辑上和物理结构上都连续。

'''

'''

2.顺序表的分类

1.顺序表和数组的区别在于,顺序表是对数组的分装,顺序表实现了常用的增删查改等接口。

2.顺序表分为两种,一种是静态顺序表,另一种是动态顺序表。

静态顺序表的结构(如图所示)

364bf947aadb45c29ff21b810f980438.png

静态顺序表使用的是定长数组结构 ,它有一个很明显的缺点,空间给少了不够用,给多了容易造成浪费,所以在现实生活中它的使用场景比较小。

我们的重点是了解动态数组为底层的动态顺序表。

动态顺序表

cac37918efaf4c3d930bf14c600fefae.png

以上就是动态顺序表的结构,首先是一个存放元素的动态数组a,其次是记录有效元素个数的size,再者就是用来记录总共开辟了多少内存空间的capacity 。那么我们如何用代码来实现顺序表的增删查改等内容呢?

'''

'''

3.动态顺序表的增删查改

首先,我们要来实现这么些个功能的话,最好让他们达到高内聚、低耦合的条件,简单的说,就是我们写的这些接口(函数)要有独立的功能,且相互之间要有联系。所以,我们用两个.c源文件和一个.h头文件来实现我们的动态顺序表。

我们的.h头文件是来进行我们的结构体和函数的声明的。

而我们的.c源文件是来进行接口的实现和测试接口的。

我们的.h头文件的内容就如下所示:

73cd007893654006a73d874997fdd018.png 

在.h头文件中我们要注意几点:

 1.我们的库函数的头文件最好写在我们的头文件中,因为我们的两个.c源文件到时候是需要调用SqList.h这个头文件的。

2.我们最好给我们的顺序表重命名,这样的好处是使我们在写的过程中可以节省时间。

接下来是我们接口实现的SqList.c源文件。

3b9ce0abf47e42e4a56894a161ab0111.png

6264233679094eeb9f5fc99fcc77c3fb.png 

940ceb1b57db4b249dd0a2668025428c.png 

97e83d81a9804f8785a9a0a292860574.png 

e0869810b852489aae64dda0a6ec4d17.png 

 这些接口的实现都相对轻松,我们最后再写一个.c源文件来测试就可以了。

7682add85fed4dc49c1a400da1685e2c.png

acc9e4606e8347388039c5625bd40562.png

这里要注意,我们传的是是顺序表的地址,因为我们是想改变顺序表,而如果我们不传地址的话,就无法改变顺序表本身,因为形参是实参的一份临时拷贝,,所以不会改变原来的顺序表。这种时候我们来传地址就可以修改顺序表了。

 我们最后再来看一下运行结果:

d9fd8f195d9847b6b4f800a065e60cb6.png

'''

 

 

 

 

 

 

顺序表是一种线性表,它的物理存储结构是连续的。在 C 语言中,可以用数组来实现顺序表。以下是一个简单的顺序表的 C 语言实现: ```c #include <stdio.h> #define MAXSIZE 100 // 定义顺序表的最大长度 typedef struct { int data[MAXSIZE]; // 存储数据元素的数组 int length; // 当前顺序表的长度 } SeqList; // 初始化顺序表 void InitList(SeqList *L) { L->length = 0; } // 获取顺序表中指定位置的元素 int GetElem(SeqList L, int i) { if (i < 1 || i > L.length) { printf("Error: index out of range.\n"); return -1; } return L.data[i-1]; } // 在顺序表中插入元素 void ListInsert(SeqList *L, int i, int e) { int j; if (L->length == MAXSIZE) { printf("Error: list is full.\n"); return; } if (i < 1 || i > L->length+1) { printf("Error: index out of range.\n"); return; } for (j = L->length; j >= i; j--) { L->data[j] = L->data[j-1]; } L->data[i-1] = e; L->length++; } // 删除顺序表中指定位置的元素 void ListDelete(SeqList *L, int i) { int j; if (i < 1 || i > L->length) { printf("Error: index out of range.\n"); return; } for (j = i; j < L->length; j++) { L->data[j-1] = L->data[j]; } L->length--; } // 输出顺序表中的元素 void PrintList(SeqList L) { int i; for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } int main() { SeqList L; InitList(&L); ListInsert(&L, 1, 1); ListInsert(&L, 2, 2); ListInsert(&L, 3, 3); ListInsert(&L, 4, 4); ListInsert(&L, 5, 5); PrintList(L); ListDelete(&L, 3); PrintList(L); printf("%d\n", GetElem(L, 2)); return 0; } ``` 在这个例子中,我们定义了一个结构体 `SeqList`,其中包含一个数组 `data` 和一个表示顺序表长度的变量 `length`。然后我们定义了一些操作函数来对顺序表进行初始化、插入、删除、获取元素和输出顺序表的元素。在 `main()` 函数中,我们创建了一个顺序表 `L`,并对它进行了一些操作,最后输出了结果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值