2016-08-05 11 views
-4

私はcで4つの異なるレコードを保持するために二重リンクリストを使用しています。二重リンクリストにノードを追加すると、最初のノードを除くすべてのノードが削除されるのはなぜですか?

二重リンクリスト用のスペースを作成する際に問題があります。 3つ以上のノードを追加しようとすると、最初のノードを除くすべてのノードが失われ、最初と最後のノードのデータが表示されます。私は2番目から最後までノードを見ることができません。私はノード間のリンクを変更しようとしましたが、動作しませんでした。ここに私のコードです。

struct node { 
    char name[100]; 
    char surname[100]; 
    char roll[100]; 
    char department[100]; 
    struct node *next; 
    struct node *prev; 
}; 

struct node *first_oto = NULL, *last_oto = NULL, *l; 

void insert() { 
    int i, counter = 1; 

    first_oto = (struct node*)malloc(sizeof(struct node)); 
    first_oto->prev = NULL; 
    first_oto->next = NULL; 

    printf(" %d- Name:", counter); 
    scanf("%s", first_oto->name); 
    printf(" %d-Surname", counter); 
    scanf("%s", first_oto->surname); 
    printf(" %d-Number", counter); 
    scanf("%s", first_oto->roll); 
    printf(" %d-Department", counter); 
    scanf("%s", first_oto->department); 
    first_oto->next = NULL; 

    for (i = 1; i < n; i++) { 
     counter++; 

     l = (struct node*)malloc(sizeof(struct node)); 

     printf(" %d-Name:", counter); 
     scanf("%s", l->name); 
     printf(" %d-Surname:", counter); 
     scanf("%s", l->surname); 
     printf(" %d-Number:", counter); 
     scanf("%s", l->roll); 
     printf(" %d-Department:", counter); 
     scanf("%s", l->department); 
     printf("\n"); 

     l->next = NULL; 
     l->prev = first_oto; 
     first_oto->next = l; 
    } 

私のコードは、最初のノードのレコードを取っています。私のプログラムはループのために動作しますが、それは他のノードを取りますが、最後のノードだけを追加します。それを修正するために私は何をすべきですか?

+1

これはコンパイルされますか? 'counter +'はどうしていると思いますか? –

+0

'first_oto-> next = l;' 'first_oto-> next'の前の値を消去します。 – chux

+0

あなたの最後のノードの前のノードがすべて前のノードではなく最初のノードであるようです。 –

答えて

0

状況を追加するための一時的な変数があるはず試してみてください。 forループで

 struct node *temp; 

l->next=NULLを割り当てた後我々は、一時のためにいくつかのコード粒子を追加する必要があります。最初の要素をtempとして保持し、temp変数を使用してデータを失わないようにします。

以下のコードでは、それを行います。

temp = (struct node*)malloc(sizeof(struct node)); 
    temp = first_oto; 
    while(temp->next!=NULL){ 
     temp = temp->next; 
    } 
    temp->next = l; 
    l->prev = temp; 
    last_oto = l; 

この問題を解決するには、この行を記述してください。

0

要素をリストに追加するコードが不完全です。

l->next=NULL; 
    l->prev=first_oto; 
    first_oto->next=l; 
    /* There's another thing you need to do right here. */ 
} 
-1

この

void insert(void) 
{ 
    struct node *new_node, *temp; 
    char ans = 'y'; 
    int pos; 
    do { 
     traverse(); 
     printf("Enter the element :\n"); 
     new_node = (struct node*)malloc(sizeof(struct node)); 
     scanf("%d", &new_node->info); 
     new_node->next = NULL; 
     new_node->prev = NULL; 
     if (start == NULL) { 
      start = new_node; 
      current = new_node; 
     } else { 
      printf("Enter the position at which u wanna enter : (1-%d)\n", count + 1); 
      scanf("%d", &pos); 
      if (pos == 1) { 
       start->prev = new_node; 
       new_node->next = start; 
       start = new_node; 
      } else 
      if (pos == count + 1) { 
       current->next = new_node; 
       new_node->prev = current; 
       current = new_node; 
      } else { 
       int i = 0; 
       temp = start; 
       while (i < pos - 2) { 
        temp = temp->next; 
        i++; 
       } 
       new_node->prev = temp; 
       new_node->next = temp->next; 
       temp->next = new_node; 
      } 
     } 
     printf("Wanna enter more ??\n"); 
     scanf(" %c", &ans); 
    } while (ans == 'y' || ans == 'Y'); 
} 
+1

「これを試してください」などの回答は使用しないようにしてください。良い答えは完全な解決策を提供しなければなりません(可能であれば説明が必要です)。 – zajonc

関連する問題