我想寫一個方法,在雙向鏈表中排序元素。該列表由具有向前和向後指針(閃爍,閃爍)到下一個元素的結構組成。 head-> blink應該爲null,tail-> flink應該爲null(又稱非圓形)。我嘗試了一種選擇排序方法,但我一直在收到分段錯誤。我已將問題隔離到註釋行中。但是,我包括了我的所有代碼,排序方法在底部。在C排序問題雙向鏈表
//header (dblLinkList.h)
#include <stdio.h>
#include <stdlib.h>
typedef struct _DblLinkList {
struct _DblLinkList *flink;
struct _DblLinkList *blink;
int num;
} DblLinkList;
struct _DblLinkList *head, *tail;
struct _DblLinkList *init(int nElements);
void sort(struct _DblLinkList *listNode);
void print(struct _DblLinkList *listNode);
//implementation
#include <stdio.h>
#include <stdlib.h>
#include "dblLinkList.h"
int main() {
struct _DblLinkList *list1 = init(2);
printf("-----Head to Tail------\n");
print(list1);
printf("Sorting...\n");
sort(list1);
printf("-----Head to Tail------\n");
print(list1);
}
struct _DblLinkList *init(int nElements) {
struct _DblLinkList *listNode;
int i = 0;
for(i = 0; i < nElements; i++) {
listNode = (struct _DblLinkList *)malloc(sizeof(struct _DblLinkList));
listNode->num = random();
if(head == NULL) {
head = listNode;
listNode->blink = NULL;
} else {
tail->flink = listNode;
listNode->blink = tail;
}
tail = listNode;
listNode->flink = NULL;
}
return listNode;
}
void print(struct _DblLinkList *listNode) {
for(listNode = head; listNode != NULL; listNode = listNode->flink) {
printf("%d\n", listNode->num);
}
}
void sort(struct _DblLinkList *listNode) {
//Not working properly
struct _DblLinkList *listNode2;
struct _DblLinkList *minNode;
struct _DblLinkList *temp = (struct _DblLinkList *)malloc(sizeof(struct _DblLinkList));
//start from the head and traverse the list
for(listNode = head; listNode != NULL; listNode = listNode->flink) {
minNode = listNode;
listNode2 = listNode->flink;
for(;listNode2 != NULL; listNode2 = listNode2->flink) {
if (listNode2->num < minNode->num) {
minNode = listNode2;
}
}
//Problem Lies here vvvvvvvvvvvv
temp->flink = listNode->flink;
temp->blink = listNode->blink;
listNode->blink = listNode2;
listNode->flink = listNode2->flink;
listNode2->flink = temp;
listNode2->blink = temp->blink;
printf("min: %d\n", minNode->num);
}
}
您標記了這個C和C++ ...但它看起來像C。這是什麼,只是要明確清楚? – 2011-06-07 19:53:39
如果您在調試器中運行您的程序,您應該確定*確切*哪條線觸發了seg-fault。然後,您應該能夠檢查當時的變量值,並將它們與您期望的值進行比較。 – 2011-06-07 19:55:07
同意,這看起來像編譯C. – 2011-06-07 19:55:46