日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表之双向链表

發布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表之双向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

又是敲代碼學習的一天,雖然學的很痛苦,但是看到自己學完后有成果出來還是 很高興的。
接下來廢話不多說直接上代碼,代碼里有各個函數的解釋說明,貫穿著我對這個雙向鏈表的理解

//感覺這個雙向鏈表,就是在單向鏈表中稍微多加了一個數據域--前指針, //其他的話也沒什么太大的區別,其次在進行數據交換時要注意兩個數據之間指針的斷連 //是先斷還是先連,這個要考慮清楚,不然寫代碼的時候會感到很困惑 //首先定義一下結構體 typedef struct Node {int data; //數據域Node * left; //這是指向左邊節點的指針域Node* right; //這是指向右邊節點的指針域 }Node; //創建頭節點,作為鏈表的頭 Node * createHeadNode() {Node * headNode = (Node*)malloc(sizeof(Node));headNode->left = headNode->right = NULL;return headNode; } //創建節點,使后面的申請節點操作更為方便,有要創建節點直接調用該函數即可 Node * createNode(int data) {Node * newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->left = newNode->right = NULL;return newNode; } /*在鏈表頭部插入數據,這個時候要考慮表頭后面是否有數據, 沒有數據操作就很方便,直接將兩個節點連接就行。但是頭節點后頭有數據操作就會麻煩一些, 要考慮到節點之間連接的先后順序,順序沒想清楚的話就很容易出問題 連接方法是這樣的:1. 先讓頭節點后頭的那個節點和新生成的節點先相互連上即:headNode->right->left = newNode;newNode->right = headNode->right;2. 然后讓頭節點和新節點連上newNode->left = headNode;headNode->right = newNode;如果還是不是很理解的話可以自己畫個圖看看,多看一陣子就想出來,時間關系我就不多講了 */ //鏈表頭部插入數據 void headAddNode(Node * headNode,int data) {Node * newNode = createNode(data);if (headNode->right == NULL){headNode->right = newNode;newNode->left = headNode;}else{headNode->right->left = newNode;newNode->right = headNode->right;newNode->left = headNode;headNode->right = newNode;} } /*這個操作就有點麻煩了,要三個指針了,一個記錄當前位置,一個記錄下一個節點的地址,還要有一個新節點,這里主要是要找的尾節點,用循環結構就行,找到之后就很方便了,代碼在下面自己體會吧,不是很難,這個只要想清楚你要干什么,然后就是你完成這件事的一些條件,把這些條件滿足就行,事情不就完成了 */ //尾部插入數據 void tailNodeData(Node * headNode,int data) {Node * newNode = createNode(data);Node* proPMove = headNode;Node * pMove = headNode;while (pMove){proPMove = pMove;pMove = pMove->right;}proPMove->right = newNode;newNode->left = proPMove; } //將鏈表的數據輸出 void printNodeData(Node * headNode) {Node* pMove = headNode->right;while (pMove){printf("%d-->", pMove->data);pMove = pMove->right;}printf("\n");}int main() {Node * List = createHeadNode();//創建雙向鏈表的頭,不存放數據for (int i = 0; i < 10; i++){headAddNode(List, i);}printNodeData(List);//打印鏈表里的數據tailNodeData(List, 11);printNodeData(List);return 0; }

看了這么多了,是不是很累了,再堅持一下,或者休息一下再來看
其實這個雙向鏈表還有別的實現方式–借助第二個結構體

typedef struct List {int size ; //用于統計幾點的數目List * head; //用于指向鏈表的頭部List * tail; //用于指向鏈表的尾部 }List/*然后很簡單了,這個就交給文章前的你來完成了 */

此時的你經過上面的雙向鏈表的學習,有沒有一點想法。有沒有想實現雙向循環鏈表。
這時你會有靈感嗎?
如果沒有的話,那我來提醒一下你。其實這時候你只要將這個雙向鏈表的left的NULL賦為最后一個節點的地址,最后一個節點的right賦為頭節點的地址。這樣不就頭尾連接起來了。是不是很神奇。
那這樣有思路了,剩下的就交給你來實現了。代碼我就不寫了,如果有遇到什么問題可以私信我哦,有空看到了會回復的。
好了,今天就先寫到這里了,好困太晚了,先睡了。。

總結

以上是生活随笔為你收集整理的链表之双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。