当前位置:   article > 正文

数据结构 --- c语言实现双向链表_c语言双向链表的代码

c语言双向链表的代码

双向链表的组成

双向链表主要分为三部分

  • 前项指针

  • 后项指针

  • 数据域

  • 一般情况下,创建单一个体,前项指针和后项指针都赋值为空

  • 一般采用记录头节点和记录尾节点,再封装的方式写双向链表

双向链表的结构体描述(节点)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. typedef struct Node
  5. {
  6. int data; //数据域
  7. struct Node* front; //前项指针
  8. struct Node* tail; //后项指针
  9. }NODE,*LPNODE;

再定义一个结构体(链表) 

  • 通过记录头节点和尾节点的方式去描述链表

  1. typedef struct DList
  2. {
  3. LPNODE frontNode; //头节点
  4. LPNODE tailNode; //尾节点
  5. int curSize; //当前节点个数
  6. }DLIST,*LPDLIST;

创建节点

把用户的数据变成一个结构体变量

  1. LPNODE createNode(int data)
  2. {
  3. //申请内存
  4. LPNODE newNode = (LPNODE)malloc(sizeof(NODE));
  5. //断言处理
  6. assert(newNode);
  7. //前项指针、后项指针置为空
  8. newNode->front = NULL;
  9. newNode->tail = NULL;
  10. //给数据做初始化
  11. newNode->data = data;
  12. return newNode;
  13. }

创建链表

  • 描述链表最初的状态

  1. LPDLIST createDList()
  2. {
  3. LPDLIST list = (LPDLIST)malloc(sizeof(DLIST)); //用结构体变量描述最初状态 做动态内存申请
  4. assert(list);
  5. list->frontNode = NULL; //链表刚开始是空的 头尾节点指向空
  6. list->tailNode = NULL;
  7. list->curSize = 0; //当前元素个数为0
  8. return list;
  9. }

头插法

①新节点的后项指针指向原来链表的头节点

②原来链表的头节点的前项指针指向新节点

③把原来的头节点移到新节点的位置

  1. //要插入的链表 插入的数据
  2. void push_front(LPDLIST list,int data)
  3. {
  4. //创建新节点
  5. LPNODE newNode = createNode(data);
  6. //list为空 没办法做插入
  7. if (list == NULL)
  8. return;
  9. //只有一个节点 插入的节点既是头节点也是尾节点
  10. if (list->curSize == 0)
  11. {
  12. //头节点和尾节点都是指向这个节点
  13. list->frontNode = newNode;
  14. list->tailNode = newNode;
  15. list->curSize++;
  16. }
  17. else
  18. {
  19. //新节点的后项指针指向原来链表的头节点
  20. newNode->tail = list->frontNode;
  21. //原来链表的头节点的前项指针指向新节点
  22. list->frontNode->front = newNode;
  23. //把原来的头节点移到新节点的位置
  24. list->frontNode = newNode;
  25. list->curSize++;
  26. }
  27. }
  28. //测试代码
  29. LPDLIST list = createDList();
  30. push_front(list, 1); //1
  31. push_front(list, 2); //2 1
  32. printByFront(list); //1 2 通过前项指针做打印 从后往前
  33. printByTail(list); //2 1 通过后项指针做打印 从前往后

打印链表

可以通过前项指针去做打印,也可以通过后项指针去做打印

通过前项指针做打印

从最后一个节点往前走,由于记录头节点和尾节点,所以就非常简单啦

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