【发布时间】:2016-12-31 02:48:45
【问题描述】:
我有一个 C 程序可以在链表的开头插入元素,但是当我尝试打印元素时,它总是会跳过第一个元素。有人可以指出我在我的程序中做错了什么。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void PrintElements();
void InsertElement(int x);
struct node
{
int data;
struct node* next;
};
struct node* HEAD;
struct node* temp;
struct node* temp1;
void PrintElements()
{
temp1=HEAD;
while(temp1->next!=NULL)
{
printf("\n\r Data %d\n\r",temp1->data);
printf("\n\r Address %x\n\r",temp1->next);
temp1=temp1->next;
}
}
void InsertElement(int x)
{
struct node* temp=(struct node*)malloc(sizeof(struct node));
temp->data=x;
temp->next=HEAD;
HEAD=temp;
}
int main()
{
int i, x;
int n; //n stores the number of elements to be added to the linked list
HEAD=NULL; //Assigning HEAD to null when there are no elements in the list
printf("Enter the number of elements\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\n\rEnter the number");
scanf("%d",&x);
InsertElement(x);
PrintElements();
}
return 0;
}
当我更改以下行时
while(temp1->next!=NULL)
到
while(temp1!=NULL)
程序正常运行,但我仍然无法理解原因。
【问题讨论】:
-
因为在一个中检查指向一个元素的指针,而在另一个中检查指向 next 元素的指针,即您以不同的条件终止。尝试使用更长的列表,您会看到会发生什么。 PS:全局变量是邪恶的。
-
如果你检查
while(temp1->next!=NULL),那么你总是会跳过第一个元素。 -
更改后第二个问题的答案是:插入第一个节点时会发生什么?此时
HEAD的价值是多少? (提示:NULL)。由于您始终在列表的开头插入,因此您的first节点将始终是打印的 last 节点。打印 last 节点时,node->next的值是多少? (它是NULL)。如果在到达最后一个节点(第一个值)temp1->next == NULL时使用while(temp1->next!=NULL),则循环终止,最后一个节点(第一个值)不打印。进行建议的更改可以消除该问题。
标签: c data-structures linked-list singly-linked-list