Преобразование из одного в круговой связанный список

Вот ссылка на код, который я написал для кругового связанного списка. Код также вставлен ниже.

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));
}

Сначала я написал его для одного, а затем изменил несколько указателей, чтобы сделать его круглым. Я делаю в этом какую-то ошибку, которую не могу отследить и, следовательно, получаю тайм-аут. Пожалуйста, предложите.

Большое спасибо.

2 ответа

Решение

Это выглядит неправильно:

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).

Когда findcycle находит цикл, он не выходит: он просто продолжает идти. (Аналогично, когда он получает список с 0 или 1 элементом.) Я не гарантирую, что это единственная ошибка в вашем коде, но этого достаточно, чтобы он не работал.

Другие вопросы по тегам