[問題] 鏈結串鏈,刪除Node問題

看板C_and_CPP作者 (希望微笑)時間13年前 (2010/10/18 22:02), 編輯推噓1(1030)
留言31則, 4人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 在鏈結串鏈中. 想刪串鏈中第一個node, 編譯通過但執行盪掉 希望得到的正確結果: 原先建立的串列結果如下: [Node],記憶體值=12ff1c,內容值=430090,value=0,next=430050 [Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0 [Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0 [Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60 [Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20 [Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0 [Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0 [Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60 [Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20 [Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0 於串列尾端加入一個node,結果如下: [Node],記憶體值=12ff1c,內容值=430090,value=0,next=430050 [Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0 [Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0 [Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60 [Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20 [Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0 [Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0 [Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60 [Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20 [Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0 [Node],記憶體值=12ff1c,內容值=431de0,value=500,next=0 想要刪除串列中頭端的node, 但無法成功. 希望結果如下: [Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0 [Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0 [Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60 [Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20 [Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0 [Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0 [Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60 [Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20 [Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0 [Node],記憶體值=12ff1c,內容值=431de0,value=500,next=0 程式跑出來的錯誤結果: 於main()中,在呼叫 deleteFirstNode(currentNode); 進入deleteFirstNode 函式中, free(pt) 該行程式會盪掉. 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 有問題的code: (請善用置底文標色功能) #include <stdio.h> #include<stdlib.h> struct node { int a; struct node * next; }; typedef struct node Link; Link* createNewNode(int a_value) { Link * NewNode =(Link *) malloc(sizeof(struct node)); NewNode->a = a_value; NewNode->next = NULL; return NewNode; } void freeALLNode(Link * Head) { while(Head != NULL) { Link *pt = Head; Head = Head ->next; free(pt); } } void LinkNode(Link * NodeA, Link * NodeB) { NodeA->next = NodeB; } Link* search_key1(int k,Link *Node) { Link * search_pt = Node; while(search_pt != NULL) { if(search_pt->a == k) { printf( "找到Node,記憶體=%x,內容值 \ =%x,value=%d,Next=%x\n" \ ,&search_pt \ ,search_pt \ ,search_pt->a \ ,search_pt->next ); return search_pt; } search_pt = search_pt->next; } return NULL; } void insertOneNode(Link *currentNode , Link * insertNode) { Link *tempNode; tempNode = currentNode->next; currentNode->next = insertNode; insertNode->next = tempNode; } Link * deleteFirstNode(Link * Head) { Link *pt; pt = Head; Head = pt->next; pt->next = NULL; free(pt); return Head; } void print_link(Link * pt) { printf("--Display-----------------------------------------\n"); while(1) { printf("[Node],記憶體值=%x,內容值=%x,value=%d,next=%x\n", \ &pt,pt,pt->a,pt->next); if(pt->next == NULL) break; pt = pt->next; } printf("--------------------------------------------------\n"); } void main() { //建立連結串列,配置記憶體------------------- Link **Node = (Link **) malloc( 10 * sizeof(Link *)); int i=0,k=10; while(i<k) { *(Node+i) = createNewNode(i); i++; } i=0; while(i<(k-1)) { LinkNode(*(Node+i),*(Node+i+1)); i++; } //-------新增一個node------------------------ Link *currentNode = NULL; //插入一個node Link *insertNode = createNewNode(500); currentNode = search_key1(9, *(Node +0) ); //有找到回傳指標,否則為NULL if(currentNode != NULL) insertOneNode(currentNode,insertNode); //印出鏈結串列 print_link(*(Node +0)); //-------刪除第一個node----------------------- currentNode = *(Node +0); Link * returnNode =deleteFirstNode(currentNode); //印出鏈結串列 print_link(returnNode); //釋放鏈結串列記憶體-------------------------- freeALLNode(currentNode); } 補充說明: 上次PO感謝大家回文, 這次麻煩大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.231.132

10/18 22:19, , 1F
我覺得Link **Node,指向指標的指標不該存在
10/18 22:19, 1F

10/18 22:20, , 2F
我覺得樓上把code看完很有耐心
10/18 22:20, 2F

10/18 22:24, , 3F
整個鏈結的結構錯誤,原po找一下google的資料再寫比較好
10/18 22:24, 3F

10/18 22:27, , 4F
QQ我想知道錯在哪
10/18 22:27, 4F

10/18 22:28, , 5F
知道錯誤的點 這樣我才知道如何改進 ...感恩
10/18 22:28, 5F

10/18 22:30, , 6F
void AddNode(Link* l,int a)
10/18 22:30, 6F
※ 編輯: WishSmile 來自: 61.230.231.132 (10/18 22:33)

10/18 22:32, , 7F
{ Link的最後next加入新Node,用malloc(sizeof(node))
10/18 22:32, 7F

10/18 22:32, , 8F
再把a代入新增的node
10/18 22:32, 8F

10/18 22:34, , 9F
一次把全部node建立再去把全部node接在一起,錯誤的思考
10/18 22:34, 9F

10/18 22:35, , 10F
我Link* createNewNode(int a_value) 建立一個新Node
10/18 22:35, 10F

10/18 22:36, , 11F
之後用LinkNode(Link * NodeA, Link * NodeB)串在最後
10/18 22:36, 11F

10/18 22:36, , 12F
這樣不可以嗎,...如果有問題 是哪裡出問題了?
10/18 22:36, 12F

10/18 22:38, , 13F
完全錯誤,請實做void AddNode(Link* l,int a)
10/18 22:38, 13F

10/18 22:38, , 14F
不懂為什麼一次把全部node建立以後,在把全部node接在一
10/18 22:38, 14F

10/18 22:39, , 15F
起 是錯誤思考呢? 我想說先配置好所有node在連接 這樣
10/18 22:39, 15F

10/18 22:39, , 16F
新的node是在AddNode中增加串連
10/18 22:39, 16F

10/18 22:39, , 17F
為何不行, 思考哪裡出問題了?
10/18 22:39, 17F

10/18 22:40, , 18F
書本上寫的也是這樣 新的node是在AddNode中增加串連
10/18 22:40, 18F

10/18 22:40, , 19F
只是我想不通 與我插在哪裡
10/18 22:40, 19F

10/18 22:41, , 20F
node->next = malloc(sizeof(node));
10/18 22:41, 20F

10/18 22:42, , 21F
node->next->a = 新數值
10/18 22:42, 21F

10/18 22:42, , 22F
全部的node是用next結在一起
10/18 22:42, 22F

10/18 22:43, , 23F
startNode->next->next->next...........這樣想才對
10/18 22:43, 23F

10/18 22:44, , 24F
也就是在main中只要建立startNode,而不是指標的指標
10/18 22:44, 24F

10/18 22:45, , 25F
我的 void LinkNode(Link * NodeA, Link * NodeB)
10/18 22:45, 25F

10/18 22:45, , 26F
要自已創造資料結構之前,先把前人的智慧學好
10/18 22:45, 26F

10/18 22:46, , 27F
是把前依個node的next接道下一個node阿
10/18 22:46, 27F

10/18 22:46, , 28F
如 : NodeA->next = NodeB;
10/18 22:46, 28F

10/18 22:48, , 29F
書上寫的你有實際用大腦去跑過一次嗎?
10/18 22:48, 29F

10/18 22:50, , 30F
Link只要一個起頭也就是index=0
10/18 22:50, 30F

10/19 06:59, , 31F
Link **Node; pt=*Node; 把pt free掉,Node就爆炸了。
10/19 06:59, 31F
文章代碼(AID): #1Cl5DeAO (C_and_CPP)