2017-06-15 16 views
-1

このコードで何が間違っていますか。挿入操作中に、2番目の要素を挿入するとプログラムが停止し、Windowsはプログラムの動作が停止したことを示します。ビルドログには、Process terminated with status -1073741510と表示され、時にはProcess terminated with status 255と表示されます。 main関数にreturn文があるにもかかわらず。リンクされたリスト - 最後にノードを挿入

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

void insert(int); 
void print(); 
struct node 
{ 
    int data; 
    struct node *link; 
}; 
struct node *temp, *temp1, *temp2, *head, *end; 
int main() 
{ 
    int i, ch, a; 

    head = NULL; 
    temp = (node*)malloc(sizeof(node)); 
    printf("Enter the number of items"); 
    scanf("%d", &ch); 
    for(i = 0; i < ch; i++) 
    { 
     printf("\nEnter the number"); 
     scanf("%d", &a); 
     insert(a); 
     **call to insert** 
     print(); 
    } 
    return 0; 
} 

void insert(int x) 
{ 
    temp = (node*)malloc(sizeof(struct node)); 
    temp->data = x; 
    temp->link = NULL; 
    temp2 = head; 
    if(head == NULL) 
    { 
     head = temp; 
    } 

    else 
    { 
     while(temp2 != NULL) 
     { 
      temp2 = temp2->link; 
     } 
     temp2->link = temp; 
    } 
} 

void print() 
{ 
    temp1 = head; 
    printf("\nthe list is:"); 
    while(temp1 != NULL) 
    { 
     printf("%d", temp1->data); 
     temp1 = temp1->link; 
    } 
} 
+3

あなたのコードはバグのためにクラッシュしています。デバッガで実行すると、クラッシュした行を教えてくれるはずです。本当に明白な間違いを見ることができます。 –

+2

'temp2-> link = temp;': 'temp2'はwhileループの後に' NULL'です。 – BLUEPIXY

+2

グローバル変数が多すぎます! 'print()'の 'temp1'は' print() 'に対してローカルでなければなりません。関数に 'head'を渡す方が良いでしょう。 'insert()'の 'temp'と' temp2'はローカル変数でなければなりません。ここでは、 'head'を気にする必要があります。それを関数に渡して新しいヘッドを返すほうがよいでしょう(リストに最初の要素を追加するときを除いて、古いヘッドと同じです)。あなたは 'end'を定義しますが、決してそれを使用しません。それはうんざりです。 –

答えて

-1

機能

else 
{ 
    while(temp2 != NULL) 
    { 
     temp2 = temp2->link; 
    } 
    temp2->link = temp; 
} 

のこの部分は間違っています。ループを終了した後、ノードtemp2はNULLに等しい。したがって、このステートメント

temp2->link = temp; 

結果は未定義の結果になります。

変更コードはまた、メイン

temp = (node*)malloc(sizeof(node)); 

でこの文は意味をなさないとメモリリークにつながるしない、次のよう

else 
{ 
    while(temp2->link != NULL) 
    { 
     temp2 = temp2->link; 
    } 
    temp2->link = temp; 
} 

スニペット。

変数ヘッド

struct node *temp, *temp1, *temp2, *head, *end; 

のを除いて、グローバル変数のこれらの宣言にも意味がありません。

関連する問題