Функция отображения в круговом связанном списке в C

У меня проблема с моим круговым связанным списком. Я считаю, что проблема с моей функцией отображения. Пожалуйста, дайте мне знать, что происходит не так. У меня проблема в том, что отображаются первые n-1 элементов, а затем я получаю ошибку сегментации (последний элемент не отображается, и я получаю ошибку сегментации). Спасибо:-)

             #include<stdio.h>
             #include<stdlib.h>
             struct Node
             {
              int data;
              struct Node* link;
             };
             struct Node* last = NULL;
             void Insert_begin(int a)
             { 
               struct Node* temp;
               temp = malloc(sizeof(struct Node));
               temp->data = a;    
               if (last == NULL)
                 last = temp;
               else
               {
                temp->link = last->link;
                last->link = temp;
               }
             }
             void Display()
             {   
               struct Node* temp;    
               if (last == NULL)
               {
                 printf("list is empty");
               }        
               temp = last->link;
               while(temp!=last)
               {
                 printf("%d\n",temp->data);
                 temp = temp->link;     
               }
               printf("%d\n",temp->data);   
             }  
             int main()
             {
              Insert_begin(0);               
              Insert_begin(1);
              Insert_begin(2);
              Insert_begin(3);
              Insert_begin(4);
              Display();
              return 0;
             }

5 ответов

Когда вы вставляете первый элемент в список, вы должны указать ссылку на него:

if (last == NULL) {
    last = temp;
    last->link = last;
} else ...

В вашем коде ссылка с последнего элемента была неинициализирована.

#include<stdio.h>
#include<stdlib.h>
struct Node
{
        int data;
        struct Node* link;
};

struct Node* last = NULL;

void Insert_begin(int a)
{
        struct Node* temp;
        temp = malloc(sizeof(struct Node));
        temp->data = a;

        if (last == NULL)
        {
                last = temp;
                temp->link=last;//you forget this
        }
        else
        {
                temp->link = last->link;
                last->link = temp;
                last=temp;
        }
}



void Display()
{

        struct Node* temp;

        if (last == NULL)
        {
                printf("list is empty");
                return;
        }

        temp = last->link;
        while(temp!=last)
        {
                printf("%d\n",temp->data);
                temp = temp->link;

        }
        printf("%d\n",temp->data);

}

int main()
{
        Insert_begin(0);

        Insert_begin(1);
        Insert_begin(2);
        Insert_begin(3);
        Insert_begin(4);
        Display();
        return 0;
}
             if (last == NULL)
               {
                last = temp;
                **// adding this line 
                last->link = last;**
               }

Это решит проблему

Проблема в функции Insert_begin(int a). Когда вы вставляете первый узел, мы не связываем его рядом с собой, поэтому в следующий раз, когда вы вставляете второй / третий /.. узел, вы пытаетесь получить доступ к первому узлу как last->link но это дает вам ценность мусора, и это причина

**void Insert_begin(int a)
 { 
               struct Node* temp;
               temp = malloc(sizeof(struct Node));
               temp->data = a;    
               if (last == NULL)
               {
                 last = temp;
                 last->link = last;
               }
               else
               {
                temp->link = last->link;
                last->link = temp;
               }
 }**

Кроме того, в функции отображения, я бы предложил поместить все ниже условия if в блок else

**

void Display()
  {   
               struct Node* temp;    
               if (last == NULL)
               {
                 printf("list is empty");
               }    
              else
               {    
                    temp = last->link;
                    while(temp!=last);
                    {
                           printf("%d\n",temp->data);
                           temp = temp->link;     
                    } 
                    printf("%d\n",temp->data); 
               }  
  }**  

Ниже исправлен код:
одна ошибка, которую вы сделали, это то, что при вставке первого значения вы не указываете ссылку на сам первый узел. В круговом односвязном списке, если есть один узел, тогда поле ссылки (следующее вообще) должно указывать на сам этот узел.

#include<stdio.h>
    #include<stdlib.h>
    struct Node
    {
        int data;
        struct Node* link;
    };

    struct Node* last = NULL;

    void Insert_begin(int a)
    { 
        struct Node* temp;
        temp = malloc(sizeof(struct Node));
        temp->data = a;

        if (last == NULL)
        {
            last = temp;

          /*link field is pointing to that node
           *it self(you have forgotten this)*/
            last->link = temp;
        }
        else
        {
            temp->link = last->link;
            last->link = temp;
        }
    }



    void Display()
    {

        struct Node* temp;

        if (last == NULL)
        {
            printf("list is empty");
        }

        temp = last->link;
        while(temp!=last)
        {
            printf("%d\n",temp->data);
            temp = temp->link;

        }
        printf("%d\n",temp->data);

    } 

    int main()
    {
        Insert_begin(0);

        Insert_begin(1);
        Insert_begin(2);
        Insert_begin(3);
        Insert_begin(4);
        Display();
        return 0;
    }

*

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