当前位置:   article > 正文

C语言数据结构之单向链表_c语言用结构创建单向链表

c语言用结构创建单向链表

1、前言

数组和结构体作为编程常用的数据结构,在使用的时候最大的缺陷就需要一块连续的内存空间,并且声明的时候还需要指定好长度,指定多了浪费,指定少了又怕后面不够。所以,链表它来了!

2、结构介绍

单向链表通常由两部分组成,一部分是链表需要存储的数据,另一部分则是一个指针,该指针的作用是指向下一个节点,详细的结构如图所示:

单个链表节点的数据结构与结构体一样,不过链表中指向下个节点的指针是必不可少的,一个简单的链表节点数据结构如下:

  1. struct SingleList
  2. {
  3. int data;
  4. struct SingleList *next;
  5. };

 3、使用讲解

3.1 创建链表

创建链表就是创建链表的头结点,有了头结点之后就可以使用指针进行节点的添加和删除了,创建头结点的代码操作就是定义一个链表指针,然后malloc内存分配给该节点就可以了:

  1. SingleList * CreatList()
  2. {
  3. SingleList *pHead;
  4. pHead = (SingleList *)malloc(sizeof(SingleList));
  5. if (pHead == NULL)
  6. {
  7. return NULL;
  8. }
  9. else
  10. {
  11. pHead->next = NULL;
  12. }
  13. return pHead;
  14. }

3.2 节点添加

链表的节点可以在任意位置进行添加,可以选择将新加的节点添加到头部、尾部或者中间位置,进行头部插入节点时的数据结构变化如图所示:

在头部进行节点插入的代码示例如下:

  1. int InsertList(SingleList *pHead, int data)
  2. {
  3. SingleList *Next, *pList;
  4. pList = (SingleList *)malloc(sizeof(SingleList));
  5. if (pList == NULL)
  6. {
  7. return -1;
  8. }
  9. else
  10. {
  11. Next = pHead->next;
  12. pHead->next = pList;
  13. pList->next = Next;
  14. }
  15. pList->data = data;
  16. return 0;
  17. }

在中间位置进行节点插入后数据结构变化如图所示:

在中间位置可以指定第几个节点进行插入,也可以其它的方式,本文示例指定节点data值为Indata的节点后面进行插入:

  1. int MidInsertList(SingleList *pHead, int Indata, int data)
  2. {
  3. SingleList *Now, *Next, *pList;
  4. Now = pHead->next;
  5. while(Now != NULL)
  6. {
  7. if(Now->data == Indata)
  8. {
  9. pList = (SingleList *)malloc(sizeof(SingleList));
  10. if (pList == NULL)
  11. {
  12. return -1;
  13. }
  14. else
  15. {
  16. Next = Now->next;
  17. Now->next = pList;
  18. pList->next = Next;
  19. pList->data = data;
  20. }
  21. return 0;
  22. }
  23. Now = Now->next;
  24. }
  25. return -1;
  26. }

在尾部位置进行节点插入后数据结构变化如图所示,尾部插入的代码可以自行添加,不再多占篇幅。

3.3 节点删除

相对应节点添加,节点删除也可以从链表的任意位置进行删除,本文示例删除指定data值的节点,节点删除的本质是释放malloc申请的空间,节点2删除后链表结构变化如图所示:

 相应代码如下:

  1. int DelList(SingleList *pHead, int Indata)
  2. {
  3. SingleList *Now, *Next, *Last;
  4. Last = pHead;
  5. Now = pHead->next;
  6. while(Now != NULL)
  7. {
  8. if(Now->data == Indata)
  9. {
  10. Next = Now->next;
  11. // 释放当前节点
  12. free(Last->next);
  13. // 指向下一节点
  14. Last->next = Next;
  15. return 0;
  16. }
  17. Last = Now;
  18. Now = Now->next;
  19. }
  20. return -1;
  21. }

3.4 节点遍历

节点遍历的本质就是从头结点开始往后找,一直找到NULL为止结束,遍历节点并打印出data值的代码如下:

  1. void DisplayList(SingleList *pHead)
  2. {
  3. SingleList *Now;
  4. Now = pHead->next;
  5. printf("展示节点 Data:\n");
  6. while(Now != NULL)
  7. {
  8. printf("%d\n", Now->data);
  9. Now = Now->next;
  10. }
  11. printf("\n");
  12. }

4、简单测试

将上述代码和下面代码置于同一个.c文件中就可以测试了,测试代码如下:

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. SingleList *pHead;
  6. // 创建链表
  7. pHead = CreatList();
  8. // 使用头部插入方式插入节点,data值分别为1-2-3-4-5-6
  9. InsertList(pHead, 1);
  10. InsertList(pHead, 2);
  11. InsertList(pHead, 3);
  12. InsertList(pHead, 4);
  13. InsertList(pHead, 5);
  14. InsertList(pHead, 6);
  15. //data2的节点后面插入data100的节点
  16. MidInsertList(pHead, 2, 100);
  17. // 遍历节点data
  18. DisplayList(pHead);
  19. // 删除data值为5的节点
  20. DelList(pHead, 5);
  21. // 遍历节点data
  22. DisplayList(pHead);
  23. // 销毁节点
  24. DestoryList(pHead);
  25. return 0;
  26. }

测试结果如下:

完结!有帮助的话记得点赞呀~ 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/945179
推荐阅读
相关标签
  

闽ICP备14008679号