2016-06-27 4 views
-2
以下

は、C言語のコードです:単独リンクされたリストの最後にノードを挿入する次のコードが機能しないのはなぜですか?

関数コール:

あなたはこのようながある場合にそうでなければ、(リンクネスを失うことになる new_nodeに、リストの最後の要素をリンクする必要があり
insert(&head,value); 

void insert(struct node** headref,int value) 
{ 
    struct node* head = (*headref); 

    while(head!=NULL) 
    { 

     head= head->link; 
    } 

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

    new_node->data=value; 
    new_node->link=NULL; 

    head=new_node; 
} 
+1

はどのようにリストは、新しい要素について知ることになっているのですか?新しい要素を指すようにリストの最後の項目の 'link'メンバーを設定する必要があります。 'head'がNULLになると、' link'メンバを設定する必要がある要素を失いました。より良いループ終了条件は 'while(head-> link!= NULL)'となります。 – enhzflep

+0

推奨されていないので、頭を動かさないことをお勧めします!!これは、リンクされたリストの開始ノードを常に指し示すべきである参照ポインタです。代わりに他のポインタを使用してください。 –

答えて

0

あなたのリストの単語:))。サイクル内には2つのポインタ-を格納する必要があります。これには、前の要素(headの前の要素)へのポインタがあります。空リストがある場合は特に注意してください!このループheadの終わりに

0
while(head!=NULL) 
{ 
    head= head->link; 
} 

は。あなたが最後のノード

while(head->link!=NULL) 
{ 
    head= head->link; 
} 

で停止した後、今、あなたがする必要がある

head->link = new_node; 

ような何かをしたい場合がありますNULLだろうリストが空の場合は、head=NULLの場合はhead->linkがエラーをスローするので、特に注意してください。 あなたは、あなたが期待されていないnew_nodeで最後のノードheadを交換する

//allocate new_node here 
if(head==NULL) 
{ 
    *headref = new_node; //Note only in this case would headref ever change 
} 
0

のように最初にチェックを入れることができます。最後のノードまでのループと、以下のようにhead->linknew_nodeを指すようにします:

insert(&head,value); 

void insert(struct node** headref,int value) 
{ 
    struct node* head = (*headref); 

    while(head->link !=NULL) 
    { 

     head= head->link; 
    } 

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

    new_node->data=value; 
    new_node->link=NULL; 

    head->link=new_node; 
} 
+0

あなたは 'head'ノードの後ろにその要素を挿入しますか?私は正しい? –

+0

はい.. 'while'ループの最後に' head'ノードはリンクされたリストの最後のノードを指しています。 'new_node'は' head'ノードの後に​​挿入されます。 – Fazlin

+0

5つの要素があり、「頭」が最初の要素を指しているシナリオを考えてみましょう。 'new_node'が挿入された後(あなたのロジックに従って' head'の後)、 'new_node'がどのノードに指し示されますか?あなたの 'new_node-> link = NULL'が表示されています。私はいくつかの効果があると思う! –

0

ロジックミス。これを試して。

struct node* new_node=(struct node*)malloc(sizeof(struct node)); 
new_node->data=value; 
new_node->link=NULL; 

if (!head) 
{ 
    head = new_node; 
    return; 
} 

// Use for or while loop as below. 
// 1. for(;head->link;head=head->link); 
// or 
/* 2. */ 
while (head->link) 
{ 
    head = head->link; 
} 
head->link = new_node; 

頭の名前をいくつか意味のある名前に変更すると便利です。

+0

あなたは' headref'の変更を反映していません –

0

関数ローカル変数headは、新規に作成されたノードに割り当てられます。関数を終了すると、このローカル変数は破棄され、元のリストは変更されません。

また、このループ

while (head != NULL) 
{ 
    head = head->link; 
} 

意味がありません。実際には、それは、以下の実証プログラムに示されているように見えることができます

head = NULL; 

機能の代わりに使用することができます。

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

struct node 
{ 
    int data; 
    struct node *link; 
}; 

int insert(struct node **head, int value) 
{ 
    struct node *tmp = malloc(sizeof(struct node)); 
    int success = tmp != NULL; 

    if (success) 
    { 
     tmp->data = value; 
     tmp->link = NULL; 

     while (*head) head = &(*head)->link; 

     *head = tmp; 
    } 

    return success; 
} 

void display(struct node*head) 
{ 
    for (; head != NULL; head = head->link) printf(" %d", head->data); 
} 

int main(void) 
{ 
    const int N = 10; 
    struct node *head = NULL; 

    int i = 0; 
    while (i < N && insert(&head, i)) i++; 

    display(head); 

    return 0; 
} 

その出力は

0 1 2 3 4 5 6 7 8 9 
関連する問題