リンクリストの先頭に要素を挿入する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)
にプログラムが正常に動作しますが、私はまだ理由を理解することはできませんよ。
要素のポインタをチェックし、もう1つでは_next_要素へのポインタをチェックする、つまり異なる条件で終了しているためです。長いリストを試してみると、何が起こるかが分かります。 PS:グローバル変数は悪いです。 – Jens
'while(temp1-> next!= NULL)'でチェックすると、最初の要素はスキップされます。 – RoadRunner
変更後の2番目の質問に対する答えは、最初のノードを挿入するとどうなりますか?その時点で 'HEAD'の価値は何ですか? (ヒント: 'NULL')。あなたは常にリストの先頭に挿入するので、 'first'ノードは常に* last *ノードになります。 * last *ノードを印刷するとき、 'node-> next'の値は何ですか? (これは 'NULL'です)。最後のノード(最初の値) 'temp1-> next == NULL'に到達したときに' while(temp1-> next!= NULL) 'を使うと、ループは終了し、最後のノード(最初の値)は出力されません。提案された変更を行うことでその問題は解決されます。 –