2017-04-09 12 views
-1

リンクリストに関しては、私が何をしているのか分かりません。ここで何かがセグメンテーションフォールトエラーを引き起こしていますが、私はそれが混乱していることは言うまでもなく、どこにリンクされている可能性があるかを知るためにリンクリストについて十分に知りません。私はデバッグのためのコードを持っていましたが、投稿する前にそれを取り出しました。コードはmainのfor文に行き着いているようだが、エラーが出る。ユーザーは、印刷するノードの数を入力し、多くのノードに乱数を印刷します。各行には10個の文字が印刷されます。リンクされたリストでセグメンテーションフォールトを取得する

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

struct node_def 
{ 
    int data; 
    struct node_def *next; 
}; 
typedef struct node_def node; 

node *makeNode (int val); 
node *insertFront(node *head,node *new); 
void printList(node *head); 

int numNodes = 0; 

int main() 
{ 
    srand(time(0)); 

    int i = 0; 

    node *head = NULL; 
    node *new = NULL; 

    printf("How many nodes? ", numNodes); 
    scanf("%d", &numNodes); 
    printf("\n"); 

    head = insertFront(head, new); 
    for(i = 0; i < numNodes; ++i) 
    { 
     makeNode(numNodes); 
    /* printList(head);*/ 
     /*insertFront(head, new);*/ 
    } 
    printList(head); 

    printf("\n"); 
    return 0; 
} 
node *makeNode (int val) 
{ 

    node *head = NULL; 

    node *new = malloc(sizeof(node)); 
    new->data = rand() % 10000; 
    new->next = NULL; 
    if (head == NULL) 
     head = new; 



    return new; 
} 
node *insertFront(node *head, node *new) 
{ 

    new->next = head; 

    return head; 
} 
void printList(node *head) 
{ 
    int j = 0; 
    for(j = 0; j < numNodes; ++j) 
    { 
     while (head != NULL) 
     { 
      printf(" %4d", head->data); 
      head = head->next; 
     } 
     if(j % 10 == 0) 
      printf("\n"); 
    } 
    return; 
} 
+2

プログラムが動作していませんか?非常に具体的な説明。どのような入力をしますか?コアダンプとは別に、どのような出力を得ますか?デバッガはあなたに何を伝えますか?どのくらいの診断印刷が追加されましたか、それが何を伝えましたか?アサーションを使用できますか? –

+0

@JonathanLefflerコードはmainのfor文に行き着いているようですが、エラーが出ます。ユーザーは、印刷するノードの数を入力し、多くのノードにはランダムな番号が割り当てられて印刷されます。そのうち10行は1行に印刷されます。 – mychem97

+0

'new = NULL'で' insertFront'を呼び出します。おそらくデバッガの使い方を学ぶべきでしょう。 – Siguza

答えて

1

プログラムには複数の問題があります。基本的に、あなたが書いたコードは、リンクされたリストをまったく実装していません。

  1. この関数のmakeodeは正しくありません。

    node *makeNode (int val) 
    { 
    
        node *head = NULL; 
    
        node *new = malloc(sizeof(node)); 
        new->data = rand() % 10000; 
        new->next = NULL; 
        if (head == NULL) 
         head = new; 
    
        return new; 
    } 
    

    このコードでは、headはNULLに初期化されます。したがってif(head == NULL)は常にtrueになります。あなたがそれを使用していないときに、なぜvalNo paramがmakeNodeに必要なのですか?あなたがここに頭= NULLをチェックする必要はありません

    node *makeNode() 
    { 
        node *new = malloc(sizeof(node)); 
        new->data = rand() % 10000; 
        new->next = NULL; 
        return new; 
    } 
    

    私の提案:あなたは以下のコードにそれを更新することができます。

  2. メインでNULLポインタの逆参照を実行しています(segfaultを取得した理由です)。

    node *head = NULL; 
    node *new = NULL; 
    
    head = insertFront(head, new); 
    

    ここで、headとnewは両方ともNULLです。今すぐinsertFrontに、new->nextはsegfaultです。

    insertFrontへのパラメータ、ヘッド新しいは、初期化されていません。あなたはそれを挿入する前に頭のためのメモリを最初に割り当てる必要があると思いませんか?

    私の提案:(メイン関数内)

    node *head = makeNode(); 
    for(i = 0; i < numNodes; ++i) 
    { 
        node *new = makeNode(); 
        head = insertFront(head, new); 
    } 
    
  3. 再びがprintlist機能も間違っています。私は一度それを見て、それをデバッグすることをお勧めします。私はそれを1行ずつ行きたくはありません。

    しかし、ここではあなたが本当にやるべきものだ。

    void printList(node *head) 
    { 
        if (head == NULL) return; 
    
        node *temp = head; 
    
        while (temp != NULL) 
        { 
         printf(" %d\n", temp->data); 
         temp = temp->next; 
        } 
    } 
    

    それは簡単なことです。私はコードをよく見て、それを段階的にデバッグしようとお勧めします。

また、ノードをリストに挿入する前に、そのノードにメモリを割り当てることを確認してください。ペンと紙の道を進み、コードステップとステップをトレースします。それが私がリンクリストで作業する方法です。

+0

悪い分析ではありません。あなたはなぜ 'val'が' makeNode() 'に渡されたのか尋ねませんでしたが、関数に渡されるものの代わりに乱数を値として使用します。 'makeNode()'はパラメータを取らない関数であるかのように呼び出しています。 –

+0

うん。そこに有効なポイントがあります。私はmakeNodeがvalパラメータを取っていたことに気付かなかったと思います:)コードを更新しています。 – paratrooper

+0

'print'()の' if'テストは非常にマイナーな最適化です。あなたはそれを完全にうまく省略することができ、機能も同様に機能します。 –

関連する問題