Github:(https://github.com/FlameCharmander/DataStructure)
线性表分为顺序表和链表。
以下是顺序表的实现,为了简单,没用考虑健壮性(没有对i的合法性进行判断等。)
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
#define INCREMENT 50
typedef int BOOL;
#define TRUE 1
#define FALSE 0
typedef 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就知道是否为空。