2016-05-12 3 views
0

コードを数え、私はこれを実行すると、私はコードリンクリストCの基本的な例は、常にセグメンテーションフォールトをスロー

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/* 
* File: index.c 
* Author: nikos 
* 

* Created on May 6, 2016, 9:19 AM 
*/ 

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

/* 
* 
*/ 
struct people { 
    int age; 
    char *name; 
    struct people * next; 
}; 
typedef struct people people; 

void count(people person) { 
    people *current; 
    people *next; 
    current = &person; 
    next = person.next; 
    int count = 1; 
    while (current) { 
     printf("age : %d\n", current->age); 
     printf("name : %s\n", current->name); 
     count++; 
     current = next; 
     if (next->next != NULL) { 
      next = next->next; 
     } else { 
      next = NULL; 
     } 
    } 
    printf("%d\n", count); 
} 

int main(int argc, char** argv) { 
    people person = { 
     .name = "nikos", 
     .age = 25 
    }; 
    person.next = malloc(sizeof (people)); 
    person.next->age = 26; 
    person.next->name = "test"; 
    person.next->next = NULL; 
    count(person); 
    return 0; 
} 

を以下していることは、ループを実行し、リストの内容を出力しますが、それはセグメンテーションフォルトを与えるヌル当たったとき。

なぜ私には何かが間違っているように見えません。

これは基本的なロジックで、次の内容をチェックします。ヌルであればループを止め、もう一度ステップを続けます。

+1

あなたのコードには明確なロジックがありませんが、確かに理解できる*ですが、明確ではありません。 'while'ループの代わりに' for(current =&person; current!= NULL; current = current-> next){printf()...} 'を使用すると、問題は引き続き発生します。 –

+1

ループの2番目の反復では、 'next'はNULLですが、' next-> next'を使って逆参照します。 –

+0

@IgorTandetnikそれは私が言っていることです、それはそのような単純な作業のために複雑です。 –

答えて

2

単純なものには複雑なコードを書き込まないでください。できるだけシンプルに書くようにしてください。私はすぐに明確なロジックを作成し、任意の愚かなミスを防止するであろうことを書くの道を見たこと、それは簡単な事はとても大変だった達成するために望んでいることを知っているあなたのコードを理解しようとすると、

void 
count(people person) 
{ 
    int count = 0; 
    for (people *node = &person ; node != NULL ; node = node->next) 
    { 
     printf("age : %d\n", node->age); 
     printf("name : %s\n", node->name); 

     count++; 
    } 
    printf("%d\n", count); 
} 

int 
main(void) 
{ 
    people person = {.name = "nikos", .age = 25}; 

    person.next = malloc(sizeof(people)); 
    if (person.next == NULL) 
     return -1; 

    person.next->age = 26; 
    person.next->name = "test"; 
    person.next->next = NULL; 

    count(person); 

    return 0; 
} 

これをチェックしてくださいあなたのあなたは next NULL

next = NULL; 

を設定し、あなたが0かどうかを確認する必要があり

if (next->next != NULL) 

でそれを間接参照しようとするためのコードは、失敗しましたwhile条件付きではです。

while ((current != NULL) && (next != NULL)) 

しかし、このコードは依然として信じられないほど複雑で扱いにくいものです。

はそうネクスト>次を参照しようとすると、次のNULLで、

if (next->next != NULL) 
    next = next->next; 
else 
    next = NULL; 

はあなたがリストの最後の項目を表示しました

next = next->next; 
+0

私はまだ私のコードが動作することを拒否する理由を得ることができません – nikoss

+1

さらに、構造体を 'const'ポインタとして渡してください。 – Lundin

+0

ありがとうございます@@haharob今それは意味をなさない:) – nikoss

2

とまったく同じ効果を持っていることを参照してください。 'if' stmtは本当にNULL-> nextと言っています!あなたのセグメンテーションがあります。不必要なロジックの複雑さにより、見るのがさらに難しくなりますが、それは起こっていることです。

関連する問題