Невозможно создать связанный список в Linux, используя C - PullRequest
0 голосов
/ 28 января 2020

Я написал аналогичный фрагмент кода на C ++ для Windows, где я создаю простой c односвязный список, добавляю данные и отображаю содержимое списка. Я попытался написать аналогичную программу на C на этот раз для Linux. Кажется, что нет ошибки компиляции или ошибки времени выполнения, но когда я пытаюсь вызвать функцию void insert(), программная консоль сообщает мне, что есть ошибка сегментации.

Мой код включен ниже:

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int data;
    struct Node* next;
}*nPtr;

nPtr head = NULL;
nPtr cur = NULL;
void insert(int Data);
void display();

int main(void)
{
    int opr, data;

    while (opr != 3)
    {
        printf("Choose operation on List. \n\n1. New Node. \n2. Display List.\n\n>>>");
        scanf("%d", opr);

        switch (opr)
        {
            case 1 :
                printf("Enter data.\n");
                scanf("%d", data);

                insert(data);
                break;

            case 2 :
                display();
                break;

            case 3 :
                exit(0);

            default :
                printf("Invalid value.");
        }
    }

    getchar();
}

void insert(int Data)
{
    nPtr n = (nPtr) malloc(sizeof(nPtr));

    if (n == NULL)
    {
        printf("Empty List.\n");
    }

    n->data = Data;
    n->next = NULL;

    if(head != NULL)
    {
        cur= head;
        while (cur->next != NULL)
        {
            cur = cur->next;
        }
        cur->next = n;
    }
    else
    {
        head = n;
    }
}

void display()
{
    struct Node* n;

    system("clear");
    printf("List contains : \n\n");

    while(n != NULL)
    {
        printf("\t->%d", n->data, "\n");
        n = n->next;
    }
}

Когда я запускаю код, не возникает никаких проблем или ошибок вообще. Но когда я вызываю одну из двух функций, которые я там создал, возникает ошибка «Ошибка сегментации». Я бы предположил, что что-то не так с моей malloc() функцией в void insert(), но я не могу точно определить, что не так в методе void display().

1 Ответ

0 голосов
/ 28 января 2020

Функция display() никогда не инициализирует n. Декларация должна быть:

nPtr n = head;
...