struct stu
{
int num;
float score;
struct stu *next;
};
现在head->p1->p2->p3
如果p2的num比p1小的话交换p1与p2中的数据,而且指向仍未head->p1>p2>p3
因为接下来还要用。
这是我写的,不知为什么错了,请帮我改改
struct stu *creat()
{
struct stu *head,*p1,*p2,*temp;
p1=p2=(struct stu *)malloc(LEN);
printf("请输入第%d个学生的学号和成绩:",n+1);
scanf("%d,%f",&p1->num,&p1->score);/*这里是%f,别打成lf否则会成绩会输出0.0*/
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
printf("请输入第%d个学生的学号和成绩:",n+1);
p1=(struct stu*)malloc(LEN);
scanf("%d,%f",&p1->num,&p1->score);
if(p1->num<p2->num)
{
temp->num=p1->num;
p1->num=p2->num;
p2->num=temp->num;
temp->score=p1->score;
p1->score=p2->score;
p2->score=temp->score;
}
}
p2->next=NULL;
return(head);
}
链表交换节点有两种方式:
交换结点内容
交换结点位置
如定义以下结构体,分为数据部分和链表指针部分
交换结点内容,结点顺序不变,依然保持原样,则交换两个结点时,只交换数据部分,next指针不要动,如:交换p1和p3的内容(数据):
struct _data t=p1->data;p1->data=p3->data;p3->data=t ;//这样就可以了。交换结点位置,链表的顺序会发生变化,为保持链表的正常衔接,则要重新设置next的值,过程略有复杂,如:交换p1,p3的位置:最终变成:head->p3->p2->p1->p4 ;
粗粗看了下,这里有个错误:
temp->num=p1->num;temp是指针,未初始化申请内存的情况下直接使用会有问题,容易引起程序崩溃
建议改为:定义:
struct stu temp;使用交换:
temp.num=p1->num;