2016-07-01 10 views
1

アルファベット順にリストをソートしようとしていますが、いくつか問題があります。私は以下を持っています:アルファベット順にリンクされたリストを並べ替え

struct listNodeData 
     { 
      int value; 
      char *position; 
      char *lastName; 
      struct listNodeData * next; 
     }; 
     typedef struct listNodeData listNodeData; 

void sortList(listNodeData *List) 
{ 
    int swapped; 
    listNodeData *ptr1; 
    listNodeData *lptr = NULL; 

    do 
    { 
     swapped = 0; 
     ptr1 = List->next; 

     while (ptr1->next != lptr) 
     { 
      if (strcmp(ptr1->lastName,ptr1->next->lastName) > 0) 
      { 
       swap(ptr1,ptr1->next); 
       swapped = 1; 
      } 
      ptr1 = ptr1->next; 
     } 
     lptr = ptr1; 
    } 
    while (swapped); 

} 

void swap (listNodeData *a,listNodeData *b) 
{ 

    char *lastName = malloc(sizeof(char) * 20); 
    strcpy(lastName,a->lastName); 
    strcpy(a->lastName,b->lastName); 
    strcpy(b->lastName,lastName); 

} 

リンクリストを姓でソートしようとしています。今私はちょうど姓と一緒に値と位置を交換することを心配する前に、私のノードの最後の名前を交換しようとしています。私のプログラムをコンパイルすると、それを実行するとバスエラー10が発生します。

なぜ私はバスエラーを取得しているのか正確にはわかりません。私はそれを見て、それは私のstrcmpと関係がありますか?なぜ私はノードを初期化したときにlastNameをmallocし、スワップ関数の内部でmallocしているのかわかりません。

これは、あなたがmallocのバッファを使用しない

newNode->lastName = malloc(sizeof(char) * 20); 
newNode->lastName = lastName; 

、私はあなたでは、初期化コードを ptr1 = List->next代わりのptr1 = List

listNodeData *initNode(int number,char *lastName,char *position) 
{ 
    listNodeData *newNode; 
    newNode = malloc(sizeof(listNodeData)); 
    newNode->position = malloc(sizeof(char) * 20); 
    newNode->position = position; 
    newNode->lastName = malloc(sizeof(char) * 20); 
    newNode->lastName = lastName; 
    newNode->value = value; 
    newNode->next = NULL; 
    return (newNode); 
} 
+0

を使用すると、リンクリストで使用されるデータを初期化する方法は? –

+0

Ill投稿を今編集してください – FreeStyle4

+0

ちょっとした注意: 'typedef struct listNodeData listNodeData;'という行は必要ありません。すでに 'struct'として定義されている' listNodeData'型がすでにあります。 – mvidelgauz

答えて

1

を持っている理由thatsのようにリンクされたリストは、ダミーのヘッダーノードを持っています'ed。代わりに、関数に与えられたlastNameのバッファへのポインタを置き換えます。バッファに姓を移動するにはstrcpyを使用します。

strcpy(newNode->lastName, lastName); 

注:これは、両方のために行われる必要があるので、同様にpositionプロパティと同じ問題があります。注意すべき

他のいくつかの問題:

  • は、文字列に割り当てられたスペースはありませんスワップ
+0

完全に忘れてしまった!今すぐ試してみよう – FreeStyle4

+0

すべてが今完全に動作する – FreeStyle4

+0

@ FreeStyle4 - lastNameは20文字しかないので、_alloca()またはalloca()(コンパイラに依存する)を使用してスタックから割り振ることができ、freeこの場合。プログラムは再帰型でもリエントラント型でもないので、lastNameを静的(静的配列)として宣言することができます。 – rcgldr

0

のメモリリークを生成しないとスワップの終了時にfree(lastName)することを忘れないでくださいスワップ機能で。

これを試してみてください:

char* lastName = (char*) malloc(20*sizeof(char)); 
+0

'malloc'の戻り値をキャストしません。それは完全に不要で、エラーを隠すことができます。参照してください:[** mallocの結果をキャストしますか?**](http://stackoverflow.com/q/605845/995714)。 'char * lastname = malloc(20 * sizeof * lastname);'はすべて必要です。 –

関連する問題