链表排序的算法

来源:百度知道 编辑:UC知道 时间:2024/05/24 14:44:54
以下是程序。在排序的过程中会出错,思想就是这样,但无法成功,请高人指点!

#include <iostream.h>

int main()
{
struct node
{
int data;
node *next;
};
node *base, *tail, *temp;
temp=new node;
base=temp;
int i;
int a[]={78,84,95,76,82,91,67,94,85,88};
for(i=0; i<=9; i++)
{
temp->data=a[i]; //赋值
temp->next=new node;
tail=temp; //记录尾结点
temp=temp->next;
}
delete temp; //删除多出来的那个结点
tail->next=NULL;

temp=base; //遍历开始
while(temp!=NULL)
{
cout<<temp->data<<endl;
temp=temp->next;
}

temp=base; //排序开始
node *swaptemp, *tbase;
swaptemp=new node;
tbase=temp;
int max;
for(i=0; i<=9; i++)
{
max=tbase->data; //使最大值暂为链表的第一个结点的数据
temp=tbase; //回到排序链首
while(temp!=NULL)
{
if(max<=(temp->next->data))
{

我看过了程序,觉得思想应该是这样的,9次遍历该链表。每次找出一个MAX,并将他赋给一个新的结点,同时删除原链表中这个最大值。
最后将这些新的接点组成一个链表,就是排好序的。
现在来看看程序中的错误,主要是在排序中:
⒈while条件错误,假如是temp!=NULL,想一想遍历到链表最一个值,这时temp不为NULL,而temp->next为NULL,while循环中用到了这个,所以程序崩溃。修改方法:该while条件,或是改循环中的temp->next。
⒉swaptemp->next=swaptemp->next->next;错误,会使程序崩溃,理由同上,应该是swaptemp->data=max;swaptemp=swaptemp->next;
⒊对max的处理应该放在while循环外面,这样才能对最大的max处理。
程序看上去比较得乱,也就没有调试,说了这么多你应该能自己调试成功吧。再说一下,尽量不要让程序有警告,有时警告也会让你的程序无法正常运行!

结构体一般不放在int main()里 要放在#include<iostram.h>的下面 这样下面的程序就都能用上了