0

リンクされたリスト機能を使用するときに問題が発生するたびに。Visual Studio が突然動作しなくなりました。以下は私のコードです:

#include<stdio.h>
#include<stdlib.h>

typedef struct _listnode
{
int item;
struct _listnode* next;
}Listnode;

void printlist(Listnode *head);
void main(){
Listnode *head, *temp;
int i = 0;
head = malloc(sizeof(Listnode));
temp = head;
for(;i<3;i++){
    temp->item = i;
    if (i != 2){
        temp->next = malloc(sizeof(Listnode));
        temp = temp->next;
    }
    else
        temp = NULL;
}
printlist(head);
    }
    void printlist(Listnode *head){
if (head == NULL)
    printf("Your list is empty");
while(head != NULL){
    printf(" %d ",head->item);
    head = head->next;
}
printf(" \n ");
    }

    Output: 
    0 1 2 

そして、次のメッセージが表示されました ここに画像の説明を入力

何が起こっていたのか正確に教えてもらえますか?どんな助けでも大歓迎です。ありがとうございました

よろしくお願いします

4

1 に答える 1

0

リストを作成するときに、最終的なリンク ポインターを NULL に設定しないでください。代わりに temp->next を null に設定したい場合、temp を null に設定します。

すべてのトランザクションの後、リストを有効な状態に保つ方がはるかに「堅牢」です。現在、ループ内の if ステートメントに依存して、最後の反復を「リストへの追加」ではなく「リストの終了」操作に変換しています。誰かがその if ステートメントを一致するように変更せずに for ループの制限を変更した場合、再び壊れたリストに戻ることになります。次のようなことを試してください:

Listnode *head = NULL; /* start with an empty list */
Listnode *tail = NULL;  

for (i=0; i<3; ++i)
{
    ListNode *temp = malloc(sizeof(Listnode));
    temp->item = i;
    temp->next = NULL;
    if (head == NULL)
        head = tail = temp;
    else
    {
        tail->next = temp;
        tail = temp;
    }
}

ループにはまだ if ステートメントがありますが、参考になります。ループ本体は、単一リンク リストの末尾に新しいリスト エントリをプッシュする関数を作成する方法です。ヘッド ポインターとテール ポインターの両方を保持すると、これが効率的になり、リストの最後を見つけるためのループが回避されます。

重要なのは、ループがどのように変更されても、ループは反復ごとに 1 つのエントリを追加し、リストは各反復の最後で有効になるということです。

于 2013-10-30T02:50:17.880 に答える