程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 對C++鏈表進行解讀分析

對C++鏈表進行解讀分析

編輯:C++入門知識

C++語言是學習數據結構的很好的學習工具,能夠全面的理解了C++中C++鏈表的作用和用途,那麼對於理解其C++描述,Java描述都就輕而易舉了,以後學習什麼語言都不會覺得難了。

鏈表的交換節點的含義是:給定一個單鏈表,要求交換其中的任意兩個節點。注意這裡鏈表的頭節點是不參與節點交換的。這個看上去是比較簡單,但是實現起來卻還是需要一定的基本功。

對於這個問題,關鍵是要用4個指針來保存兩個交換的節點的前後節點位置,具體實現請參見實現源碼。實際上,還有一個邏輯更加清晰的實現:只要用兩個指針保存當前的兩個交換節點的前一個節點。

  • 對C++的設計原則介紹
  • 對C++手冊內容簡介
  • 深度剖析C++標准程序庫說明
  • 如何使C++進行C++開發程序?
  • 如何定義C++構造函數

然後依次刪除待交換節點,再在記錄的前一個節點後交替插入刪除的兩個節點,也就是實際上將這個過程轉化為了對於C++鏈表的兩個基本操作就可以完成了。但是要注意的是,這個實現中當兩個交換節點是相鄰節點的時候會出現問題,要單獨處理,具體原因手工操作一次即可得知。後一種方法這裡就不給出了。

實現代碼中要說明的是,交換C++鏈表節點傳入的是兩個交換節點指針,但是為了測試簡單實現,將這兩個節點換成了待交換節點的關鍵字值域),再到C++鏈表中定位。

具體實現源碼為:

  1. //Link.h  
  2. #include <iostream> 
  3. #include <ctime> 
  4. struct Node  
  5. {  
  6. public:  
  7. Node():_val(0),_next(NULL)  
  8. {  
  9. }  
  10. Node(int val):_val(val),_next(NULL)  
  11. {  
  12. }  
  13. Node(int val,Node* next):_val(val),_next(next)  
  14. {  
  15. }  
  16. ~Node()  
  17. {  
  18. if (_next)  
  19. delete _next;  
  20. }  
  21. public:  
  22. int _val;  
  23. Node* _next;  
  24. };  
  25. typedef Node* LinkNode;  
  26. Node* CreateLink(int len,int MAX_BOUND = 100)  
  27. {  
  28. srand((unsigned int)time(NULL));  
  29. LinkNode head = new Node(-1);  
  30. LinkNode tmp = head;  
  31. for (int i = 0; i < len; ++i)  
  32. {  
  33. //tmptmp = tmp->_next = new Node(rand() % MAX_BOUND);  
  34. tmptmp = tmp->_next = new Node(i);  
  35. }  
  36. tmp->_next = NULL;  
  37. return head;  
  38. }  
  39. void ExchLinkNode (const LinkNode head,int i1,int i2)  
  40. {  
  41. //head不准被交換  
  42. LinkNode prenode1 = NULL;  //保存待交換節點node1的前一個節點  
  43. LinkNode postnode1 = NULL; //保存待交換節點node1的後一個節點  
  44. LinkNode prenode2 = NULL;  //保存待交換節點node2的前一個節點  
  45. LinkNode postnode2 = NULL; //保存待交換節點node2的後一個節點  
  46. LinkNode node1 = NULL;     //保存待交換的節點  
  47. LinkNode node2 = NULL;     //保存待交換的節點  
  48. LinkNode tmp = head;  
  49. //定位兩個節點  
  50. while ((tmp->_val != i1) && (tmp != NULL))  
  51. {  
  52. tmptmp = tmp->_next;  
  53. }  
  54. if (tmp == NULL)  
  55. {  
  56. return ;  
  57. }  
  58. else  
  59. {  
  60. node1 = tmp;  
  61. }  
  62. tmp = head;  
  63. while ((tmp->_val != i2) && (tmp != NULL))  
  64. {  
  65. tmptmp = tmp->_next;  
  66. }  
  67. if (tmp == NULL)  
  68. {  
  69. return ;  
  70. }  
  71. else  
  72. {  
  73. node2 = tmp;  
  74. }  
  75. //不得和頭節點交換  
  76. if (node1 == head)  
  77. {  
  78. return ;  
  79. }  
  80. else if (node2 == head)  
  81. {  
  82. return ;  
  83. }  
  84. //自己和自己就不必交換了  
  85. if (node1 == node2)  
  86. {  
  87. return ;  
  88. }  
  89. tmp = head;  
  90. while (tmp->_next != node1)  
  91. {  
  92. tmptmp = tmp->_next;  
  93. }  
  94. prenode1 = tmp;  
  95. tmp = head;  
  96. while (tmp->_next != node2)  
  97. {  
  98. tmptmp = tmp->_next;  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved