C程序设计,一个已经建立的链表,如何按照链表中某一元素数值,重新排序建立新的链表
#define LEN sizeof(struct student)
#define NULL 0
typedef struct student
{
int num;
float score;
struct student *next;
}STU;
STU *creat(void)//建立一个链表,返回head
{
int n;
STU *p1,*p2,*head;
p1=(STU*)malloc(LEN);
printf("输入第1个学生的号码和成绩\n");
scanf("%d,%f",&p1->num,&p1->score);
while(p1->num!=0)
{
n++;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(STU*)malloc(LEN);
printf("输入第%d个学生的号码和成绩",n+1);
scanf("%d,%f",%p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
链表由以上函数建立,现在我想对输入完值后建立的链表按num重新排序建立新的链表,应该怎么设计算法,我是个初学者,传统的冒泡法排序感觉不能用在这里,只求大体算法思路,不用整个函数代码,感谢!
你为何不在输入链表的时候就进败闷行排序呢,输入一个新信息的时候,就判断一下其在哪个位置扰宴插入。
链表的排序,我觉得和数组的排序思想是一致的,只是有时候对于数组的某些操作不能平移过来。主要就是在你平移这缓枯银种操作的时候,怎样等效的用操作链表的方法模拟对数组的操作。
当然橘迹可以用冒泡排序算法圆让并对这个链表排序,如下:
void sort(STU *a)
{
STU *b,*c;
int tnum;
float tscore;
for (b=a; b; b=b->next) {
for (c=a; c->next; c=c->next) {
if (c->num>c->next->num) {
tnum=c->num;
c->num=c->next->滑扮num;
c->next->num=tnum;
tscore=c->score;
c->score=c->next->score;
c->next->score=tscore;
}
}
}
}