第一次迭代后我的链表未运行

时间:2018-10-04 17:05:41

标签: c data-structures linked-list singly-linked-list

我无法理解问题 在第一次迭代后,当我采用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 :(得分:2)

当列表不为空时,您的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;
}