2016-08-13 25 views
0

リンクリストに新しいノードを挿入(最後に挿入)してから、リンクされたリスト全体を印刷するかどうかを尋ねるプログラムを書いた。ユーザーが値0を入力するたびに、プログラムは停止し、その時点までリンクされたリストを印刷します。ここで最後にノードを追加してリンクリストを作成するにはどうすればよいですか?

コードです:

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

struct ListNode 
{ 
    int data; 
    struct ListNode *next; 
}; 

int main() 
{ 
    int  val, 
      flag = 1; 

struct ListNode *p, 
        *head, 
        *temp; 

printf("press 0 to exit\n"); 

do 
{ 
    printf("enter the data : "); 
    scanf("%d", &val); 

    p = (struct ListNode *)malloc(sizeof(struct ListNode)); 

    if(head == NULL) 
    { 
     p -> data = val; 
     p -> next = NULL; 
     head = p; 
     temp = p; 
    } 
    else 
    { 
     p -> data = val; 
     p -> next = NULL; 
     temp -> next = p; 
    } 

    printf("continue?"); 
    scanf("%d", &flag); 

}while(flag != 0); 

temp = head; 

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

return 0; 
} 

今、私は出力を取得しています問題は、それが唯一の最初と最後のノードを印刷しているということです。その間の他のノードは印刷されていません。ここで

は、サンプル出力です:

番号:12 13 14 15

出力:12 15

誰も私が間違っているつもりですどこ私に説明してもらえますか?私はいつも関数をすべて関数に入れてやることができましたが、今は関数呼び出しを使わずに同じことを試したかったのです。ヘッドがNULLあるときは、次のif-elseブロックで

+3

ようこそスタックオーバーフロー。プログラム内の変数の値を見るために、デバッガを使うか、 'printf()'を追加することをお勧めします。これはあなたのコードで何が起こっているのかを理解するのに役立ちます。コードをデバッグする方法を学ぶことは重要なスキルであり、おそらく最初にコードを書くよりも重要です。 –

+4

1) 'head'は初期化されていません。 2) 'temp - > next = p;' - > 'temp = temp - > next = p;' – BLUEPIXY

+3

@BLUEPIXY:あなたは素敵な人の一人です。 ! ;-) – alk

答えて

4

if(head == NULL) 
    { 
     p -> data = val; 
     p -> next = NULL; 
     head = p; 
     temp = p; 
    } 
    else 
    { 
     p -> data = val; 
     p -> next = NULL; 
     temp -> next = p; 
    } 

は最初に、あなたはpheadtempの両方を割り当てています。したがって、tempは最初の要素を指します。その後、新しい要素を取得するたびにtempを更新せずに、その新しい要素にtemp->nextを再割り当てします。効果的には、毎回head->nextを割り当てています。 headを宣言、あなたはまた、初期化がありC.

+0

グローバル変数は、C言語でデフォルト(0)に初期化されます。ローカル変数のみがデフォルトでは初期化されません。 –

+0

あなたの助けをたくさんありがとう!出来た! :) – noob64

1

にローカル変数のためにデフォルトで実行されていないとして、NULLにそれを初期化する必要があるが、これを修正するには、

if(head == NULL) 
    { 
     p -> data = val; 
     p -> next = NULL; 
     head = p; 
     temp = p; 
    } 
    else 
    { 
     p -> data = val; 
     p -> next = NULL; 
     temp -> next = p; 
     temp = p; 

    } 

tempたびに更新する必要がありますコメントでBLUEPIXYで述べたように

  1. head

    は、初期化されていません:以下の問題があります。追加のノードを追加する場合

    struct ListNode *p, 
            /* *head, */ // ISSUE: head not initialized 
            head = NULL, 
            *temp; 
    
  2. 、あなたはまた、temp

    else 
    { 
        p->data = val; 
        p->next = NULL; 
        temp->next = p; 
        temp = p;  // NEED to update temp 
    } 
    

を更新していない、mallocの結果をキャストする必要はありません。

戻り値を確認して、mallocが成功したかどうかを確認することもお勧めします。同様に、この場合には:

p = malloc(sizeof(struct ListNode)); 
if (p == NULL) { 
    /* malloc failed. Code to handle the error */ 
} 
+0

mallocの型キャストに関する更新情報をありがとう! :) – noob64

1

あなたはuが非常に最初のノードを作成しただけtemppすなわち現在のノードを格納しています。Uは、今ではfine.Youを動作する

if(head == NULL) 
    { 
     p -> data = val; 
     p -> next = NULL; 
     head = p; 
     temp = p; 
    } 
    else 
    { 
     p -> data = val; 
     p -> next = NULL; 
     temp -> next = p; 
    } 

から

if(head == NULL) 
    { 
     p -> data = val; 
     p -> next = NULL; 
     head = p; 
     temp = p; 
    } 
    else 
    { 
     p -> data = val; 
     p -> next = NULL; 
     temp -> next = p; 
     temp=p; 
    } 

このコードスニペットを変更する必要が

whileの各反復後tempで現在のノードpへのポインタを格納する必要がありますループ。

+0

彼は多くの詳細な説明に感謝 – noob64

関連する問題