本科课程【数据结构与算法】实验2——单链表与双向循环链表的插入、删除操作(C++实现)

x33g5p2x  于2022-03-01 转载在 C/C++  
字(5.0k)|赞(0)|评价(0)|浏览(660)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

  1. 掌握线性表的链表表示;
  2. 实现单链表的插入操作
  3. 实现单链表的删除操作
  4. 实现双向链表的插入操作
  5. 实现双向链表的删除操作

二、 实验内容

1. 实验任务

a. 完成单链表的建立、插入和删除
b. 完成双向链表的建立、插入和删除

2. 程序设计

1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
节点个数:count;
节点元素值:temp;
要插入节点的位置和数值:num1、Data;
要删除节点的位置:num2;
2) 数据存储(输入数据在内存中的存储)
动态分配内存(pNode pNew = (pNode)malloc(sizeof(Node));)
3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)

4) 数据输出(贴图:程序运行结果截图。图幅大小适当,不能太大)

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:VC++ 2013
  3. 实验设备:PC

四、源代码

1. 单链表的插入删除操作

  • pNode CreatList(); //创建链表函数
  • void TravelseList(pNode); //遍历链表函数
  • bool Insert_Node(pNode, int, int); //插入节点
  • int Del_Node(pNode, int); //删除节点
  1. #include<iostream>
  2. using namespace std;
  3. typedef struct node
  4. {
  5. int data;
  6. struct node *pNext;
  7. }Node, *pNode;
  8. pNode CreatList(); //创建链表函数
  9. void TravelseList(pNode); //遍历链表函数
  10. bool Insert_Node(pNode, int, int); //插入节点
  11. int Del_Node(pNode, int); //删除节点
  12. int main()
  13. {
  14. pNode pHead = NULL; //struct Node *pHead=NULL
  15. int Data;
  16. int num;
  17. pHead = CreatList();
  18. TravelseList(pHead);
  19. cout << "输入要插入的位置和数据:";
  20. cin >> num >> Data;
  21. Insert_Node(pHead, num, Data);
  22. TravelseList(pHead);
  23. cout << "输入要删除的位置:";
  24. cin >> num;
  25. Del_Node(pHead, num);
  26. TravelseList(pHead);
  27. system("pause");
  28. return 0;
  29. }
  30. //创建链表
  31. pNode CreatList()
  32. {
  33. int count; //节点个数
  34. int temp; //临时存储用户输入的节点的数据
  35. pNode pHead = (pNode)malloc(sizeof(Node)); //不存放有效数据的头结点
  36. pNode pTail = pHead; //链表的最后一个节点
  37. pTail->pNext = NULL; //最后一个节点指针置为空
  38. cout << "输入节点个数" << endl;
  39. cin >> count;
  40. for (int i = 0; i < count; i++)
  41. {
  42. cout << "输入第" << i + 1 << "个节点的数值" << endl;
  43. cin >> temp;
  44. pNode pNew = (pNode)malloc(sizeof(Node)); //给新节点分配空间
  45. pNew->data = temp;
  46. pTail->pNext = pNew;
  47. pNew->pNext = NULL;
  48. pTail = pNew;
  49. }
  50. return pHead;
  51. }
  52. void TravelseList(pNode pHead)
  53. {
  54. cout << "链表的数据如下:";
  55. pNode p = pHead->pNext;
  56. while (p != NULL)
  57. {
  58. cout << p->data << " ";
  59. p = p->pNext;
  60. }
  61. cout << endl;
  62. return;
  63. }
  64. //插入
  65. bool Insert_Node(pNode pHead, int front, int Data)
  66. {
  67. int i = 0;
  68. pNode _node = pHead;
  69. pNode pSwap; //交换指针
  70. if ((front < 1) && (_node != NULL))
  71. {
  72. return false;
  73. }
  74. while (i < front - 1)
  75. {
  76. _node = _node->pNext;
  77. ++i;
  78. }
  79. pNode pNew = (pNode)malloc(sizeof(Node));
  80. pNew->data = Data;
  81. pSwap = _node->pNext;
  82. pNew = _node->pNext;
  83. pSwap = pNew->pNext;
  84. return true;
  85. }
  86. //删除
  87. int Del_Node(pNode pHead, int back)
  88. {
  89. int i = 0;
  90. int Data;
  91. pNode _node = pHead;
  92. pNode pSwap;
  93. if ((back < 1) && (NULL == _node->pNext))
  94. {
  95. printf("删除失败!\n");
  96. return 0;
  97. }
  98. while (i < back - 1)
  99. {
  100. _node = _node->pNext;
  101. ++i;
  102. }
  103. pSwap = _node->pNext;
  104. Data = pSwap->data;
  105. _node->pNext = _node->pNext->pNext;
  106. free(pSwap);
  107. return Data;
  108. }

2. 双向循环链表的插入删除操作

头文件

  1. #ifndef _DOUBLELINKLIST_H_
  2. #define _DOUBLELINKLIST_H_
  3. //
  4. // 在此处包含 C 标准库头文件
  5. //
  6. #include <stdio.h>
  7. #include<malloc.h>
  8. //
  9. // 在此处包含其他头文件
  10. //
  11. //
  12. // 在此处定义数据结构
  13. //
  14. typedef int ElemType; // 链表中元素的类型
  15. typedef struct DuLNode {
  16. ElemType data; // 数据域
  17. struct DuLNode* prior; // 前趋指针
  18. struct DuLNode* next; // 后继指针
  19. }DuLinkList;
  20. //
  21. // 在此处声明函数
  22. //
  23. int InsertBefore(DuLinkList* pListHead, int i, ElemType Elem);
  24. int Delete(DuLinkList* pListHead, int i, ElemType* pElem);
  25. #endif /* _DOUBLELINKLIST_H_ */

cpp文件

  1. #include "DoubleLinkList.h"
  2. #include<iostream>
  3. using namespace std;
  4. int main(int argc, char* argv[])
  5. {
  6. int i;
  7. ElemType Elem;
  8. DuLinkList* pListHead; // 双向循环链表的表头指针,指向表头节点
  9. DuLinkList* pListNode; // 双向循环链表节点指针
  10. //
  11. // 初始化双向循环链表的表头节点
  12. //
  13. pListHead = (DuLinkList*)malloc(sizeof(DuLinkList));
  14. pListHead->prior = pListHead;
  15. pListHead->next = pListHead;
  16. //
  17. // 初始化双向循环链表的节点
  18. //
  19. for (i = 8; i>0; i--)
  20. {
  21. pListNode = (DuLinkList*)malloc(sizeof(DuLinkList));
  22. pListNode->data = i;
  23. pListNode->next = pListHead->next;
  24. pListNode->prior = pListHead;
  25. pListHead->next->prior = pListNode;
  26. pListHead->next = pListNode;
  27. }
  28. //
  29. // 在第 i 个节点之前插入一个节点
  30. //
  31. InsertBefore(pListHead, 3, 88);
  32. InsertBefore(pListHead, 20, 15); // 插入位置非法。插入失败。
  33. //
  34. // 删除第 i 个节点
  35. //
  36. Delete(pListHead, 3, &Elem);
  37. Delete(pListHead, 20, &Elem); // 删除位置非法。删除失败。
  38. //
  39. // 销毁双向循环链表
  40. //
  41. while (pListHead->next != pListHead)
  42. {
  43. pListNode = pListHead->next;
  44. pListHead->next = pListNode->next;
  45. pListNode->next->prior = pListHead;
  46. free(pListNode);
  47. }
  48. free(pListHead);
  49. return 0;
  50. }
  51. /*
  52. 功能:
  53. 在第 i 个节点之前插入一个节点。
  54. 参数:
  55. pListHead -- 双向循环链表的表头指针
  56. i -- 插入节点的位置。从 1 开始计数。
  57. Elem -- 插入节点的值。
  58. 返回值:
  59. 如果插入成功返回 1
  60. 如果插入失败返回 0
  61. */
  62. int InsertBefore(DuLinkList* pListHead, int i, ElemType Elem)
  63. {
  64. DuLinkList* pListNode=NULL; // 节点指针
  65. //
  66. // TODO: 在此添加代码
  67. //
  68. if (i <= 0 && i > 8)
  69. cout << "插入非法" << endl;
  70. else
  71. {
  72. DuLinkList* s = (DuLinkList*)malloc(sizeof(DuLNode));
  73. s->data = Elem;
  74. s->prior = pListNode->prior;
  75. pListNode->prior->next = s;
  76. s->next = pListNode;
  77. pListNode->prior = s;
  78. }
  79. return 0;
  80. }
  81. /*
  82. 功能:
  83. 删除第 i 个节点。
  84. 参数:
  85. pListHead -- 双向循环链表的表头指针
  86. i -- 删除节点的位置。从 1 开始计数。
  87. pElem -- 返回被删除节点的值。
  88. 返回值:
  89. 如果删除成功返回 1
  90. 如果删除失败返回 0
  91. */
  92. int Delete(DuLinkList* pListHead, int i, ElemType* pElem)
  93. {
  94. DuLinkList* pListNode; // 节点指针
  95. //
  96. // TODO: 在此添加代码
  97. //
  98. if (i <= 0 && i > 8)
  99. cout << "插入非法" << endl;
  100. else
  101. {
  102. pElem = pListNode->data;
  103. pListNode->prior->next = pListNode->next;
  104. pListNode->next->prior = pListNode->prior;
  105. free(pListNode);
  106. }
  107. return 0;
  108. }

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

相关文章

最新文章

更多