100// 要删除的节点的前一个节点和它的后一个节点相连,这样就把要删除的节点给摘出来了
101 free(p);
102 }
103 // 处理完成之后退出程序
104 return 0;
105 }
106}
107// 到这里还没找到,说明链表中没有我们想要的节点
108printf("没找到这个节点.n");
109return -1;
110}
111int main(void)
112{
113 // 定义头指针
114 //struct node *pHeader = NULL;
115 // 这样直接insert_tail会段错误。
116 struct node *pHeader = create_node(0);
117 insert_head(pHeader, create_node(11));
118 insert_head(pHeader, create_node(12));
119 insert_head(pHeader, create_node(13));
120 // 访问链表头节点的有效数据
121 printf("beader node data: %d.n", pHeader->data);
122 bianli(pHeader);
123delete_node(pHeader, 12);
124printf("------------------删除后-------------n");
125bianli(pHeader);
126 return 0;
127 }
编译结果:
1root@ubuntu-virtual-machine:/mnt/hgfs/day# gcc flie1.c
2root@ubuntu-virtual-machine:/mnt/hgfs/day# ./a.out
3beader node data: 3.
4-----------开始遍历-----------
5node data: 13.
6node data: 12.
7node data: 11.
8------------完了-------------
9------------------删除后-------------
10-----------开始遍历-----------
11node data: 13.
12node data: 11.
13-------------完了-------------
三、链表的逆序:
1、什么叫链表的逆序?
链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来。
2、怎样实现链表的逆序?
首先遍历原链表,然后将原链表中的头指针和头节点作为新链表的头指针和头节点,原链表中的有效节点挨个依次取出来,采用头插入的方法插入新链表中即可。
3、实战代码演示:
1 #include <stdio.h>
2 #include <strings.h>
3 #include <stdlib.h>
4// 构建一个链表的节点
5struct node
6 {
7 int data;
8 // 有效数据
9 struct node *pNext; // 指向下一个节点的指针
10 };
11 // 作用:创建一个链表节点
12 // 返回值:指针,指针指向我们本函数新创建的一个节点的首地址
13 struct node * create_node(int data)
14 {
15 struct node *p = (struct node
16 *)malloc(sizeof(struct node));
17 if (NULL == p)
18 {
19 printf("malloc error.n");
20 return NULL;
21 }
22 // 清理申请到的堆内存
23 bzero(p, sizeof(struct node));
24 // 填充节点
25 p->data = data;
26 p->pNext = NULL;
27 return p;
28}
29// 计算添加了新的节点后总共有多少个节点,然后把这个数写进头节点中。
30 void insert_tail(struct node *pH, struct node *new)
31{
32 int cnt = 0;
33 // 分两步来完成插入
34 // 第一步,先找到链表中最后一个节点
35 struct node *p = pH;
36 while (NULL != p->pNext)
37 {
38 p = p->pNext; // 往后走一个节点
39 cnt++;
40 }
41 // 第二步,将新节点插入到最后一个节点尾部
42 p->pNext = new;
43 pH->data = cnt + 1;
44 }
45 void insert_head(struct node *pH, struct node *new)
46 {
47 // 第1步: 新节点的next指向原来的第一个节点
48 new->pNext = pH->pNext;
49 // 第2步: 头节点的next指向新节点的地址
50 pH->pNext = new;
51 // 第3步: 头节点中的计数要加1
52 pH->data += 1;
53 }
54 // 遍历单链表,pH为指向单链表的头指针,遍历的节点数据打印出来
55 void bianli(struct node*pH)
56 {
57 //pH->data // 头节点数据,不是链表的常规数据,不要算进去了
58 //struct node *p = pH; // 错误,因为头指针后面是头节点
59 struct node *p = pH->pNext; // p直接走到第一个节点
60 printf("-----------开始遍历-----------n");
61 // 是不是最后一个节点
62 while (NULL != p->pNext)
63 {
64 printf("node data: %d.n", p->data);
65 p = p->pNext;
66 // 走到下一个节点,也就是循环增量
67 }
68 printf("node data: %d.n", p->data);
69 printf("-------------完了-------------n");