排序链表需要一些帮助

时间:2016-07-06 00:01:33

标签: c

我正在做一个学校作业,我正在制作一个int链接列表,它应该有一个函数来对它进行排序。我很确定我根据输出得到了正确的链接链接。 sort函数应交换节点,而不是值。我收到分段错误(核心转储)消息,不知道它意味着什么或为什么。我正在寻找帮助,说明它为什么不起作用。我仍然很糟糕的指针,所以我认为这是一个问题。我的排序也是插入排序

typedef struct node {
    int data;
    struct node *next;
    struct node *prev;
} node;

node *pHead = NULL; // head of list
node *pCurr = NULL; // current node
int count = 0;

void create(int data) {

    node *pNode = (node*) malloc(sizeof(node));
    pNode->data = data;
    pNode->next = NULL;
    pNode->prev = NULL;


    pHead = pCurr = pNode;
    count += 1;
}

void add(int data) {
    if (pHead == NULL) {
        return create(data);
    }

    node *pNode = (node*) malloc(sizeof(node));
    pNode->data = data;
    pNode->next = NULL;

    pNode->prev = pCurr;
    pCurr->next = pNode;
    pCurr = pNode;

    count += 1;
}

int size() {
    return count;
}

void print() {
    node *pNode = pHead;
    while (pNode != NULL) {
        printf("[%d]->", pNode->data);
        pNode = pNode->next;
    }
    printf("\n");
}

void sort(node *current) {

    pHead = current;
    node *pInsert = pHead;
    current = current->next;
    int i, j;
    for (i = 0; i < size(); i++) {
        for (j = i; j > 0; j--) {
            if (current->data >= pInsert->data) {
                node *pTemp = current;
                current = pInsert;
                pInsert = pTemp;
            }
            pInsert = pInsert->prev;
        }
        current = current->next;
    }

    print();
}

2 个答案:

答案 0 :(得分:3)

要弄清楚如何交换链表中的相邻节点,绘制图片是有益的。想象一下节点A,B,C,D以链表顺序排列,其中下一个指针是绿色线,前面的指针是红色线。然后,想象如果您只是将B和C节点移动到彼此的位置,会发生什么。

enter image description here

现在,弄清楚你需要做什么的指针操作才能使画面看起来漂亮又漂亮。

答案 1 :(得分:1)

void sort(node *current) {

    node *pTemp, *pInsert = current;
    current = current->next;
    int i, j;
    for (i = 0; i < size(); i++) {
        for (j = i; j > 0; j--) {
         if (current != NULL && pInsert != NULL && current->data >= pInsert->data) {

/*start delete node*/
          if (pInsert->prev != NULL)
           pInsert->prev->next = pInsert->next;
          if (pInsert->next != NULL)
           pInsert->next->prev = pInsert->prev 
/*end delete node*/
/*start add node*/
          pInsert->next = current->next;
          pInsert->prev = current;
          if (current->next != NULL)
           current->next->prev = pInsert;
          current->next = pInsert;
/*end add node*/
            }
            pInsert = pInsert->prev;
        }
        current = current->next;
    }

    print();
}

试试这个。基本上,您将节点从其当前位置删除,方法是让前一个节点的下一个指针跳过有问题的节点并指向后面的节点,然后让下一个节点跳过相关节点并指向上一个节点。

然后通过让你的节点中的下一个指针指向插入点的下一个节点来插入你的节点...(在谈论下一个/下一个节点时会有点混乱)。

重要:另外,在处理这些指针时,请务必进行NULL检查!