[問題] 連結串列問題

看板C_and_CPP作者 (希望微笑)時間13年前 (2010/10/17 19:22), 編輯推噓1(1019)
留言20則, 5人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 在鏈結串列結構程式中,輸入一值尋找某一節點與該節點前後節點,並回傳指標. 印出回傳三該節點之內部資料 從main函式中呼叫一函式(以A稱呼),於A函式內開始收詢某一節點與該節點之前後節點, 最後A函式尋找完後並回傳結果(以指標方式回傳), 於main函式中無法printf顯示該三節點內部資料 希望得到的正確結果: 7 8 9 程式跑出來的錯誤結果: 編譯成功,但是執行就無法顯示,程式會蕩掉 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) IDE:VC++ 有問題的code: (請善用置底文標色功能) #include <stdio.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; } 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"); } 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 ** search_key2(int k,Link *Node) { Link *pt[3]; *(pt+0) = NULL; *(pt+1) = NULL; *(pt+2) = NULL; Link * search_pt = Node; while(search_pt != NULL) { *(pt+1) = search_pt; if(search_pt->a == k) { printf("找到Node,記憶體=%x,內容值 =%x,value=%d,Next=%x\n",&search_pt,search_pt,search_pt->a,search_pt->next); if(search_pt->next != NULL) *(pt+2) = search_pt->next; break; } if(search_pt->next != NULL) *(pt+0) = search_pt; search_pt = search_pt->next; } return pt; } void main() { //建立連結串列 Link *Node[10] ; 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++; } //印出連結串列 print_link(*(Node+0)); //-------新增與刪除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)); Link ** pt; pt = search_key2(8, *(Node +0) ); printf("%d\n", (*(pt+0))->a ); printf("%d\n", (*(pt+1))->a ); printf("%d\n", (*(pt+2))->a ); //釋放連結串列記憶體 freeALLNode(*(Node+0)); } 補充說明: 原始程式我把它簡化了, 仍然不懂 這裡面出了什麼問題: #include <stdio.h> #include <stdlib.h> struct node { int a; struct node * next; }; typedef struct node Link; Link ** search_key2(Link *Node1,Link *Node2) { Link * pt[2]; *(pt+0) = Node1; *(pt+1) = Node2; return pt; } void main() { Link * Node1 = (Link *) malloc(sizeof(struct node)); Node1->a = 10; Node1->next = NULL; Link * Node2 = (Link *) malloc(sizeof(struct node)); Node2->a = 10; Node2->next = NULL; Link ** p ; p = search_key2(Node1,Node2); printf("%d\n", (*(p+0))->a ); printf("%d\n", (*(p+1))->a ); } 感謝..麻煩大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.226.206 ※ 編輯: WishSmile 來自: 61.230.226.206 (10/17 19:24) ※ 編輯: WishSmile 來自: 61.230.226.206 (10/17 19:26)

10/17 20:50, , 2F
請善用 debugger 一步步的找出錯誤所在
10/17 20:50, 2F
※ 編輯: WishSmile 來自: 61.230.226.206 (10/17 21:01)

10/17 21:00, , 3F
Link *Node[10] ; < 這行錯了(亂猜的)
10/17 21:00, 3F

10/17 21:02, , 4F
我把它簡化了...po在本文後段..仍然不懂哪裡出問題
10/17 21:02, 4F

10/17 21:04, , 5F
置底文13戒第五
10/17 21:04, 5F

10/17 21:05, , 6F
Link * pt[2]; .... return pt; <= 這裡問題很大
10/17 21:05, 6F

10/17 21:08, , 7F
*node->next = (Link *) malloc(sizeof(struct node));
10/17 21:08, 7F

10/17 21:10, , 8F
*node->next->next->next = malloc ...這才叫鏈結吧
10/17 21:10, 8F

10/17 21:22, , 9F
你 return 一個只在 local 存在的變數 pt
10/17 21:22, 9F

10/17 21:23, , 10F
離開 search_key2 後,就被拿掉了
10/17 21:23, 10F

10/17 21:38, , 11F
是因為[2] <--這個讓它配置在stack區域嗎 離開後就沒了
10/17 21:38, 11F

10/17 21:38, , 12F
老師沒講區域變數怎麼儲存吧,所以才會造成原PO的誤解
10/17 21:38, 12F

10/17 21:40, , 13F
改成 Link **pt = malloc(2*sizeof(Link*)) 之類的吧
10/17 21:40, 13F

10/17 21:41, , 14F
原po一直用指標的指標去取值,很容易出錯
10/17 21:41, 14F

10/17 21:42, , 15F
指標地獄,最後指標是指向指標還是指向資料都分不清了
10/17 21:42, 15F

10/17 21:42, , 16F
不過為什麼大多數喜歡用malloc而不是calloc?
10/17 21:42, 16F

10/17 21:43, , 17F
所以看很多 code 會有 xxxx_ptr 的型態啊,命名很重要的XD
10/17 21:43, 17F

10/17 21:44, , 18F
Link不該產生指標的指標,因是一個資料附帶一個指標
10/17 21:44, 18F

10/17 21:46, , 19F
而原po的Node的next都是NULL那還叫Link嗎???
10/17 21:46, 19F

10/17 23:53, , 20F
因為calloc會填0?
10/17 23:53, 20F
文章代碼(AID): #1Ckjnaus (C_and_CPP)