[問題] 用qsort對linking list作排序?

看板C_and_CPP (C/C++)作者 (Esvent)時間15年前 (2010/10/13 00:07), 編輯推噓4(4026)
留言30則, 5人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 用qsort對linking list作排序時,compare function無法讀到第二個參數 (第二次呼叫後則是全都讀不到) 希望得到的正確結果: 可以正常排序 程式跑出來的錯誤結果: compile會過,但執行時會出現"在XXX.exe 中發生未處理的 Win32 例外狀況。" 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VS 2008 有問題的code: (請善用置底文標色功能) struct list { int grade; char name[128]; struct list *next; }; struct list *head=NULL, *current=NULL, *prev=NULL; void insertNode(char* name, int grade, int& nodes) { nodes++; current = (struct list *)malloc(1 * sizeof(*current)); if(!current) { cerr << "No memory available." <<endl; exit(EXIT_FAILURE); } current->next=NULL; strcpy(current->name, name); current->grade=grade; if(!head) head=current; else prev->next=current; prev=current; } void sort(char* type, int nodes) { current=head; if(type=="name") cout<<"1111"; else if(type=="grade") qsort((void*)head, nodes, sizeof(*head) * nodes, compGrade); } int compGrade (const void* grade1, const void* grade2) { cout << ((list*)grade1)->grade << endl; cout << ((list*)grade2)->grade << endl; return ((list*)grade1)->grade - ((list*)grade2)->grade; } 補充說明: 因為程式碼太多,所以只貼上一部分 參考過這個網頁的寫法http://tinyurl.com/2flhdfm 還是一直出錯... 囧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.129.35

10/13 00:32, , 1F
qsort能作用在node-base的結構?
10/13 00:32, 1F

10/13 00:32, , 2F
qsort要對連續的記憶體做排序, 這也就是為什麼第三個
10/13 00:32, 2F

10/13 00:34, , 3F
引數要給「一個元素的大小」, 他就是以這個為間隔, 把
10/13 00:34, 3F

10/13 00:35, , 4F
在記憶體中的元素往任意位置移動, 串列的記憶體不連續
10/13 00:35, 4F

10/13 00:36, , 5F
就算真的被你做到連續的配置, 在交換之後因為各自的指
10/13 00:36, 5F

10/13 00:36, , 6F
標值不變, 節點s在串列中的相對位置也不會改變, 其實
10/13 00:36, 6F

10/13 00:37, , 7F
用快速排序來排串列也是可以, 不過這個做法會複雜些
10/13 00:37, 7F

10/13 00:38, , 8F
改用插入排序會比較好, 他們簡直就像是共生共存的
10/13 00:38, 8F

10/13 00:39, , 9F
推l大說的用insertion sort在LL上同步率比較高XD
10/13 00:39, 9F

10/13 00:41, , 10F
原來如此,感謝l大詳盡的解說
10/13 00:41, 10F

10/13 00:46, , 11F
順便問一下insertion sort該如何在linking list上實現呢?
10/13 00:46, 11F

10/13 00:46, , 12F
應該要再加上一個指向前面節點的指標嗎?
10/13 00:46, 12F

10/13 00:50, , 13F
以sort的節點s用另一個指標指, 一次先從原串列拿出一
10/13 00:50, 13F

10/13 00:51, , 14F
個節點, 從頭到尾去掃新的串列, 然後插入適當的位置,
10/13 00:51, 14F

10/13 00:51, , 15F
跟用陣列的方式很像, 只是掃描的方向相反, 單向串列就
10/13 00:51, 15F

10/13 00:51, , 16F
可以了
10/13 00:51, 16F

10/13 00:58, , 17F
大概懂了,感恩
10/13 00:58, 17F

10/13 01:51, , 18F
嗯 我是指stdlib裡面的 qsort不能收list 因為沒有
10/13 01:51, 18F

10/13 01:51, , 19F
advance fptr可以帶入
10/13 01:51, 19F

10/13 01:55, , 20F
那可能要另一個函式指標了 XD
10/13 01:55, 20F

10/13 08:51, , 21F
發現你字串比較是用 == 耶~ 這樣不對喔
10/13 08:51, 21F

10/13 22:50, , 22F
google了一下,是應該用strcmp嗎?我這樣用會有什麼問題呢
10/13 22:50, 22F

10/13 22:55, , 23F
只要有這樣的字串出現 "abc" 實際上編譯器會再其他地
10/13 22:55, 23F

10/13 22:56, , 24F
配置一塊記憶體, 再讓你的指標指到他, 用strcpy才能在
10/13 22:56, 24F

10/13 22:57, , 25F
你的陣列裡擁有屬於自己的字串, 如果只是跟字串去作比
10/13 22:57, 25F

10/13 22:57, , 26F
較, 實際上是比指標的值大小, 而不是去比他們指到的字
10/13 22:57, 26F

10/13 22:57, , 27F
10/13 22:57, 27F

10/13 23:00, , 28F

10/13 23:01, , 29F
原po可以玩玩看上面這個範例 打一樣的字會有不同結果
10/13 23:01, 29F

10/14 02:02, , 30F
感謝樓上兩位,我再研究看看
10/14 02:02, 30F
文章代碼(AID): #1Cj8VSP6 (C_and_CPP)
文章代碼(AID): #1Cj8VSP6 (C_and_CPP)