发布时间:2020-09-29 10:06 原文链接: 超详细的单链表学习教程(三)

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");