顺序表

线性存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
typedef struct //初始化定义
{
int data[MAX]; //存储元素的数组
int length; //线性表当前的长度
} SeqList;

void initlist(SeqList *L) //初始化
{
L->length = 0; //初始化长度为0
}

int insertElement(SeqList *L, int pos, int elem) //进行插入操作 elem为插入的值 , pos为插入的位置
{
if (pos < 0 || pos > L->length || L->length >= MAX) //条件为:如果插入位置比0小
如果插入位置比数组长度大 如果已知数组长度比最大所开的数组长度还大
{
return -1; //插入位置不合法 或者 表已经满了
}
for (int i = L->length; i > pos; i--) // 从表的末尾开始一个一个往后移动
{
L->data[i] = L->data[i - 1]; // 将元素后移
}
L->data[pos] = elem; //插入元素
L->length++; //长度++
return 0; //插入成功
}

int deleteElement(SeqList *L, int pos)
{
if (pos < 0 || pos >= L->length) //删除的位置不合法 , 即删除的位置比0小 删除的位置比已知数组长度大
{
return -1;
}
for (int i = pos; i < L->length - 1; i++) //从被删除的位置一个一个往前移动,直到最后
{
L->data[i] = L->data[i + 1]; //元素前移
}
L->length--;
return 0; //删除成功
} //不得不吐槽一句,效率是真的低,但确实简单易懂

链式存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//链式存储
typedef struct Node
{
int data; //数据域
struct Node *next; //指针域
} Node, *LinkList;

void initList(LinkList *L) //初始化列表
{
*L = (LinkList)malloc(sizeof(Node)); //分配内存给头结点
(*L)->next = NULL; //初始化为空表
}

int insertElement(LinkList L, int pos, int elem) //插入
//其中L指的是一个指向链表头结点的指针、 pos 指的是要插入的新元素的位置 elem 指的是要插入到链表里的新元素的值
{
LinkList p = L;//将指针p初始化为链表的头节点L
int j = 0;//初始化计数器,用于跟踪当前节点的位置
while (p && j < pos) //找到插入位置
{
p = p->next;//移动指针p到下一个节点
j++;//增加计数器
}
if (!p || j > pos)
{
return -1; //插入位置不合法
}
LinkList s = (LinkList)malloc(sizeof(Node));//创建新的节点并插入
s->data = elem;//将要插入的元素elem值赋给新节点data域
s->next = p->next; //插入操作,将新节点的next指向下一节点,即插入位置后的节点
p->next = s;//将当前节点p的next指向新节点s,完成插入操作
return 0; // 插入成功
}

int deleteElement(LinkList L, int pos) //删除//逻辑同插入节点一样,不必赘述
{
LinkList p = L;
int j = 0;
while (p->next && j < pos) //找到删除的位置
{
p = p->next;
j++;
}
if (!p->next || j > pos) //删除位置不合法
{
return -1;
}
LinkList q = p->next;
p->next = q->next; // 删除操作
free(q); //将q清理
return 0; //删除成功
}