0

サンプルリストの実装を確認するために、次のコードを試しました。しかし、結果を表示しようとすると、ループ内に入ります。どこが間違っているのかわかりません。

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

typedef struct linkedlist
{
    int data;
    struct linkedlist *next;
}node;

int main()
{
    int ch,num;

    node *head=NULL;
    head=(node *)malloc(sizeof(node));
    node *new=NULL;
    new=(node *)malloc(sizeof(node));
    node *temp=NULL;
    temp=(node *)malloc(sizeof(node));
    printf("\n1.Insert to list");
    printf("\n3.Display the list");
    printf("\n Enter Choice->");
    scanf("%d",&ch);
    switch(ch)
    {
     case 1:printf("\n Enter data->");
            scanf("%d",&num);
            new->data=num;
            new->next=NULL;
            head->next=new;
            break;

     case 3: temp=head;
            while(temp!=NULL)
            {
                printf("\n %d",temp->data);
                temp=temp->next;
            }


                break;
     default:printf("Wrong Choice");
              break;

    }
    return 0;
 }
4

3 に答える 3

1

これが宿題の質問のように感じるのはなぜですか?

ここにいくつかのヒントがあります:

  1. head割り当てられますが、初期化されることはありません。ここから印刷を開始します。率直に言って、クラッシュしないことに驚いています。

  2. メニューを使用すると、リストを印刷したり、番号を入力したりできます。その後、プログラムは終了します。番号を入力してから、プログラムを再度実行してリストを印刷していると思われます。プログラムの状態は、実行間で保持されません。

于 2012-10-17T18:55:06.577 に答える
1

ここには2つの間違いがあります。

  1. 「新しい」を一度だけ割り当てています。これは、ユーザーが「1」を入力するたびに同じノードを再利用し、実際にノード自体にリンクしていることを意味します。
  2. 「temp」は使用していないため、ノードを割り当てる必要はありません。実際には、次の行で割り当てられたノードへのポインタを失っています。case 3: temp=head;これは「メモリ リーク」と呼ばれます。

ポインタについてもう少し勉強することをお勧めします。彼らはあなたを混乱させているようです。

于 2012-10-17T18:43:36.900 に答える
0

私は次の問題を見ることができます:

1)オプションをループしていないため、ユーザーはプログラムの実行ごとに1つのこと(挿入または表示)を実行できます。挿入することを選択した場合は表示できず、表示することを選択した場合は表示するリストがありません。

2)リストに新しいノードを挿入するたびに、新しいノードを作成する必要があります。現在、同じノードのデータを変更しているだけです(newが指す)。

于 2012-10-17T18:46:54.267 に答える