C语言链表排序问题

作者&投稿:机郝 (若有异议请与网页底部的电邮联系)
C语言单向链表排序如何实现?~

struct student* printf_sort(struct student *head)
{
struct student *p1,*p2,*ptemp,*pfinished=NULL;
for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
//ptemp作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!=pfinished;)
{
if(p2->numnext->num)//p2的值小于p2->next的值,交换{
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
ptemp=p1;
}
else
{
ptemp->next=p2->next;
ptemp=p2->next;
p2->next=ptemp->next;
ptemp->next=p2;
}
}
else//不需要交换,则p2、ptemp前进1位
{
ptemp=p2;
p2=p2->next;
}
}
pfinished=p2;
}
}

#include"stdafx.h"
#include<stdlib.h>
//创建一个节点,data为value,指向NULL
Node*Create(intvalue){
Node*head=(Node*)malloc(sizeof(Node));
head->data=value;
head->next=NULL;
returnhead;

//销毁链表
boolDestroy_List(Node*head){
Node*temp;
while(head){
temp=head->next;
free(head);
head=temp;

head=NULL;
returntrue;

//表后添加一个节点,Create(value)
boolAppend(Node*head,intvalue){
Node*n=Create(value);
Node*temp=head;
while(temp->next){
temp=temp->next;

temp->next=n;
return0;

//打印链表
voidPrint_List(Node*head){
Node*temp=head->next;
while(temp){
printf("%d->",temp->data);
temp=temp->next;

printf("\n");

//在链表的第locate个节点后(头节点为0)插入创建的节点Create(value)
boolInsert_List(Node*head,intlocate,intvalue){
Node*temp=head;
Node*p;
Node*n=Create(value);
if(locate<0)
returnfalse;
while(locate--){
if(temp->next==NULL){
temp->next=Create(value);
returntrue;

temp=temp->next;

p=temp->next;
temp->next=n;
n->next=p;
returntrue;

//删除第locate个节点后(头节点为0)的节点
boolDelete_List(Node*head,intlocate){
Node*temp=head;
Node*p;
if(locate<0)
returnfalse;
while(locate--){
if(temp==NULL){
returnfalse;

temp=temp->next;

p=temp->next->next;
free(temp->next);
temp->next=NULL;
temp->next=p;
returntrue;

//获取链表长度(不包括头节点)
intSize_List(Node*head){
Node*temp=head;
intsize=0;
while(temp->next){
temp=temp->next;
size++;

returnsize;

//链表的三种排序(选择,插入,冒泡)
boolSort_List(Node*head){
intt=0;
intsize=Size_List(head);
//选择排序
/*for(Node*temp=head->next;temp!=NULL;temp=temp->next){
for(Node*p=temp;p!=NULL;p=p->next){
if(temp->data>p->data){
printf("换%d和%d\n",temp->data,p->data);
t=temp->data;
temp->data=p->data;
p->data=t;


}*/
//插入排序
/*for(Node*temp=head->next->next;temp!=NULL;temp=temp->next){
for(Node*p=head;p->next!=NULL;p=p->next){
if(p->next->data>temp->data)

printf("换%d和%d\n",temp->data,p->next->data);
t=temp->data;
temp->data=p->next->data;
p->next->data=t;


}*/
//冒泡排序
for(Node*temp=head->next;temp->next!=NULL;temp=temp->next){
for(Node*p=head->next;p->next!=NULL;p=p->next){
if(p->data>p->next->data){
t=p->data;
p->data=p->next->data;
p->next->data=t;



return0;


扩展资料:return表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

别的不敢说,但你的程序中有个致命错误,就是没有给结构体指针*first = NULL; *temp等分配空间,就访问他们了。
你自己看下我以前写的程序,有排序的
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char num[10];
char name[10];
int score[5];/*score[0]存数学成绩score[1]语文成绩score[2]英语成绩score[3]总分score[4]平均分*/
struct node *next;
}student;/*学生成绩结构体*/
/*初始化结构体*/
student *init(student *t)
{
t=(student *)malloc(sizeof(student));
t->next=NULL;
t->score[4]=t->score[3]=t->score[0]=t->score[1]=t->score[2]=0;
return t;
}
/*保存数据*/
void save(student *stu)
{
FILE *fp;
if((fp=fopen( "score1","w"))==NULL)/*为输出打开文件score1*/
{
printf("cannot open file\n");exit(0);
}
stu=stu->next;
while(stu!=NULL)
{
if(fwrite(stu,sizeof(student),1,fp)!=1)
printf("file write error\n");
stu=stu->next;
}
fclose(fp);
}
/*读取数据*/
student * load(student *stu)
{
FILE *fp;student *p,*r;r=stu;
if((fp=fopen("score1","r"))==NULL)/*为输入打开文件score1*/
return stu;
do
{ p=(student *)malloc(sizeof(student));
p->next=NULL;
if((fread(p,sizeof(student),1,fp)!=1)){fclose(fp);return stu;};
r->next=p;
r=r->next;
}while(1);

}
/*输出一个特定的学生的成绩*/
void output1(student *t)
{ int k;
printf("%s\t%s\t",t->num,t->name);
for(k=0;k<5;k++)
printf("%d\t",t->score[k]);
printf("\n");
}
/*输出全体学生的成绩*/
void output(student *stu)
{
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!=NULL)
{
output1(stu);
stu=stu->next;
}

}
/*将stu后插在t中*/
student * charu(student *stu,student *t)
{student *p;int k;
p=(student *)malloc(sizeof(student));
strcpy(p->num,stu->num);
strcpy(p->name,stu->name);
for(k=0;k<5;k++)
p->score[k]=stu->score[k];
p->next=t->next;
t->next=p;
return p;
}
/*按成绩排序*/
void paixu(student *stu,int i)
{
student *t,*p,*r;
int j,k;p=stu;
printf("输入0按数学成绩\n");
printf("输入1按语文成绩\n");
printf("输入2按英语成绩\n");
printf("输入3按总分\n");
printf("输入4按平均分\n");
do
{
scanf("%d",&j);
if(j<0&&j>4) printf("输入错误请重新输入\n");
else break;
}while(1);
t=init(t);
r=t;
stu=stu->next;
if(t->next==NULL)
r=charu(stu,t);/*在排序好的链表t中插入第一个节点*/
if(i==0)/*按升序排序*/
while(stu->next!=NULL)
{
stu=stu->next;
if(r->score[j]>stu->score[j]) r=t;/*如果待插入的score[j]<当前的score[j],指针r回溯*/
while(r->next->score[j]<stu->score[j]&&r->next!=NULL)
r=r->next;/*找到比待插入的score[j]大的指针r->next*/
r=charu(stu,r);/*在r后面插入stu*/
}
else
while(stu->next!=NULL)
{
stu=stu->next;

if(r->score[j]<stu->score[j]) r=t;
while(r->next->score[j]>stu->score[j]&&r->next!=NULL)
r=r->next;
r=charu(stu,r);
}
output(t);
}
/*排序菜单*/
void output2(student *stu)
{ int i;
output(stu);
printf("输入 0 升序\n");
printf("输入 1 降序\n");
printf("输入其他任意字符退出\n");
scanf("%d",&i);
if(i==0||i==1)
paixu(stu,i);
printf("输入任意字符结束\n");
getch();

}
/*查找学生号为num是否存在*/
student * findnum(char *num,student *t,int *i)
{
*i=1;
if(t->next==NULL)
return t;
else
{
*i=strcmp(t->next->num,num);
while(*i<0)/*t->next->num<num时查找下一个*/
{
t=t->next;
if(t->next==NULL)
return t;
*i=strcmp(t->next->num,num);
}
}
return t;/*t->next->num>=num时返回,此时i>=0*/
}
/*插入一个学生信息*/
student * insertstu(char *num,student *stu,char *name)
{ student *p,*t;int *i,j;i=&j;
t=findnum(num,stu,i);/*查找该学号是否存在*/
if(j!=0)/*该学号不存在,则插入*/
{
p=init(p);
strcpy(p->num,num);
strcpy(p->name,name);
p->next=t->next;
t->next=p;
return stu;
}
else
{printf("已有此学号\n学号\t姓名\n%s\t%s\n",t->next->num,t->next->name);return stu;}
}
/*录入新学生信息*/
void base(student *stu)
{
char num[10],name[20];
printf("输入e结束输入新学生的信息\n");
printf("num(不超过10个数)\tname(不超过10个字)\n");
scanf("%s",num);
do
{
printf("\t\t\t");
scanf("%s",name);
stu=insertstu(num,stu,name);/*插入一个学生信息*/
scanf("%s",num);
}while(num[0]!='e');
output(stu);
printf("输入任意字符退出\n");
getch();
}
/*增加修改一门课程成绩*/
void zengjia(student *t,int i)
{
t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/
scanf("%d",&(t->score[i]));/*输入第i门课的成绩*/
t->score[3]+=t->score[i];/*总分加上第i门课的成绩*/
}
void deletegrade(student *t,int i)
{
t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/
t->score[i]=0;/*第i门课的成绩归零*/
}
/*修改成绩*/
void altergrade(student *stu)
{
int j,*i;student *t;char a,*num;
i=&j;
printf("0 修改数学成绩\n");
printf("1 修改语文成绩\n");
printf("2 修改英语成绩\n");
printf("3 删除数学成绩\n");
printf("4 修改语文成绩\n");
printf("5 修改英语成绩\n");
printf("输入 e 结束操作\n");
a=getch();
printf("学号\t成绩\n");
scanf("%s",num);
while(num[0]!='e')
{
t=findnum(num,stu,i);/*按学生号查找学生信息*/
if(j==0)/*学生号存在*/
{
t=t->next;
switch(a)
{
case '0':
zengjia(t,0);
break;
case '1':
zengjia(t,1);
break;
case '2':
zengjia(t,2);
break;
case '3':
deletegrade(t,0);
break;
case '4':
deletegrade(t,1);
break;
case '5':
deletegrade(t,2);
break;
default:break;
}
t->score[4]=t->score[3]/3;
}
else
printf("无此学号\n");
scanf("%s",num);
}
output(stu);
printf("输入任意字符结束\n");
getch();
}
/*第i科成绩录入*/
student gradeenter(student *stu,int i)
{
student *t;t=stu;
t=t->next;
printf("学号\t该科成绩\n");
while(t!=NULL)
{
printf("%s\t",t->num);
if(t->score[i]==0)/*如果学号为t->num的同学该科成绩没有*/
{
scanf("%d",&t->score[i]);
t->score[3]+=t->score[i];/*学号为t->num的总分*/
t->score[4]=t->score[3]/3;/*学号为t->num的平均分*/
}
else
printf("%d\n",t->score[i]);
t=t->next;/*录入下一个同学的该科成绩*/

}
printf("该科全部输入完成\n输入任意字符结束\n");
getch();
}
/*成绩录入菜单*/
void entergrade(student *stu)
{
int i;
printf("0 录入数学成绩\n");
printf("1 录入语文成绩\n");
printf("2 录入英语成绩\n");
scanf("%d",&i);
switch(i)
{
case 0:gradeenter(stu,i);break;
case 1:gradeenter(stu,i);break;
case 2:gradeenter(stu,i);break;
default:printf("输入错误请输入相应操作的题号\n");
}

}
/*按学生号查找学生*/
void chaxun(student *stu)
{
char *num;int j,k,*i;student *t;i=&j;
printf("输入要查询的学生学号\n");
scanf("%s",num);
t=findnum(num,stu,i);/*查找学生号为num是否存在*/
if(j==0)/*该学生号存在*/
{
t=t->next;
printf("查询结果为\n");
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
output1(t);/*输出此学生信息*/
}
else
printf("查无此号\n");
printf("输入任意字符结束\n");
getch();
}
/*统计全班人数和平均分*/
void tongji(student *stu)
{
int total=0,score=0;
stu=stu->next;
while(stu!=NULL)
{
score+=stu->score[3];
stu=stu->next;
total++;
}
score=score/total;
printf("班级总人数为:%d平均分为:%d\n输入任意字符退出\n",total,score);
getch();
}
/*按分数段查询*/
void fenshuduan(student *stu)
{
int i,min,max,j;
printf("输入0按数学分数段\n");
printf("输入1按语文分数段\n");
printf("输入2按英语分数段\n");
printf("输入3按总分分数段\n");
printf("输入4按平均分分数段\n");
scanf("%d",&i);
printf("输入分数段上限:");
scanf("%d",max);
printf("\n输入分数段下限:");
scanf("%d",min);
if(max<min)
{j=max;max=min;min=j;}
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!=NULL)
{
if(min<=stu->score[i]&&stu->score[i]<=max)/*将分数段内的同学信息输出*/
output1(stu);
stu=stu->next;
}

}
void main()
{
char a='8';
student *stu;
stu=init(stu);/*初始化stu*/
stu=load(stu);/*读取score1的数据*/
while(a!='7')
{
clrscr();
printf("************************************************************\n");
printf(" 学生成绩管理系统\n");
printf(" -------made in china\n");
printf(" \t0 录入学生基本信息\n");
printf(" \t1 修改或删除学生成绩\n");
printf(" \t2 录入学生成绩\n");
printf(" \t3 显示指定学生的信息\n");
printf(" \t4 输出指定分数段的学生信息\n");
printf(" \t5 输出班级总人数和平均分\n");
printf(" \t6 输出全体学生的信息\n");
printf(" \t7 退出\n");
printf("*************************************************************\n");
a=getch();
switch(a)
{
case'0':base(stu);break;
case'1':altergrade(stu);break;
case'2':entergrade(stu);break;
case'3':chaxun(stu);break;
case'4':fenshuduan(stu);break;
case'5':tongji(stu);break;
case'6':output2(stu);break;
case'7':break;
default:printf("i am sorry to hear that you enter the wrong num\n");
printf("按任意键重新输入\n");getch();continue;
}
}
save(stu);/*将数据保存在score1中*/
printf("欢迎再次使用学生成绩管理系统........请按任意键退出.......");
getch();

}

first 为NULL 你访问了first ;
first->next = head 错了;


C语言 关于单链表的排序
q->next=s;s->next=q->next;这两句改为 s->next=p;q->next=s;其次 将InsertList函数里的 while(n>p->data && p)改为 while(p && n>p->data)需要首先判断p是否为空 为空则插入到链表最后 不然的话 直接先判断 n> p->data ,如果p为空,访问p->data会导致内存出错 ...

帮忙做道C语言的题:双向链表的排序
include <stdio.h> typedef struct Link\/*双向链表结构体*\/ { int data;struct Link *lift;struct Link *right;}linkx,*linky;linky Init();\/*建立双向链表*\/ void PrLink(linky p);\/*输出双向链表*\/ linky Sort(linky head);\/*对双向链表排序*\/ linky Swap(linky head,linky one,linky ...

C语言链表的一个小问题
这不就相当于创建了一个数组吗?} 或者直接STDU a[n];\/*n为数组个数*\/ 直接调用不可以吗?顺序链表真的不适合排序,但是也能排,很麻烦,比如,你现在第三个,第四个要互换,你可以把第二个的指针指向第四个,然后把第四个指针指向第三个,然后第三个指向第五个,这样就差不多了。

C语言双向链表排序
既然是选择排序,在交换最小节点与当前节点,也就是调用 reverse() 之后,当前节点应该后移一个,所以将 p = i 去掉即可,因为外层 for 循环已经有 p = p->pnext

用c++语言实现双向链表的排序
include <stdio.h>#include <stdlib.h>#include struct _Node {int data;struct _Node *next;};typedef struct _Node Node;\/\/ 交换两个结点的数据void SwapNodeData(Node *p1, Node *p2) {int temp = p1->data;p1->data = p2->data;p2->data= temp;}\/\/ 冒泡排序对链表进行排序void B...

急求,C语言学生管理系统一部分,链表排序的问题
void BubbleSort (struct student *head) {struct student *p,*q,*pt; for(p = head; p->next; p = p->next) {q = p->next;while(q->next) {if(p->next->grade < q->next->grade) {pt = p->next;p->next = q->next;q->next = p->next->next;p->next->next =...

c语言链表插入法求解下列问题?
根据题意:一、链表创建:根据输入的数字,动态创建任意多个节点插入链表。(题目规定n<=40,如不想使用malloc动态申请内存,需直接定义最大上限40个节点)。二、链表排序:交换节点内容(不是地址),保留链表指针的值(*next的值)。三、打印链表:利用链表指针遍历链表。四、对动态申请的链表地址空间...

C语言链表之冒泡排序!!!
主要是循环次数上有问题,修改的地方都做了标记:include<stdio.h> include<malloc.h> \/\/#define null 0 ---把数等于零写成NULL不是好习惯,NULL一般是用来说指针为0,这个在标准库中有定义 struct number { int num;struct number *next;};void main(){ struct number *head;struct number *...

对单链表中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点...
这个算法有两个循环,我们姑且称其为外循环和内循环,诚如其他楼的一位网友所言,其内循环在第一次判断时进不去是正常的,但后面会进去。为什么呢?首先我们来理一下这个算法的大体思路:这是一个针对单链表的排序算法,就是说给定一个单链表,我们要把按照结点(这里不对头结点进行排序,即这里讨论...

求一个C语言单链表的排序函数,很急很急
用选择排序就行,代码如下。链表结构如下:typedef struct Node { T value;struct Node *link;}Node;void selectSort(Node *node){ Node *cur; \/*当前节点*\/ Node *next; \/*遍历未排序节点*\/ Node *min; \/*指向未排序节点中最小节点*\/ T temp;\/*从头节点的下一个节点开始,一直到倒数第二...

饶阳县15343463744: c语言链表的排序问题!! -
淳才利血: 测试结果:要输入多少个数据: 4 输入第1个数据(书名,作者,出版时间,库存地点,当前册数): book1 person1 20100601 room1 1000 输入第2个数据(书名,作者,出版时间,库存地点,当前册数): book2 person2 20100702 room2 ...

饶阳县15343463744: C语言链表排序 -
淳才利血: /* ==========================功能:直接插入排序(由小到大)返回:指向链表表 头的指针 ========================== */ /*直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学...

饶阳县15343463744: C语言链表排序问题 -
淳才利血: C指的是空白的临时节点 是NULL么 你交换的地方就有问题 如果c是NULL c->next = a 就段错误了,而且在交换块的代码也不能用头指针, 你的代码实现有挺多不合理的地方, 如果是 a->b->c->d 交换b c b->next = c->next; //b->d a->next = c //a->c c->next = b //c->b 连起来就是 a->c->b->d 所以单链表交换节点还需要一个变量 就是上面我说的a, 每次循环还要a = a->next 你的d是固定的 不对 指针往下走没有判空 有越界

饶阳县15343463744: 单链表排序问题(C语言) -
淳才利血: 经典算法--单链表选择排序第一种:#include<stdio.h>#include<stdlib.h> typedef struct node{ int data; struct node *next; }*Linklist,Node; Linklist creat(int n) {Linklist head,r,p; int x,i; head=(Node*)malloc(sizeof(Node)); r=head; printf("输入数字:\...

饶阳县15343463744: C语言链表如何排序 -
淳才利血: 可以把链表设计成循环链表,用冒泡排序 在排序前设计一个交换标记,如在循环过程中有交换,则修改这个标记变量,如果在一次循环(当前节点为刚开始时节点,表示循环了一次)中,交换标记没有被修改,则表明该数列已排好序. 现在给...

饶阳县15343463744: C语言中的链表排序问题 -
淳才利血: link sort(link head) //head为表头结点{ link beforep,p,p1,k,beforek,temp; if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n"); //表头节点为空即链表为空 else {p=head; //指针p指向表头 while(p->next!=NULL) //当链表没有...

饶阳县15343463744: 求C语言高手指导 用链表怎样排序(链表中有一个p - >score变量作为比较大小排序的标准) -
淳才利血: #include<stdio.h>#include<malloc.h>#include<string.h> struct node { char data[20] ; struct node*link ; }; typedef struct node ListNode ; void ListInsert(ListNode**L,char x[]) //构造链表时直接排序 { ListNode *p, *q, *curr ; p = (ListNode*)malloc(sizeof(...

饶阳县15343463744: c语言链表排序问题,程序如下.t - >next = p - >next;p - >next = q - >next; q - >next = t - >next;是什么意思? -
淳才利血: if (p->StudentID > q->StudentID) //当前p的id大于q的id,则交换两个结点数据 { *t = *p; *p = *q; *q = *t;//以上完成两结点数据的交换,但链表就乱了,以下,完成链表的整理//t保存的是原来的p, p中是原来的q q中是原来的p(与t相同) 你画个图就理解了 t->next = p->next; //记录原q的后继 p->next = q->next; //修改当前的p(原q)后继,变成原p的后继 q->next = t->next; //修改当前的q(原p)后继,变为原q的后继 }

饶阳县15343463744: C语言中,创建的链表怎么排序!
淳才利血: 先创建一个结构体,内容包括编号,姓名, 然后,再对姓名进行排序 ,排序方法有选择法,冒泡法,等都可以, 最后再输出

饶阳县15343463744: 急急急!!!!!!!C语言链表插入排序问题 -
淳才利血: 下面的答案测试结果是:x可以插入链表,保持从小到大有序found1. if (h==NULL || s==NULL) return;found2. s->next = NULL; // 这里可以不填found3. q->next = s; while(q->next!=0){q = q->next;} // 为了防止下面有一句错误如果不仅插入,而且让...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网