当前位置:   article > 正文

[数据结构]:17-双链表(带头结点)(C语言实现)_带头结点头文件c语言

带头结点头文件c语言

目录

前言

已完成内容

双链表实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-LinkedListCommon.cpp

04-LinkedListFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

双链表实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        ​​​        

03-代码

01-主函数

        用于测试双链表。

  1. #include "./Head/LinkedListData.h"
  2. #include "./Source/LinkedListCommon.cpp"
  3. #include "./Source/LinkedListFunction.cpp"
  4. int main() {
  5. LinkedList L;
  6. InitLinkedList(L);
  7. // 为方便测试,这里选择使用数组形式创建单链表
  8. int array[MaxSize] = {1, 2, 3, 4, 5, 6, 0};
  9. int select = 0;// 0表示头插法创建;1表示尾插法创建
  10. LinkedListCreate(L, array, select);
  11. LinkedListPrint(L);
  12. printf("-----------------------------\n");
  13. // 增删改查
  14. // 查找
  15. LNode *CurrentNode;
  16. LinkedListSearch(L, 2, CurrentNode);
  17. printf("CurrentNode Value = %d\n", CurrentNode->data);
  18. printf("-----------------------------\n");
  19. // 插入
  20. LinkedListInsert(L, 2, 20);
  21. LinkedListPrint(L);
  22. printf("-----------------------------\n");
  23. // 删除
  24. bool flag = LinkedListDelete(L, 7);
  25. if (flag) {
  26. printf("true\n");
  27. } else {
  28. printf("false\n");
  29. }
  30. LinkedListPrint(L);
  31. printf("-----------------------------\n");
  32. // 修改
  33. LinkedListModify(L, 3, 90);
  34. LinkedListPrint(L);
  35. printf("-----------------------------\n");
  36. return 0;
  37. }

02-头文件

        用于存储结构体和常量等。

  1. //
  2. // Created by 24955 on 2023-02-22.
  3. //
  4. #ifndef LINKEDLIST_LINKEDLISTDATA_H
  5. #define LINKEDLIST_LINKEDLISTDATA_H
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. // 常量
  10. #define MaxSize 50
  11. typedef int ElemType;
  12. // 结构体
  13. typedef struct Node {
  14. ElemType data;
  15. struct Node *prior, *next;
  16. } LNode, *LinkedList;
  17. #endif //LINKEDLIST_LINKEDLISTDATA_H

03-LinkedListCommon.cpp

        用于存储双链表初始化和打印输出等公用函数。

  1. //
  2. // Created by 24955 on 2023-02-22.
  3. // 带头结点(第一个元素值域不存值)
  4. //
  5. // 初始化双链表
  6. void InitLinkedList(LinkedList &List) {
  7. List = (LNode *) malloc(sizeof(LNode));
  8. List->prior = NULL;
  9. List->next = NULL;
  10. }
  11. // 后插操作
  12. void BackWordInsert(LNode *&LN, ElemType InsertValue) {
  13. LNode *NewNode = (LNode *) calloc(1, sizeof(LNode));
  14. NewNode->data = InsertValue;
  15. if (LN->next != NULL) {
  16. // 尾部插入时不需要链接新结点next部分
  17. NewNode->next = LN->next;
  18. LN->next->prior = NewNode;
  19. }
  20. NewNode->prior = LN;
  21. LN->next = NewNode;
  22. }
  23. // 头插法创建双链表
  24. void LinkedListHeadCreate(LinkedList &List, int array[]) {
  25. /*
  26. * 1. 初始化新结点
  27. * 2. 先链接新结点next部分
  28. * 3. 再链接新结点prior部分*/
  29. for (int i = 0; array[i]; i++) {
  30. BackWordInsert(List, array[i]);
  31. }
  32. }
  33. // 尾插法创建双链表
  34. void LinkedListTailCreate(LinkedList &List, int array[]) {
  35. /*
  36. * 1. 初始化新结点
  37. * 2. 先链接新结点next部分
  38. * 3. 再链接新结点prior部分*/
  39. LinkedList tailPointer;
  40. tailPointer = List;
  41. for (int i = 0; array[i]; i++) {
  42. BackWordInsert(tailPointer, array[i]);
  43. // 修改尾指针指向
  44. tailPointer = tailPointer->next;
  45. }
  46. }
  47. // 创建模式选择函数
  48. void LinkedListCreate(LinkedList &List, int array[], int HeadTail) {
  49. /*
  50. * 1. 选择创建双链表的模式
  51. * 2. 调用相应函数创建双链表*/
  52. if (HeadTail == 0) {
  53. LinkedListHeadCreate(List, array);
  54. } else {
  55. LinkedListTailCreate(List, array);
  56. }
  57. }
  58. // 打印输出函数
  59. void LinkedListPrint(LinkedList List) {
  60. List = List->next;
  61. while (List) {
  62. printf("%3d", List->data);
  63. List = List->next;
  64. }
  65. printf("\n");
  66. }

04-LinkedListFunction.cpp

        用于存储双链表增删改查等操作。

  1. //
  2. // Created by 24955 on 2023-02-22.
  3. // 带头结点(第一个元素值域不存值)
  4. //
  5. // 按位置查找,并返回查找到的值
  6. void LinkedListSearch(LinkedList List, int position, LNode *&CurrentNode) {
  7. /*
  8. * 1. 判断位置是否合法,单链表是否创建
  9. * 2. 将制定定位到指定位置
  10. * 3. 判断指针状态,并赋值或输出*/
  11. if (position > 0 && List) {
  12. for (int i = 0; i < position && List; i++) {
  13. List = List->next;
  14. }
  15. // 获取所给位置结点
  16. CurrentNode = List;
  17. }
  18. }
  19. // 按位置插入元素
  20. void LinkedListInsert(LinkedList List, int position, ElemType InsertValue) {
  21. /*
  22. * 1. 定位到插入位置前一个指针处
  23. * 2. 判断指针状态并插入元素*/
  24. LNode *CurrentNode;
  25. if (position > 0 && List) {
  26. // 获取要插入结点的前驱结点
  27. LinkedListSearch(List, position - 1, CurrentNode);
  28. // 在该节点后面插入元素
  29. BackWordInsert(CurrentNode, InsertValue);
  30. }
  31. }
  32. // 按位置删除元素
  33. bool LinkedListDelete(LinkedList List, int position) {
  34. /*
  35. * 1. 定位到要删除位置前一个结点出
  36. * 2. 定义新指针并指向要删除元素
  37. * 3. 若要删除元素非NULL,则获取当前元素指针域并释放当前元素*/
  38. if (position > 0 && List) {
  39. LNode *PriorNode, *CurrentNode;
  40. LinkedListSearch(List, position - 1, PriorNode);
  41. // 需要删除的当前结点
  42. CurrentNode = PriorNode->next;
  43. // 修改指针
  44. PriorNode->next = CurrentNode->next;
  45. if (CurrentNode->next != NULL) {
  46. CurrentNode->next->prior = PriorNode;
  47. }
  48. free(CurrentNode);
  49. return true;
  50. } else {
  51. return false;
  52. }
  53. }
  54. // 按位置修改元素
  55. void LinkedListModify(LinkedList List, int position, ElemType modifyValue) {
  56. /*
  57. * 1. 定位到要修改位置获取其指针
  58. * 2. 修改元素值*/
  59. if (position > 0 && List) {
  60. LNode *CurrentNode;
  61. LinkedListSearch(List, position, CurrentNode);
  62. if (CurrentNode) {
  63. CurrentNode->data = modifyValue;
  64. }
  65. }
  66. }

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

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

闽ICP备14008679号