我无法理解问题 第一次迭代后,当我取 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);
}
}
当列表不为空时,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;
}