关于双向链表实现快速排序递归算法的问题

Print_List 2011-12-11 07:46:40
源代码如下:
我用vs2010调试的结果发现是由于指针越界导致结果出问题,但是不会怎么处理,求帮改,谢谢。
提供两组测试数据 5 4 3 2 1 -1(-1是输入结束的标记)以及3 4 5 1 2 -1


#include<stdio.h>
#include<stdlib.h>

struct List
{
int data;
int no;
List *next;
List *pre;
};//二维链表,no表示第几个元素

void Init_List(List *ptr)
{
ptr=(List *)malloc(sizeof(List));
if(!ptr)
printf("Error\n");
ptr->no=0;
ptr->next=NULL;
ptr->pre=NULL;
}//初始化双向链表

void Create_List(List *ptr)//构造双向链表
{
int temp;
List *p;
List *q=ptr;
int num=1;

printf("Please input the data of the list\n");
scanf("%d",&temp);

while(temp!=-1)//读入数据不为-1
{
p=(List *)malloc(sizeof(List));
if(!p)
printf("Error\n");//分配内存
p->no=num++;//建立第num个元素
p->data=temp;
p->pre=q;
q->next=p;
q=q->next;//链表的连接以及修改指针
scanf("%d",&temp);
}
p->next=NULL;
}

List * Get_LastPtr(List *ptr)//求最后一个地址
{
List *p=ptr;

while(p->next!=NULL)
p=p->next;

return p;//返还最后一个节点的地址
}

void Print_List1(List *ptr)//从前往后打印链表
{
List *p=ptr->next;

while(p->next!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d\n",p->data);
}

void Print_List2(List *ptr)//从后往前打印链表
{
List *p=Get_LastPtr(ptr);

while(p->pre!=ptr)
{
printf("%d ",p->data);
p=p->pre;
}
printf("%d\n",p->data);
}

List * Mid_Place(List *ptr,List *low,List *high)//求快速排序中枢轴的位置
{
int key;
key=low->data;
while(low->no<high->no)
{
while(low->no<high->no&&high->data>=key)
high=high->pre;//当枢轴一直比high指针指向的节点的值小,high前移
if(low->no<high->no)
{
low->data=high->data;
high->data=key;//将两个节点中的元素值换个位置
}
while(low->no<high->no&&low->data<=key)
low=low->next;//当枢轴一直比low指针指向的节点的值小,low后移
if(low->no<high->no)
{
high->data=low->data;
low->data=key;//将两个节点中的元素值换个位置
}
}
return low;//当low和high重叠,返还枢轴应该所在节点的指针
}

void Fast_Sort(List *ptr,List *low,List *high)//快速排序
{
List *mid;

if(low->no<high->no)//判断结束条件?????感觉这个有点问题~~~
{
mid=Mid_Place(ptr,low,high);//枢轴的位置为mid
Fast_Sort(ptr,low,mid->pre);//枢轴左边排序
Fast_Sort(ptr,mid->next,high); //枢轴右边排序
}
}

main()
{
List L;
List *ptr=&L;
List *first,*last;

Init_List(ptr);

printf("Please create a list\n");
Create_List(ptr);

Print_List1(ptr);
Print_List2(ptr);

first=ptr->next;
last=Get_LastPtr(ptr);
Fast_Sort(ptr,first,last);//取除了头节点之外的第一个节点的地址和最后一个节点的地址放入参数
Print_List1(ptr);

system("pause");
return 0;
}
...全文
146 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧