[問題] C語言用Linked List 建BST

看板Programming作者 (天空無限)時間13年前 (2011/12/30 23:33), 編輯推噓1(1015)
留言16則, 4人參與, 最新討論串1/1
寫程式時遇到一些問題想請教各位前輩: 1) 產生新的節點(temp)時 有時候會讓程式異常終止(當掉) 而且常在第4、5個新節點就當掉 是為什麼呢 不太可能是記憶體不足吧? 2) 建樹完成後 第二個新節點(即Root的下一個)的右子點 每次走訪到它就會當掉 而把struct node結構裡的lchild, rchild順序交換 變成左子點走訪時會當掉 以下是我的程式碼 煩請各位給些建議 謝謝 --- typedef struct node *ptrn; struct node { int elem; ptrn lchild; ptrn rchild; }; void inorder(ptrn tree); int main() { int i; ptrn set,temp,start; //Construct a Root temp = (ptrn)malloc(sizeof(ptrn)); start = temp; scanf("%d",&i); temp -> elem = i; temp -> lchild = NULL; temp -> rchild = NULL; printf("ROOT saved\n"); while(1) { scanf("%d",&i); if(i==-1) break; temp = (ptrn)malloc(sizeof(ptrn)); if(temp == NULL) { printf("malloc fail.\n"); temp = (ptrn)malloc(sizeof(ptrn)); } temp->elem = i; temp->lchild = NULL; temp->rchild = NULL; set = start; while(1) { while(temp->elem > set->elem) { if(set->rchild==NULL) { set->rchild = temp; printf("RC saved\n"); break; } set = set->rchild; } while(temp->elem <= set->elem) { if(set->lchild==NULL) { set->lchild = temp; printf("LC saved\n"); break; } set = set->lchild; } break; } } inorder(start); system("pause"); } void inorder(ptrn tree) { if(tree!=NULL) { inorder(tree->rchild); inorder(tree->lchild); printf("%d\n",tree->elem); } else printf("NULL Node\n"); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.217.108.247

12/30 23:47, , 1F
就你的問題 可能是沒有連好吧...
12/30 23:47, 1F

12/30 23:47, , 2F
拿一張紙和筆模擬一下過程 看有沒有遺漏的
12/30 23:47, 2F

12/30 23:48, , 3F
地方...
12/30 23:48, 3F

12/31 00:13, , 4F
第二點有這個可能 但是第一點呢
12/31 00:13, 4F

12/31 01:06, , 5F
當掉就是走錯 連錯了
12/31 01:06, 5F

12/31 08:37, , 6F
1. malloc()失敗不該無止盡做下去。
12/31 08:37, 6F

12/31 08:38, , 7F
2.Insert node的while迴圈錯了,再仔細
12/31 08:38, 7F

12/31 08:38, , 8F
想一下吧!^^
12/31 08:38, 8F

12/31 08:40, , 9F
PS:你的insert node也可以用recursive
12/31 08:40, 9F

12/31 08:40, , 10F
call來實現,會比較簡潔!^^
12/31 08:40, 10F

12/31 09:10, , 11F
抱歉看錯!malloc()失敗沒有無止盡做下
12/31 09:10, 11F

12/31 09:11, , 12F
去。
12/31 09:11, 12F

12/31 09:11, , 13F
只是再做一次也不保證就會成功了!^^
12/31 09:11, 13F

12/31 15:10, , 14F
insert只要一層while就好...
12/31 15:10, 14F

12/31 15:13, , 15F
假如malloc失敗還要剝削電腦= =
12/31 15:13, 15F

01/01 17:19, , 16F
謝謝兩位 繼續嘗試中
01/01 17:19, 16F
文章代碼(AID): #1E_Td2mr (Programming)
文章代碼(AID): #1E_Td2mr (Programming)