Мой связанный список не работает после первой итерации - PullRequest
0 голосов
/ 04 октября 2018

Я не могу понять проблему После первой итерации, когда я беру новое значение ch, программа заканчивается. В какой-то момент я подумал, что мой printList () не работает, но это не выглядит так, пожалуйстапомощь.

#include<stdio.h>
#include<stdlib.h>
struct node {
    int data;
    struct node *link;
};
typedef struct node Node;
void insertAtBeginning(Node** head, int dat) {
    Node *temp = (Node *)malloc(sizeof(Node));
    temp->data = dat;
    if(*head != NULL){
        temp->link = *head;
        *head = temp;
    }
    temp->link = NULL;
    *head = temp;
}
void printList(Node* head) {
    printf("The list is : ");
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->link;
    }
    printf("\n");
}
void main() {
    Node *head = NULL;
    char ch;
    int element;
    printf("Do you want to insert an element? (Y/N) : ");
    scanf("%c", &ch);
    while (ch == 'Y' || ch == 'y')
    {
        printf("Enter the element : ");
        scanf("%d", &element);
        insertAtBeginning(&head, element);
        printList(head);
        printf("Do you want to insert more element? (Y/N)"); //this where i think it is not working
        scanf("%c", &ch);
    }
}

1 Ответ

0 голосов
/ 04 октября 2018

Когда список не пустой, ваша функция insertAtBeginning() сначала связывает новый элемент со старым списком, а затем:

temp->link = NULL;

, так что ссылка на содержимое старого списка теряется.Это следует делать только при создании первого элемента списка.Он должен быть в предложении else.

Вы также можете извлечь *head = temp; из блока if, поскольку это необходимо сделать в любом случае.

void insertAtBeginning(Node** head, int dat) {
    Node *temp = malloc(sizeof(Node));
    temp->data = dat;
    if(*head != NULL){
        temp->link = *head;
    } else {
        temp->link = NULL;
    }
    *head = temp;
}

Однако теперь, когда я смотрю на это, if не является необходимым, поскольку *head будет NULL именно в том случае, когда вы хотите назначить NULL.Так что это может быть просто:

void insertAtBeginning(Node** head, int dat) {
    Node *temp = malloc(sizeof(Node));
    temp->data = dat;
    temp->link = *head;
    *head = temp;
}
...