这是我为循环链表编写的代码的link。代码也粘贴在下面。
typedef struct node
{
int value;
struct node *next;
}mynode;
mynode *head, *tail, *temp,*sp,*fp;
void add(int value);
void iterative_reverse();
void print_list();
void findcycle();
int main()
{
head=(mynode *)0;
add(1);
add(2);
add(3);
//print_list();
findcycle();
return(0);
}
void add(int value)
{
temp = (mynode *) malloc(sizeof(struct node));
temp->value=value;
temp->next=(mynode *)0;
if(head==(mynode *)0)
{
head=temp;
tail=temp;
}
else
{
tail->next=temp;
tail=temp;
tail->next=head;
temp->next=head;
}
}
void findcycle()
{
if (head == NULL || head->next == NULL)
printf("null");
sp=head;
fp=head->next;
while (fp != NULL && fp->next != NULL)
{
if ((fp == sp) || (fp->next == sp))
printf("Cycle");
sp = sp->next;
fp = fp->next->next;
}
printf("Not a Cycle");
}
void print_list()
{
for(temp=head; temp!=tail; temp=temp->next)
printf("[%d]->",(temp->value));
}
我最初是为单身编写的,然后更改了几个指针,使其成为循环。我在做一些错误,我无法跟踪,因此得到超时。请建议。
非常感谢。
答案 0 :(得分:1)
这看起来不对:
tail->next=temp;
tail=temp;
tail->next=head;
temp->next=head;
它应该是(如果你在列表末尾添加新节点并希望它是一个循环列表,就像我在这里假设的那样):
tail->next=temp;
temp->next=head;
tail=temp;
无论如何,这只是一个小错误:只是一个冗余的任务。
真正严重的问题在于:
void findcycle()
{
if (head == NULL || head->next == NULL)
printf("null");
sp=head;
fp=head->next;
while (fp != NULL && fp->next != NULL)
{
if ((fp == sp) || (fp->next == sp))
printf("Cycle");
sp = sp->next;
fp = fp->next->next;
}
printf("Not a Cycle");
}
首先,你想要完成什么?目前尚不清楚,因此建议您如何纠正它并不容易;无论如何,最明显的错误是,如果列表实际上是是循环的,那么循环将永远继续,因为没有可能发生的退出条件(没有一个指针会永远变成NULL)。
答案 1 :(得分:0)
当findcycle
找到一个循环时,它不会退出:它只是继续前进。 (同样,当它获得一个包含0或1个元素的列表时。)我不保证这是你代码中唯一的错误,但它足以使它不起作用。