2016-11-17 24 views
0

私はプロジェクトを進めています。順序付きリストにノードを挿入する必要があります。私はこのコードを試しましたが、プログラムはクラッシュし続けます。Cの順序付きリンクリストにノードを挿入する

呼び出し元の関数である:ここでは

head = insertorder(node, head); 

は、関数定義のコードです:

nodeptr_t insertorder(nodeptr_t nn, nodeptr_t head) { 
    nodeptr_t w; 

    w = head; 
    if(head==NULL) 
     return nn; 

    while(w->next!=NULL && w->next->key < nn->key) 
     w = w->next; 

    w->next = nn; 
    nn->next = NULL; 
    return head; 
} 
+2

ここで、デバッガのパワーと[プログラムのデバッグ](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)について知ることができます。また、ポインタをtypedefしないでください。 –

+2

@GillBates優れたスクリーンネーム:-) –

+0

私はこのフィールドを初めて使っているデバッガのcuzについてもっと教えていただけますかポインタのためにプロジェクトの仕様の1つでした: 'nn-> next = NULLが必要な場合は/ – TheGame

答えて

1

このコードを試してください。

nodeptr_t insertorder(nodeptr_t nn, nodeptr_t head){ 
nodeptr_t w; 

if(head==NULL || head->key >=nn->key) 
{ 
    nn->next = head; 
    head = nn; 
} 
else 
{ 
    w = head; 
    while(w->next!=NULL && w->next->key < nn->key) 
     { w = w->next;} 
    nn->next = w->next; 
    w->next = nn; 
} 
return head; 
} 

可能であれば、実際のクエリで「nodeptr_t」の宣言をコピーしてください。

2

あなたは、新しいノードを挿入した後、尾を失っています。次の操作を行う必要があります。

... 
while(w->next!=NULL && w->next->key < nn->key) 
    w = w->next; 
nn->next = w->next; 
w->next = nn; 
... 
+1

また、 'nn'を返すだけでなく、' head'がもともと 'NULL'だった場合、@Senouyは新しいノードに' head'ポインタを設定しなければなりません。 – abacles

+0

問題はすべてがうまくいくためです。しかし、それらをランダムにscanfすると、関数insertはそれらを順番に選択して挿入するだけです! – TheGame

+0

このコードを共有できますか? –

関連する問題