2016-10-11 6 views
1

私は文字列の順番でリンクリストにノードを挿入しようとしています。私は、私がプログラムを実行するときにセグメンテーションフォルトに達するので、私が信じているポインターに問題があります。ノードには、文字列のchar配列と数値を表すintという2つのデータフィールドがあります。リストは名前だけでソートする必要があります。Cで順番にlinkedListに挿入

typedef struct node { 
    char *name; 
    int num; 
    struct node *next; 
} Node; 

Node *head = NULL; 

int insertInOrder(char *newName, int favNum) { 
    Node *current = head; 
    Node *newNode; 
    Node *tempNode; 
    int nodeIn = 0; 

    if (head == NULL) { 
    head = malloc(sizeof(Node)); 
    if(head == NULL){ 
     fprintf(stderr, "ERROR: Out of memory\n"); 
     return 1; 
    } 
    head->name = newName; 
    head->num = favNum; 
    head->next = NULL; 
    } else { 
    while (current != NULL) { 
     if (strcmp(newName, current->name) == 0) { 
     fprintf(stderr, "ERROR: Name already exists in the list\n"); 
     return 1; 
     } 
     if (strcmp(newName, current->name) < 0) { 
     tempNode = current->next; 
     newNode = malloc(sizeof(Node)); 
     if(newNode == NULL){ 
      fprintf(stderr, "ERROR: Out of memory\n"); 
      return 1; 
       } 
     newNode->name = newName; 
     newNode->num = favNum; 
     newNode->next = tempNode; 

     current->next = newNode; 
     nodeIn = 1; 
     } 
     current = current->next; 
    } 
    if(nodeIn == 0){ 

     newNode = malloc(sizeof(Node)); 
     if(newNode == NULL){ 
     fprintf(stderr, "ERROR: Out of memory\n"); 
     return 1; 
     } 
     newNode->name = newName; 
     newNode->num = favNum; 
     current->next = newNode; 
     newNode->next = NULL; 
    } 
    } 
    return 0; 
} 
+0

あなたは 'valgrind'を実行しようとしましたが、どの行でセグメンテーションフォルトが発生しましたか? – galfisher

+0

'insertInOrder'の呼び出しを表示できますか?私は問題がそこにあると思う。 – Michas

+0

データ文字列が現在のノードのデータ文字列よりも小さい場合は、nextnodeの前ではなく、currentnodeの前に挿入し、新しいノードを前のノードからリンクする必要があります。 –

答えて

0

はあなたが世話をする必要があなたのコードの欠陥ある - のためのstrcmp(newName, current->name) < 0場合


if(head!=NULL) { write code for the case if (strcmp(newName, current->name) > 0) also. }

2.

非常に最初のノード、次に私はする必要があります最初のノードの前にノードを置いてください。

3.

そして、あなたは、あなたがwhileループの外にbreakに必要な、while loopの任意の繰り返しで新しいノードを挿入した後。

この修正が役立つことを願っております。

0

は、すべてのこれらのケースをテストしていることを確認します -

  • 空のリスト、リスト内の

  • 最初のノード。リスト内の2つの項目間の2つ以上の

  • ノードのリストと、リスト内の

  • 最後のノード。リスト内

  • 第二ノード

  • リスト内の最後のノードへの第二
  • 。 「テスト」すべてのこれらのケースによって

私はプログラムを実行し、それは私がコードを見て、そのコードは、各ケースのために実行する方法を理解する意味クラッシュ見るという意味ではありません。

私はそれが何をするのか見ているときに箱と矢の小さな図案をするのが好きです。ステップバイステップでそれを取ることを恐れてはいけません。

上記のコードを見ると、上記のケースの多くが正しく処理されていないことがわかるので、segフォルトが発生するのは驚きではありません。

関連する問題