2016-07-01 58 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有關?我不知道爲什麼,因爲當我初始化我的節點時,mableced lastName,並在交換功能內部進行mallocing。

鏈表具有虛擬頭節點,所以這就是爲什麼我有 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

我現在編輯帖子 – FreeStyle4

+0

只需要注意:你不需要line'typedef struct listNodeData listNodeData;',你已經有類型'listNodeData'定義爲'struct'上面的 – mvidelgauz

回答

1

在你的初始化代碼,

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

這不使用緩衝你的malloc 「編。取而代之的是用指定給函數的lastName代替指向緩衝區的指針。使用strcpy的姓氏進入緩衝區:

strcpy(newNode->lastName, lastName); 

注:同樣存在與position屬性相同的問題,所以這需要兩個工作要做。

其他一些問題要注意:

  • 不要在掉期結束時忘記free(lastName)在交換
+0

完全忘了!我現在試試 – FreeStyle4

+0

現在一切都完全正常 – FreeStyle4

+0

@ FreeStyle4 - 因爲lastName只有20個字符,所以可以使用_alloca()或alloca()(名稱取決於編譯器)分配堆棧,不需要free()在這種情況下。由於該程序不是遞歸的或可重入的,因此您可以將lastName聲明爲static(作爲靜態數組)。 – rcgldr

0

不會產生內存泄漏沒有分配的字符串空間在交換功能。你是如何初始化鏈表中使用的數據

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

Do * NOT *投下'malloc'的回報。這是完全沒有必要的,可以隱藏錯誤。請參閱:[**我是否將malloc的結果?**](http://stackoverflow.com/q/605845/995714)進行了詳細說明。 'char * lastname = malloc(20 * sizeof * lastname);'是所有需要的。 –