【问题标题】:Conversion from single to circular linked list单链表到循环链表的转换
【发布时间】:2011-03-09 18:54:42
【问题描述】:

这是我为循环链表编写的代码的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));
}

我最初将它编写为单,然后更改了几个指针以使其成为循环。我在其中犯了一些我无法跟踪的错误,因此出现超时。请提出建议。

非常感谢。

【问题讨论】:

    标签: c pointers linked-list circular-list


    【解决方案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)。

    【讨论】:

    • @vartika:那么您应该投票和/或接受最佳答案。
    • 两个答案都建议相同,但是是的,这是更详细的解释。我如何投票?
    • 点击答案左侧数字上方的向上箭头。如果您同时喜欢这两个答案,则可以投票给多个答案。要对您不喜欢的答案投反对票,请单击向下箭头。要将一个答案标记为已接受,请单击向下箭头下方的小图标。
    【解决方案2】:

    findcycle 找到一个循环时,它不会退出:它只是继续。 (同样,当它得到一个包含 0 或 1 个元素的列表时。)我不保证这是您的代码中唯一的错误,但足以让它不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多