我試圖實現一個程序來查找循環鏈表的起始節點。我的代碼是 -循環鏈表的循環開始節點
struct node
{
char data;
struct node *link;
} ;
char FindStartNode(struct node **q)
{
struct node *r,*t;
r = *q;
t = *q;
while(t->link != NULL)
{
r = r->link;
t = t->link->link;
if(r == t)
{
break;
}
}
if(t == NULL)
return NULL;
r = *q;
while(r != t)
{
t = t->link;
r = r->link;
}
return t->data;
}
int main()
{
struct node *p;
p = NULL;
char num;
Append(&p,'A');
Append(&p,'B');
Append(&p,'C');
Append(&p,'D');
Append(&p,'E');
Append(&p,'C');
Display(p);
num = FindStartNode(&p);
printf("\nStarting node of the cycle linked list is:- %c",num);
_getch();
return 0;
}
int Append(struct node **q, char data)
{
struct node *r,*t;
r = (struct node *)malloc(sizeof(struct node));
r->data = data;
r->link = NULL;
if(*q == NULL)
*q = r;
else
{
t = *q;
while(t->link != NULL)
{
t = t->link;
}
t->link = r;
}
return 0;
}
int Display(struct node *q)
{
while(q != NULL)
{
printf("%c\t",q->data);
q = q->link;
}
return 0;
}
這是我的代碼。我沒有得到任何回報t->數據部分的價值,或者我無法找到循環墨跡列表的開始節點。任何幫助?
這段代碼旨在確定名單正好是一圈又回到某處列表(即,一個節點連接兩次)?如果是這樣,並假設你修復了似乎導致這個問題的NULL值,那麼看起來你可能會陷入最後的'while'循環中,'r'無休止地追着't'。 –
不是圓形鏈表中「起始節點」的想法有點...任意?我認爲他們*全部*可能是一個開始節點。或者你是否打算找到指向*的節點*?我們是否假定'* q'有一個指向* some *節點的指針,而你想要的那個是*之前的那個*? – WhozCraig
這甚至意味着什麼,找到一個循環列表的起始節點?創建列表的代碼應該提供一個指向元素的指針,幾乎總是第一個創建的元素。這是切入點。之後,從概念上講,沒有真正的開始或結束。這就是爲什麼它是循環的。 –