首页 > 编程 > C++ > 正文

C++双向循环列表用法实例

2020-05-23 14:18:24
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C++双向循环列表,实例分析了C++双向循环列表的创建、输出、添加、删除、移动的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C++双向循环列表用法。分享给大家供大家参考。具体如下:

 

 
  1. /*  
  2. 双向循环链表  
  3. */ 
  4. #include <iostream> 
  5. using namespace std; 
  6. //结构体构造链表的指针域和数据域 
  7. struct ChainNode 
  8. int data; //节点数据  
  9. ChainNode *left; //节点的前驱指针 
  10. ChainNode *right; //节点的后继指针  
  11. }; 
  12. ////////////创建n个双向循环链表 并返回链表头指针/////////  
  13. ChainNode* CreateNode(int n) 
  14. ChainNode *head = NULL; //链表头节点 
  15. ChainNode *pCur=NULL,*pNew=NULL; //当前节点,新建节点 
  16. //初始化头结点的前驱和后继节点都为NULL  
  17. if (n<1) //没有节点 返回头节点  
  18. return head;  
  19. }  
  20. //创建头节点并将器左右指针指向空  
  21. head = new ChainNode;  
  22. head->left = NULL; 
  23. head->right = NULL;  
  24. head->data = 0; 
  25. pCur = head; 
  26. //为防止指针互指带来的混乱,用pCur节点保存了头节点 也表示当前指针移动到了头指针  
  27. //创建n个节点 并连接成链表  
  28. for (int i=0; i<n; i++) 
  29. pNew = new ChainNode; //创建一个新节点 
  30. cout<<"请输入数据:"
  31. cin>>pNew->data; 
  32. pCur->right = pNew; //头指针的右指针指向新建节点  
  33. pNew->left = pCur; //新建节点的左指针执行头节点  
  34. pNew->right = NULL; //用于最后和头指针进行交换  
  35. pCur = pNew; //指针往下移动  
  36. }  
  37. //最后将头指针的左指针指向最后一个节点, 
  38. //最后一个节点的有指针指向头指针,构成循环  
  39. head->left = pCur;  
  40. pCur->right = head; 
  41. return head;  
  42. //////////////输出链表头节点///////////////////////  
  43. void OutList(ChainNode *head) //参数为头指针 从头指针开始  
  44. cout<<"链表元素输出如下:"<<endl; 
  45. ChainNode *pCur = head->right; 
  46. //重第一个节点开始输出  
  47. //没有指向空节点,则链表没结束 输出链表元素  
  48. while (pCur->right != head)  
  49. cout<<pCur->data<<" "
  50. pCur = pCur->right; 
  51. //当前节点指向下一个节点 可以遍历链表  
  52. }  
  53. cout<<pCur->data<<endl; 
  54. //输入最后一个元素,它的右指针执行head  
  55. ///////在双向循环链表后添加n个节点////// 
  56. ChainNode* AddNode(ChainNode* head, int n) 
  57. ChainNode *pNew,*pCur; 
  58. //新添加节点和当前节点 
  59. pCur = head;  
  60. //移动到最节点 
  61. while (pCur->right != head)  
  62. pCur = pCur->right; 
  63. //当前节点往下移动 一直移到最后一个节点  
  64. //新添加n个节点并插入链表 
  65. for (int i=0; i<n; i++) 
  66. pNew = new ChainNode; 
  67. cout<<"输入要添加的节点元素:"
  68. cin>>pNew->data; 
  69. pCur->right = pNew; //头指针的右指针指向新建节点  
  70. pNew->left = pCur; //新建节点的左指针执行头节点  
  71. pNew->right = NULL; //用于最后和头指针进行交换  
  72. pCur = pNew; //指针往下移动  
  73. }  
  74. //最后将头指针的左指针指向最后一个节点, 
  75. //最后一个节点的有指针指向头指针,构成循环  
  76. head->left = pCur;  
  77. pCur->right = head; 
  78. return head;  
  79. }  
  80. /////在双向循环链表中删除一个节点///////  
  81. ChainNode* DeleteNode(ChainNode* head, unsigned num) 
  82. //删除第num个节点 
  83. ChainNode *pNew,*pCur,*temp; 
  84. //新添加节点和当前节点 ,临时交换节点  
  85. pCur = head;  
  86. int ncount = 0;  
  87. //移动到第num-1个节点 
  88. while (1) 
  89. ncount++; 
  90. pCur = pCur->right; //当前节点往下移动  
  91. if (num == ncount) 
  92. break//此时pCur还是指向了第num个节点  
  93. }  
  94. //当前节点的前一个节点的右指针 指向 当前节点的下一个节点 
  95. //当前节点的下一个节点的左指针 指向 当前节点的上一个节点 构成连接 
  96. //最后 删除当前节点  
  97. (pCur->left)->right = pCur->right; 
  98. (pCur->right)->left = pCur->left; 
  99. delete pCur; 
  100. return head;  
  101. int main() 
  102. int num; 
  103. //创建num个节点并显示  
  104. cout<<"输入要创建的链表节点个数:"
  105. cin>>num; 
  106. ChainNode *head = CreateNode(num); 
  107. OutList(head);  
  108. //往链表后添加n个节点 
  109. int addnum; 
  110. cout<<"输入要添加的节点个数:"
  111. cin>>addnum;  
  112. AddNode(head, addnum); 
  113. OutList(head);  
  114. //删除链表的第del个元素 
  115. int del; 
  116. cout<<"输入要删除的第几个位置的节点:"
  117. cin>>del; 
  118. DeleteNode (head, del); 
  119. OutList(head); 
  120. system("pause"); 
  121. return 0; 

希望本文所述对大家的C++程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表