该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
要求就是在双向链表上实现快速排序:(.cpp文件)
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2typedef struct DuLNode{//双向链表的定义
int data;//数据域
struct DuLNode *prior;//前一个指针
struct DuLNode *next; //后一个指针
}DuLNode,*DuLinkList;void InitDuList(DuLinkList &L,DuLinkList &front,DuLinkList &rear)//初始化一个双向链表
{
int data;
DuLinkList p,q;
p=L;//这个双向链表是有头指针的
printf("请输入待排序的序列(以-1结束):");
scanf("%d",&data);
while (data!=-1)//循环建立双向链表
{
q=(DuLinkList) malloc(sizeof(DuLinkList));//申请链表的节点空间
q->data=data;
q->prior=p;//p表示当前结点的前一个节点
p->next=q;
p=p->next;//p指向下一个节点
q->next=NULL;//当前结点的next指针域赋值为空
scanf("%d",&data);
}
rear=q;
front=L->next;
};DuLinkList Partition(DuLinkList &L,DuLinkList low,DuLinkList high)//快速排序中找枢轴记录
{
L->data=low->data;//把最前面一个数据作为枢轴记录,放到头节点的数据域上
while(low!=high){//循环条件是low和high不相等
while(low!=high&&high->data>=L->data)
high=high->prior;
low->data=high->data;
while(low!=high&&low->data<=L->data)
low=low->next;
high->data=low->data;
}
low->data=L->data;
return low;
};void Qsort(DuLinkList &L,DuLinkList low,DuLinkList high)//快速排序的主函数
{
DuLinkList pivoloc;
if(low!=high){
pivoloc=Partition(L,low,high);//找到枢轴记录的地址
if(pivoloc!=low)//如果枢轴记录的地址不等于低位的地址,则对在枢轴记录之前的那部分进行快速排序
Qsort(L,low,pivoloc->prior);
if(pivoloc!=high)//如果枢轴记录的地址不等于高位的地址,则对在枢轴记录之后的那部分进行快速排序
Qsort(L,pivoloc->next,high);
}
};void printList(DuLinkList L)//打印整个双向链表
{
DuLinkList p;
p=L->next;
printf("快速排序过后的结果为:");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
};
int main()
{
DuLinkList L,front,rear;
L=(DuLinkList)malloc(sizeof(DuLinkList));
L->prior=L->next=NULL;
front=rear=NULL;
InitDuList(L,front,rear);
Qsort(L,front,rear);
printList(L);
system("pause");
return 0;
}
附带说下,在Dev C++中编译通过,VS2012中也编译通过,但是在Dev C++中执行有时会崩溃,不是对所有的输入,但有一些会崩溃,但是单步执行没有问题。而在VS2012中调试也完全没有问题,但是单独执行那个.exe文件,同样崩溃。附上图片