在用C语言解决链表排序问题时,如果遇到字符串,采用交换数据域的方式来就比较困难,本文章介绍如何以交换节点的方式来实现链表排序。
废话不多直接上代码:
struct STUDENT *xuehaopai(struct STUDENT *head)
{
struct STUDENT *min=head,*p1=head,*L=head,*pr=head,*pd=head,*p=NULL,*q=NULL;
struct STUDENT *p2=head,*p3=head;
if(head==NULL) return head;
while(p1!=NULL)
{
p2=p1;
while(p2!=NULL)//找气泡的循环
{
if(strcmp(min->studentId,p2->studentId)==1)
{
min=p2;
}
p2=p2->next;
}
if(L==head&&min==head)
{
head=min;//保持头指针的位置
p1=min;
}else if(L==head&&min!=head ){
pd=findNode(head,min);//找到min的上一个节点
p=min->next;//这里是笔者在找了很久的bug所在的位置,原来是
//p=min,下面L-next=p->next,后来我意识到p指向等价
//于min,而p的指向随min->next=L-next行而改变l
//导致程序陷入了死循环。
pd->next=L;
min->next=L->next;
L->next=p;
head=min;
p1=min;
}else if(L!=min&&min!=head&&strcmp(L->studentId,min->studentId)==1){
pr=findNode(head,L);
pd=findNode(head,min);
p=min->next;
q=L;
pr->next=min;
pd->next=L;
min->next=L->next;
L->next=p;
}
L=min->next;
min=p1->next;
p1=p1->next;
}
head=sort(head);
return head;
}
以上是代码的主要部分,整个代码分成三个部分讨论,结构上L、p1、p2事整个函数最核心的部分,min指针即为“气泡”,以p2指针为判断条件的循环,实现找到气泡的部分,L指针保持整个链表的骨架,避免节点断裂,并填充一次变大的min,p1指针作为主干,控制冒泡完成后退出,并未L指针提供了一个中转的作用。
struct STUDENT *baocun(struct STUDENT *head)
{
struct STUDENT *p=head;
FILE *fp=fopen("学生信息.txt","a+");
while(p!=NULL)
{
fprintf(fp,"\n");
fprintf(fp,"学号: ");
fputs(p->studentId,fp);
fprintf(fp,"\n");
fprintf(fp,"姓名: ");
fputs(p->studentName,fp);
fprintf(fp,"\n");
fprintf(fp,"出生年份: ");
fprintf(fp,"%d",p->year);
fprintf(fp,"\n");
fprintf(fp,"出生月份: ");
fprintf(fp,"%d",p->month);
fprintf(fp,"\n");
fprintf(fp,"出生日期: ");
fprintf(fp,"%d",p->day);
fprintf(fp,"\n");
fprintf(fp,"英语成绩: ");
fprintf(fp,"%d",p->scoreEnglish);
fprintf(fp,"\n");
fprintf(fp,"数学成绩: ");
fprintf(fp,"%d",p->scoreMath);
fprintf(fp,"\n");
fprintf(fp,"计算机成绩: ");
fprintf(fp,"%d",p->scoreComputer);
fprintf(fp,"\n");
fprintf(fp,"物理成绩: ");
fprintf(fp,"%d",p->scorePhysics);
fprintf(fp,"\n");
fprintf(fp,"电路成绩: ");
fprintf(fp,"%d",p->scoreCircuit);
fprintf(fp,"\n");
fprintf(fp,"总分: ");
fprintf(fp,"%d",p->sum);
fprintf(fp,"\n");
fprintf(fp,"平均分: ");
fprintf(fp,"%d",p->aver);
fprintf(fp,"\n");
p=p->next;
}
fclose(fp);
}
struct STUDENT *sort(struct STUDENT *head)
{
FILE *fp=fopen("学生信息.txt","w+");
head=baocun(head);
fclose(fp);
return head;
}
struct STUDENT *findNode(struct STUDENT *head,struct STUDENT *p)
{
struct STUDENT *q=head;//找到初始节点的函数
while(q!=NULL)
{
if(q->next==p)
{
return q;
}else{
q=q->next;
}
}
return NULL;
}
findNode函数是借鉴别的博主的,找不到是谁,不好意思啦,拿来借用一下。
效果展示图:


笔者水平有限,若有不当,还请大佬指出。
本文介绍了如何使用C语言实现链表的冒泡排序。通过核心代码解析,详细阐述了冒泡排序过程中节点交换的逻辑,以及如何通过findNode函数辅助找到最小节点。在排序过程中,利用L、p1、p2指针维持链表结构并确保正确排序。最后,文章展示了排序效果。
&spm=1001.2101.3001.5002&articleId=115190757&d=1&t=3&u=b4439de96191415c939ff2384605ddde)
1万+

被折叠的 条评论
为什么被折叠?



