2017-05-10 1 views
-1

編集1:英語に翻訳するのを忘れました。今修正されました。 編集2:HEADERインスタンス。ヘッダを重複してリンクされたリストに要素を挿入しようとすると、「セグメンテーションフォールト」が発生するのはなぜですか? C言語

私は二重リンクリストに関する研究を開始しています。リストの最初または最後にアイテムを挿入する際に問題が発生しています。

重要:ヘッダーを使用しています。通常のインサートはすでにマスターされているので、これを行うことが重要です。

ありがとうございます!

void beginning_insert(ELEMENT *list, HEADER *l, int value) 
{ 
    ELEMENT * p = malloc(sizeof(ELEMENT)); 
    p -> info = value; 
    p -> next = l -> head; 
    p -> previous = NULL; 
    l -> head = p; 
    if(l -> tail == NULL) 
    { 
     l -> tail = l -> head; 
    } 
    else 
    { 
     (((l -> head) -> next) -> previous) = p; 
    } 
    l -> number_of_nodes++; 

    list = p; 
} 

機能を最後に挿入するために:使用

ELEMENT * end_insert(HEADER *l, int value) 
{ 
    ELEMENT * new = malloc(sizeof(ELEMENT)); 
    new -> info = valor; 
    new -> next = NULL; 
    new -> previous = l -> tail; 
    if(l-> head == NULL) 
    { 
     l -> head = new; 
    } 
    else 
    { 
     l -> tail -> next = new;  
    } 
    l -> tail = new; 
    l -> number_of_nodes++; 


    return new; 
} 

構造体:

typedef struct element 
{ 
    int info; 
    struct element * next;//control 
    struct element * previous;//control 

} ELEMENT; 

typedef struct header //control 
{ 
    ELEMENT * head; 
    int number_of_nodes; 
    ELEMENT * tail; 

} HEADER; 


//Header instance 
HEADER * start_header() 
{ 
    HEADER *l; 
    l = malloc(sizeof(HEADER)); 

    l -> number_of_nodes = 0; 
    l -> head = NULL; 
    l -> tail = NULL; 

    return l; 
} 
+2

ステップを... –

+0

はHEADERインスタンスが初期化された方法を、私たちを表示します。 –

+0

ヘッダーで 'head'と' tail'をNULLに初期化しましたか? – paddy

答えて

0

問題を解決しました。以前は、それは間違った方法で行われていた

HEADER * header = start_header(); 
を呼び出すときに コード正常に動作し、問題は:あなたのデバッガの貫通 HEADER header = start_header();

0

を二重リンクをより良く理解するために先頭に挿入する

機能リストヘッダーの使用を避けることをお勧めします。

代わりに、あなたはできるだけ早くあなたにこのメーク感覚としてこの

ELEMENT* go_start(ELEMENT* l) 
{ 
     while (l->prev) 
      l = l->prev; 
     return l; 
} 

ELEMENT* go_end(ELEMENT* l) 
{ 
     while (l->next) 
      l = l->next; 
     return l; 
} 

ようなものを使用する必要があり、あなたは簡単に新しいのelemをプッシュすることができるはずです。

そして、あなたの主は非常にシンプルな滞在する必要があり、その中にいないのmalloc:あなたはこのメインを実行すると予想される出力を得た場合

int main() 
{ 
    ELEMENT* list; 

    list = push_top(list, 18); 
    list = push_bottom(list, 18); 
    list = push_top(list, 18); 

    list = go_start(list); 

    while (l->next) 
    { 
      printf("%d\n", l.info); 
    } 

    return (count_elem(list)); 
} 

は、リンクリストのご理解が良いことがあります;)

お楽しみください、

PS:あなたのsegフォールトはおそらくあなたのelse条件から来ます。あなたはおそらくあなたの指針で遠すぎるでしょう。

+0

ヒントのためのヒント。私は実際には二重にリンクされたリストを自分で理解することができました。しかし、次のステップは本当にヘッダーを使用してそれを行うことです。 –

+0

while()ループはループしません。 –

関連する問題