我无法理解问题 在第一次迭代后,当我采用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);
}
}
答案 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;
}