私が(作成の次の行に示すように、リンクされたリストの最後のノードへのポインタとしてPTRを使用しています。コードから守っ)機能: - にいる間
if (start==NULL)
start = ptr = head;
else
{
ptr->next=head;
ptr=head;
}
表示機能、あなたは再び
ptr = start;
をinitialiingして、ptrが次の行のようにゼロになるループの最後に横断している: -
while(ptr!=NULL)
{
printf("%d->",ptr->num);
ptr=ptr->next;
}
(同様delastで()とデラニー()関数は、次の操作をしている: -
free(ptr);
再び従ってセグメンテーション障害をもたらす、PTR =ヌルを作ることになる 。 )
したがって、最初にリストを作成すると、ptrの値は保持されるため、コードは正常に機能しますが、リストを表示したり要素を削除したりすると、リストが作成されますオプション1)は、PTRの値がヌルになるので、セグメンテーション違反で
ptr->next = head;
結果。
したがって、create()関数で* ptrの代わりに新しいポインタsay * endを使用し、end = nullの値を決して使用しないでください。以下に示すように: -
void create()
{
do{
printf("Enter the num:");
head=(NODE *) malloc(sizeof(NODE));
scanf("%d",&head->num);
head->next=NULL;
if(start==NULL)
start=end=head;
else
{
end->next=head;
end=head;
}
printf("Do you want to enter more elements:(1/0)");
scanf("%d",&ch);
}
while(ch==1);
}
またはリストを作成するとき、あなたは、あなたが新しい要素を追加するために、リストの最後に横断し、代わりの直接終了ポインタを(使用することができますので、余分を保存する必要はありません終了ポインタ)。
void create()
{
do{
printf("Enter the num:");
head=(NODE *) malloc(sizeof(NODE));
scanf("%d",&head->num);
head->next=NULL;
if(start == NULL)
start = head;
else
{
ptr = start;
while (ptr->next != NULL){
ptr = ptr->next;
}
ptr->next = head;
}
printf("Do you want to enter more elements:(1/0)");
scanf("%d",&ch);
}
while(ch==1);
}
[MCVE]を表示してください –
ヒント:デバッガの使い方を学んでください。 –
グローバル変数( 'head'、' ch'、 'start'と' ptr')を大量に使用することで、プログラムを根本から考え直すべきだと思います。 –