对链表的排序

来源:百度知道 编辑:UC知道 时间:2024/05/24 23:37:58
思想是这样的:
我用将链表分拆开来,每个单元对应着一个地址,也就是用一个指向结构体的指针树组来存放链表分拆开后的每个地址值,对指树组的内容就是每个结构体的内容,对指针树组用选择法进行排序,得到的一个新的指针树组,就是我们要找的连续地址,新建一个链表,将其与新的指针树组对应起来,得到的新链表就是排序之后的链表。但是我不知道怎么就是不对,我觉得我的思想是对的啊,大家帮帮忙吧!
STUDENT *sort_score(STUDENT *h)
{
int t,k=0,i,j,m;
STUDENT * pointer[800],*p,*q,*head;
p=h;
for(;p!=NULL;)
{
pointer[k]=p;
p=p->next;
k++;
}
for (i=0; pointer[i]!=NULL; i++)
{
m=i;
for (j=i+1; pointer[i]!=NULL; j++)
{
if (pointer[j]->sum>pointer[i]->sum)
m=j;
}
if (m!=i)
{
t=pointer[j]->sum;
pointer[j]->sum=pointer[i]->sum;
pointer[i]->sum=t;
}
}
}
k=0;
q=(STUDENT *)malloc(sizeof(STUDENT));
q=head;
while(pointer[k]!=NULL)
{
q=pointer[k];
q=(STUDENT *)malloc(sizeof(STUDENT));
q=q->next;
k++;
}
return head;

}
*排序*/

for(;p!=NULL;)
{
pointer[k]=p;
p=p->next;
k++;
}
这里,当p为NULL时,循环就不执行了,因此pointer数组中根本就没有哪个元素被赋值为NULL,那么你下面的两层嵌套循环用]!=NULL作循环条件的话,循环不就无法停止了么

写的有错误,我找到了2个,

STUDENT *sort_score(STUDENT *h)
{
int t,k=0,i,j,m;
STUDENT * pointer[800],*p,*q,*head;
p=h;
for(;p!=NULL;)
{
pointer[k]=p;
p=p->next;
k++;
}
for (i=0; pointer[i]!=NULL; i++)
{
m=i;
for (j=i+1; pointer[i]!=NULL; j++)
{
if (pointer[j]->sum>pointer[i]->sum) //这样是错误的,因为这样只能得到最后一个比第一个大的位置,从你下面的程序来看,这样做不正确
m=j;
}
if (m!=i)
{
t=pointer[j]->sum;
pointer[j]->sum=pointer[i]->sum;
pointer[i]->sum=t;
}
}
}
k=0;
q=(STUDENT *)malloc(sizeof(STUDENT));
q=head;
while(pointer[k]!=NULL)
{
q=pointer[k];
q=(STUDENT *)malloc(sizeof(STUDENT)); //你这里有点乱,你是要重新建立
//一个连表还是要用原来的,自己再改一