关于单链表的成员数据排序

来源:百度知道 编辑:UC知道 时间:2024/06/06 08:24:38
设计了 1 个单链表的程序来练手,关于代码的作用,
是想
让输入的数据一ID的大小进行重小到大的排列.

代码的没有任何错误,至少编译的时候是这样的.
可是运行起来就不行了.
调试了 1 下,发现是STRUCT的1个成员指针不能赋值,但重写了多次,都是这样.

HEAD指针就是链表的头地址,STRUCT的成员就是
CHAR NAME〔20〕,INT NO(就是ID),和指向下 1 个结点 的指针 NEXT.
其余部分无误,想拿出来但百度不给.
我标出了运行错误.
struct applist * clean(struct applist *head)
{
if( head == NULL)
{
goto END;
}
else
{
int i,j,num;
struct applist *p1,*p2,*p3,*p5;
p1 = head;
num = 0;
while(p1 != NULL)
{
p1 = p1->next;
num+=1;
}
p1 = head;
if(num == 1)
{
goto END;
}
else
{
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
/////此处是个错误 p2 = p1->next;
if(p2 == NULL)
{
goto GO;
}
else if( p1->no > p2->no )
{
if(p1 == head)

在链表里面使用冒泡排序不好弄,其实你可以把链表里面的每一环取出来,再重新按顺序组成一个链表。
因为你的节点只是保存一个整形数据,所以不用交换节点,只需要交换节点里面的一个整形数据就可以了,代码如下:
struct applist * clean(struct applist *head)
{
if( head == NULL)
{
goto END;
}
else
{
int i,j,num;
struct applist *p1,*p2,*p3,*p5;
p1 = head;
num = 0;
while(p1 != NULL)
{
p1 = p1->next;
num += 1;
}
p1 = head;
if(num == 1)
{
goto END;
}
else
{
p1=p2=head;
int tempID=0;
for(i=0;i<num-1;i++)
{
p1=p2;
p2=p1->next;

for(j=1;j<num;j++)
{
p3=p2;
if(p1->no >p3->no)
{
tempID=p1->no;
p1->no=p3->no;
p3->no=tempID;
}
p3=p3->next;
}
}
}
}
END:
return head;
}

waaa