作者skiusan (天空無限)
看板Programming
標題[問題] C語言用Linked List 建BST
時間Fri Dec 30 23:33:17 2011
寫程式時遇到一些問題想請教各位前輩:
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
1F:→ firejox:就你的問題 可能是沒有連好吧... 123.240.128.52 12/30 23:47
2F:→ firejox:拿一張紙和筆模擬一下過程 看有沒有遺漏的 123.240.128.52 12/30 23:47
3F:→ firejox:地方... 123.240.128.52 12/30 23:48
4F:→ skiusan:第二點有這個可能 但是第一點呢203.217.108.247 12/31 00:13
5F:推 chchwy:當掉就是走錯 連錯了 220.134.128.54 12/31 01:06
6F:→ felixtung:1. malloc()失敗不該無止盡做下去。 111.251.207.65 12/31 08:37
7F:→ felixtung:2.Insert node的while迴圈錯了,再仔細 111.251.207.65 12/31 08:38
8F:→ felixtung:想一下吧!^^ 111.251.207.65 12/31 08:38
9F:→ felixtung:PS:你的insert node也可以用recursive 111.251.207.65 12/31 08:40
10F:→ felixtung:call來實現,會比較簡潔!^^ 111.251.207.65 12/31 08:40
11F:→ felixtung:抱歉看錯!malloc()失敗沒有無止盡做下 111.251.207.65 12/31 09:10
12F:→ felixtung:去。 111.251.207.65 12/31 09:11
13F:→ felixtung:只是再做一次也不保證就會成功了!^^ 111.251.207.65 12/31 09:11
14F:→ firejox:insert只要一層while就好... 123.240.128.52 12/31 15:10
15F:→ firejox:假如malloc失敗還要剝削電腦= = 123.240.128.52 12/31 15:13
16F:→ skiusan:謝謝兩位 繼續嘗試中203.217.108.247 01/01 17:19