线性表的链式存储结构(带头结点的单链表)

首先,我们定义带头节点的单链表存储结构如下:

1 /*
2 ** 线性表的单链表存储结构定义 */
3 typedef int ListElemType;//线性表数据元素类型
4 typedef struct tagLNode {
5     ListElemType data;
6     struct tagLNode *next;
7 }LNode, *LinkList;

在此基础上可以执行的基本操作如下:

 1 #include "linklist_algo.h"
 2 #include <stdlib.h>
 3 
 4 /*
 5 ** 初始化单链表
 6 */
 7 void LinkList_Init(LinkList *list)
 8 {
 9     *list = (LinkList)malloc(sizeof(LNode));
10     if (!*list) exit(EXIT_FAILURE);
11     (*list)->data = 0;
12     (*list)->next = NULL;//头结点的指针域为空
13 }
14 
15 /*
16 ** 插入
17 */
18 int LinkList_Insert(LinkList list, int index, ListElemType e)
19 {
20     int i = 0;//计数器初值为0
21     LinkList node = NULL, p = list;//p指向头结点
22     while (p && i < index-1){//寻找第iindex-1个结点
23         i++; p = p->next;
24     }
25     if (i > index-1 || !p) return 0;//第index-1个结点不存在
26     node = (LinkList)malloc(sizeof(LNode));
27     if (!node) return -1;
28     //在第index元素之前插入新结点
29     node->data = e;
30     node->next = p->next;
31     p->next = node;
32     return 1;
33 }
34 
35 /*
36 ** 读取元素
37 */
38 int LinkList_GetElem(LinkList list, int index, ListElemType *elem)
39 {
40     int i = 1;//计数器初始化为1
41     LinkList p = list->next;//p指向第1个结点
42     while (p && i < index){//寻找第index个结点
43         i++; p = p->next;
44     }
45     if (!p || i > index) return 0;
46     *elem = p->data;
47     return 1;
48 }
49 
50 /*
51 ** 删除
52 */
53 int LinkList_Delete(LinkList list, int index, ListElemType *e)
54 {
55     int i = 0;//计数器初值为0
56     LinkList q, p = list;//p指向头结点
57     while (p->next && i < index-1){
58         i++; p = p->next;//寻找第index-1个结点
59     }
60     if (i > index-1 || !p->next) return 0;//删除位置不合法
61     q = p->next;//q指向待删除结点,p指向待删除结点的前驱
62     *e = q->data;
63     p->next = q->next;//断开待删除结点与线性表的连接
64     free(q);//释放被删除结点的内存
65     return 1;
66 }

最后,附上测试程序:

 1 #include <stdio.h>
 2 #include "linklist_algo.h"
 3 
 4 void visit(ListElemType e)
 5 {
 6     printf(" %d ", e);
 7 }
 8 
 9 int compare(ListElemType e1, ListElemType e2)
10 {
11     if (e1 == e2) return 1;
12     return 0;
13 }
14 
15 //For Test
16 int main(int argc, char **argv)
17 {
18     LinkList List;
19     ListElemType e;
20     int i = 0, index;
21     
22     LinkList_Init(&List);//初始化空表
23     //插入元素
24     LinkList_Insert(List, 1, 11);
25     LinkList_Insert(List, 2, 22);
26     LinkList_Insert(List, 1, 33);
27     //读取元素
28     if (LinkList_GetElem(List, 2, &e)){
29         printf("Get 2-th Element : %d
", e);
30     }
31     //删除结点
32     if (LinkList_Delete(List, 3, &e)){
33         printf("Delete 3rd : %d
", e);
34     }
35 
36     return 0;
37 }
原文地址:https://www.cnblogs.com/xiaomanon/p/4509981.html