Я получил этот код для вставки элемента в конце списка. Ошибка сегментации - PullRequest
1 голос
/ 23 января 2020

Привет, ребята, я кодирую этот код для вставки элемента в конец списка

#include <stdio.h>
#include <stdlib.h>
struct node{
    int data;
   struct node *link;
};
struct node*head;
void insert(int x){
    struct node*temp=(node*)malloc(sizeof(struct node));
   temp->data=x;
   temp->link=NULL;
   struct node*temp1=head;
   while(temp1->link!=NULL)
       temp1=temp1->link;
   temp1->link=temp;
};
void display(){
    struct node*temp=head;
    printf("LIst is:");
    while(temp!=NULL){
        printf("%d",temp->data);
        temp=temp->link;
    }
    printf("\n");
};
int main()
{ head=NULL;
    int n,i,x;
    printf("Enter the number of elements:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("Enter the elements:");
        scanf("%d",&x);
        insert(x);
        display();
    }

}

Каждый раз, когда я его компилирую. Это показывает

Segmentation fault core dumped 

, пожалуйста, помогите я не знаю, что не так я получаю доступ к памяти, которая «не принадлежит мне.

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Вы присваиваете head для temp1

struct node*temp1=head;

И в этот момент head равно NULL

, тогда вы разыменовываете temp1 (NULL)

while(temp1->link!=NULL)

Вот почему у вас есть ошибка.

2 голосов
/ 23 января 2020

head - это NULL для начала. Поэтому, когда вы делаете:

struct node*temp1=head;
while(temp1->link!=NULL)
        ^^^^^

вы разыменовываете NULL и программа падает.

Вам нужен дополнительный оператор if, например, для обработки случая, когда head равен NULL.

...
temp->link=NULL;
if (head == NULL)
{
    head = temp;
    return;
}
struct node*temp1=head;
...

Кстати: вообще плохая идея иметь глобальную переменную head.

Чтобы избежать глобальной переменной, вы можете сделать две вещи - либо вернуть head указывать на каждый вызов insert или передавать адрес head функции. Я предпочитаю последнее. Это выглядит так:

void insert(struct node** pHead, int x){
   struct node* temp=(node*)malloc(sizeof(struct node));
   temp->data=x;
   temp->link=NULL;
   if (*pHead == NULL)
   {
       *pHead = temp;  // Update head
       return;
   }
   struct node* temp1 = *pHead;
   while(temp1->link!=NULL)
       temp1=temp1->link;
   temp1->link=temp;
};

и называется так:

int main()
{ 
    struct node* head=NULL;  // Use a local variable
    int n,i,x;
    printf("Enter the number of elements:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("Enter the elements:");
        scanf("%d",&x);
        insert(&head, x);  // Pass the address of head
        ....
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...