| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1783 人关注过本帖
标题:谁能提供一个链表排序的程序吗?
只看楼主 加入收藏
韦应贵
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2006-4-30
收藏
 问题点数:0 回复次数:13 
谁能提供一个链表排序的程序吗?

谁能提供一个单链表排序程序?谢谢,

搜索更多相关主题的帖子: 链表 单链 
2006-05-06 20:03
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*无序链表的冒泡法排序*/

/*
编程任务:用链表实现若干个考分的降序排列
补充规定:最初链表上的准考证号是升序排列
     而沿链表各结点的考分则完全无序
考生信息:㈠准考证号;㈡考分
*/

#include<stdio.h>
#include<stdlib.h>

int total=0; /*总人数*/

typedef struct person
{ /*结点的数据结构*/
long ID; /*准考证号*/
float fen; /*考分*/
struct person* next; /*指向下一个结点*/
} Person ;

int main(void)
{ Person Head={0L,0.0,NULL},*head=Head,*p,*q,*s;
int i,j,k;
q=head->next;
do
{ long ID; float score;
printf("No.%d: ID,score=",total+1); /*提示信息*/
scanf("%ld%*c%f",&ID,&score); /*ID与score之间可用任意字符隔开*/
if(ID<=0L)break; /*约定用不合理的准考证号代表输入到此为止*/
p=(Person*)malloc(1*sizof Person);/*假设申请新结点次次成功*/
q->next=p; /*令新结点入链*/
p->next=NULL; /*权作链尾*/
p->fen=score;
q=p; /*"新"变"旧",让p迎接更新的*/
}/*至此考生信息全部登录到了链表*/
/*下面是对链表的遍历,以验证登录*/
s=Head.next;/*Head结点是空架子*/
while(s!=NULL){
printf("%ld: %4.1f\n",s->ID,s->fen);
s=s->next; }
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-06 20:13
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

楼主应该学过政治吧?什么叫能动性?


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-06 22:27
andyss
Rank: 1
等 级:新手上路
帖 子:189
专家分:0
注 册:2006-4-8
收藏
得分:0 
书上到处都是,最好自己看一下,了解原理,自己再对单链表进行完整的写,包括初始化,插入,删除.....,这样比问别人会好一点,这些都是基础.

幽幽黄桷兰----建四狼
2006-05-06 22:31
韦应贵
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2006-4-30
收藏
得分:0 
[CODE]

并不是我没看呀,我是编了,但总的程序运行得不到我想要的结果.我把程序发上来你们看看.

[/CODE]#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct term
{
float coef;
int expn;
struct term * next;
};

struct term *Creat(char ch)
{
struct term *p, *s,*r;
float x; int y;
p=(struct term*)malloc(sizeof(struct term));
p->next=NULL;
printf("\n",ch);
scanf("%f, %d",&x,&y);
while(x!=0)
{
s=(struct term*)malloc(sizeof(struct term));
s->coef=x;
s->expn=y;
s->next=NULL;
if(p->next==NULL)
{
p->next=s;
r=s;
}
else
{
r->next=s;
r=s;
}
scanf("%f, %d",&x,&y);
}
return(p);
}
void sort(struct term *La)
{ struct term *p,*q,*s;
for(p=La->next;p;p=p->next)
{ for(q=p->next;q;q=q->next)
{if(p->expn>q->expn)
{s=(struct term*)malloc(sizeof(struct term));
s->coef=q->coef;
s->expn=q->expn;
s->next=NULL;
q->coef=p->coef;
q->expn=p->expn;
p->coef=s->coef;
p->expn=s->expn;}
else
if(p->expn==q->expn)
{s=(struct term*)malloc(sizeof(struct term));
s->coef=p->coef+q->coef;
s->expn=p->expn;
s->next=NULL; 就这个排序函数不问题,
p=s;
s->next=p->next;
free(p);
free(q);}
else
{return;}
}
}
}

struct term *Add(struct term *f,struct term *g)
{
struct term *fg;
struct term *t,*q,*s,*r;
float m;
t=f->next;
q=g->next;
fg=r=(struct term*)malloc(sizeof(struct term));
fg->next=NULL;
while(t&&q)
{
if(t->expn==q->expn)
{
m=t->coef+q->coef;
if(m!=0)
{
s=(struct term*)malloc(sizeof(struct term));
s->coef=m;
s->expn=t->expn;
s->next=NULL;
}
t=t->next;
q=q->next;
}
else
if(t->expn<q->expn)
{
s=(struct term*)malloc(sizeof(struct term));
s->coef=t->coef;
s->expn=t->expn;
s->next=NULL;
t=t->next;
}
else
{
s=(struct term*)malloc(sizeof(struct term));
s->coef=q->coef;
s->expn=q->expn;
s->next=NULL;
q=q->next;
}

if(fg->next==NULL)
{
fg->next=s;
r=s;
}
else
{
r->next=s;
r=s;
}
}
r->next=t? t:q;
return (fg);
}


void print(struct term *f)
{
struct term *t;
t=f->next;
if(!f->next){
printf("\n"); return;
}
while(t)
{ if(t->coef>0&&f->next!=t) printf("+");
if(t->expn==0)
printf("%f",t->coef);
else
printf("%f*X^%d",t->coef,t->expn);
t=t->next;
}
printf("\n");
}
struct term *Mul(struct term *f,struct term *g)
{
struct term *h;
struct term *t,*q,*s,*r;
h=(struct term*)malloc(sizeof(struct term));
h->next=NULL;
r=(struct term*)malloc(sizeof(struct term));
r->next=NULL;
for(t=f->next;t;t=t->next)
{
for(q=g->next;q;q=q->next)
{
s=(struct term*)malloc(sizeof(struct term));
r->next=s;
s->coef=q->coef*t->coef;
s->expn=q->expn+t->expn;
s->next=NULL;
h=Add(r,h);
}

}
return(h);
}

void Open()
{
printf("*****************************\n");
printf(" phoyle's add and mulfiple \n");
printf("yun nan cai jing university ji ke 04-1 ban weiyinggui\n");
printf("*****************************\n");
printf("please choose operation:\n");
printf("0.quit\n");
printf("1.addtion of two phoyle\n");
printf("2.mutiple of two phoyle\n");
printf("3.user operate\n");
}
void Readme()
{
printf("**********user operation***********\n");
printf("1.when input only input phoyle's coef and expn.\n");
printf("2.please input as rise form.\n");
printf("3.for example \"1, 1 2, 2 0, 0\" meaning\"1*X^1+2*X^2\"\n");
printf("4.thank you for using!haha^_^\n");
}


void main()
{ struct term *f,*g,*fg;
int i;
i=-1;
Open();

while(i!=0)
{
scanf("%d",&i);
getchar();
switch(i)
{
case 0:
return;
case 1:
clrscr();
printf("please input A\n");
f=Creat('A');
sort(f);
printf("A=");
print(f);
printf("please input B\n");
g=Creat('B');
sort(g);
printf("B=");
print(g);
printf("A+B=");
fg=Add(f,g);
print(fg);
break;
case 2:
clrscr();
printf("please input A\n");
f=Creat('A');
sort(f);
printf("A=");
print(f);
printf("please input B\n");
g=Creat('B');
sort(g);
printf("B=");
print(g);
printf("A*B=");
fg=Mul(f,g);
print(fg);
break;
case 3:
clrscr();
Readme();
break;
default:
clrscr();
Open();
}
}

}


2006-05-06 22:48
韦应贵
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2006-4-30
收藏
得分:0 
对呀,基础肯定是要抓了,但我的意思是,让你们写个链表排序函数我来看看你们是怎么个思想?可能咱们的思路上一致的,但我那出现了一点点小错误吧
2006-05-06 23:14
韦应贵
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2006-4-30
收藏
得分:0 
就那我上面的程序来说吧.我总觉得我的排序函数是对的,但运行结果却跟我没加排序函数的一样呀,大哥大姐们,帮忙看看吧
2006-05-06 23:18
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
struct term
{
float coef;
int expn;
struct term * next;
};
/*根据expn排序*/
/*由于La永远做为表头,所以不用返回什么*/
void sort(struct term *La)
{ struct term *p,*q,*s;
for(p=La->next;p;p=p->next) /*La La->next */
{ for(q=p->next;q;q=q->next) /* p p->next */
{if(p->expn > q->expn) /* q q->next*/
{/*创建另一个链表,并复制结点的数据,实现P,Q的交换*/
s=(struct term*)malloc(sizeof(struct term));
s->coef=q->coef;
s->expn=q->expn;
s->next=NULL;
q->coef=p->coef;
q->expn=p->expn;
/*使P拥有最小值*/
p->coef=s->coef;
p->expn=s->expn;
}/*返回运行此语句for(q=p->next;q;q=q->next){if(p->expn > q->expn)时,P没变化,使得P获得整个链表的最小*/
else /*不要下面的语句行不行?*/
if(p->expn==q->expn)
{/*创建另一个链表,并复制结点的数据,实现P,Q的交换*/
s=(struct term*)malloc(sizeof(struct term));
s->coef=p->coef+q->coef;
s->expn=p->expn;
s->next=NULL; 就这个排序函数不问题,
p=s;
s->next=p->next;
free(p);
free(q);
}
else /*这语句是用来干什么的?*/
{return;}
}
}
}

Finding!!!
2006-05-26 16:37
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 

怎么格式会显得那么乱七八糟的???


Finding!!!
2006-05-26 16:39
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
struct term
{
float coef;
int expn;
struct term * next;
};
/*根据expn排序*/
/*由于La永远做为表头,所以不用返回什么*/
void sort(struct term *La)
{struct term *p,*q,*s;
for(p=La->next;p;p=p->next) /*La La->next */
{for(q=p->next;q;q=q->next) /* p p->next */
{if(p->expn > q->expn) /* q q->next*/
{/*创建另一个链表,并复制结点的数据,实现P,Q的交换*/
s=(struct term*)malloc(sizeof(struct term));
s->coef=q->coef;
s->expn=q->expn;
s->next=NULL;
q->coef=p->coef;
q->expn=p->expn;
/*使P拥有最小值*/
p->coef=s->coef;
p->expn=s->expn;
}
/*返回运行此语句for(q=p->next;q;q=q->next){if(p->expn > q->expn)时,P没变化,使得P获得整个链表的最小*/
else /*不要下面的语句行不行?*/
if(p->expn==q->expn)
{/*创建另一个链表,并复制结点的数据,实现P,Q的交换*/
s=(struct term*)malloc(sizeof(struct term));
s->coef=p->coef+q->coef;
s->expn=p->expn;
s->next=NULL; 就这个排序函数不问题,
p=s;
s->next=p->next;
free(p);
free(q);
}
else /*这语句是用来干什么的?*/
{return;}
}
}
}

[此贴子已经被作者于2006-5-26 16:43:53编辑过]


Finding!!!
2006-05-26 16:43
快速回复:谁能提供一个链表排序的程序吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016570 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved