之前一直想用双向链表来快排,想像数组快排一样给第一个数组下标(第一个有值节点的指针)和最后一个数组下标(最后一个有值节点指针),结果运行时经常有问题,程序有时会出错,于是纸上演算了几次发现会访问到未知的内存.
因为当low和high在最左侧或者最右侧相同时,再经过一次调用时
Box_Qsort(i,low->prev);
Box_Qsort(low->next,j);
可以发现因为最后一个有值节点的next为NULL,当此时low为NULL,
Box *key = (Box *)malloc(sizeof(Box));//保存节点数据
key->num = low->num;
low->num不存在,所以会导致程序异常.
而这样解决方法我认为就是给最后一个节点再连接一个节点,这样就没有问题了,一切正常
不过要注意在展示链表时不要展示了多加的那个节点
傻了,直接前面加一个判断就行了…
void Box_Print(Box *box_head)//显示双向链表内容
{
Box *p = box_head->next;
while(p)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
以下是完整代码的展示:
#include<stdio.h>
#include<stdlib.h>
typedef struct _Box //结构体
{
struct _Box *prev;
int num;
struct _Box *next;
} Box;
Box *Box_Creathead()//创建一个头节点
{
Box *p = (Box*)malloc(sizeof(Box));
p->prev = NULL;
p->next = NULL;
return p;
}
void Box_Add(Box *box_head)