此题也花费一定的时间,不过确实加深了理解
由于链表不能用sort,所以排序我就用了最笨的方法。
然后此题特别搞笑,两个地方都要用降序。
name和price,之前的顺序表就没有。。。
之间需要定义一些记录量,来帮助断连。
此题以后有更好的方法,会来更新。
附上代码。
描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后将图书按照价格降序排序,逐行输出排序后每本图书的信息。
输入
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计n行,每行是一本图书的信息(书号、书名、价格),书号、书名、价格用空格分隔。其中价格输出保留两位小数。
样例输入1 复制
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
0 0 0
样例输出1
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787302164340 Operating-System 50.00
9787822234110 The-C-Programming-Language 38.00
9787810827430 Discrete-Mathematics 36.00
9787302203513 Database-Principles 36.00
9787302257646 Data-Structure 35.00
9787302219972 Software-Engineer 32.00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define OK 1 using namespace std; typedef struct { char no[20]; char name[50]; float price; }Book; typedef struct LNode { Book data; struct LNode *next; }LNode,*LinkList; LinkList L; LNode *pre; bool InintList(LinkList &L) { L=new LNode; L->next=NULL; return OK; } int main() { InintList(L); LNode *p=new LNode; L->next=p; while(scanf("%s%s%f",p->data.no,p->data.name,&p->data.price)) { if(p->data.no[0]=='0'&&p->data.name[0]=='0'&&((p->data.price-0.0)<1e-6)) { break; } else { pre=p; p->next=new LNode; p=p->next; } } pre->next=NULL; LNode *it; float MAX; LNode *pp;//记录最大值的位置 LNode *j;//在每个位置遍历 LNode *q;//移动时候前面那一个,来记录,并进行连接 LNode *qq;//记录it前面的位置 for(j=L;j!=NULL;) { MAX=j->next->data.price; //每次对MAX都要初始化 pp=j->next; //记录都要初始化 ,以防下面的for没有得到相关的值 qq=j; // 记录都要初始化,以防下面的for没有得到相关的值 for(it=j->next,q=j;it!=NULL;it=it->next,q=q->next) { if(it->data.price>MAX||((fabs(it->data.price-MAX)<1e-6)&&strcmp(it->data.name,pp->data.name)>0)) { //根据题意发现价格按降序,价格相同,名称也按降序。 MAX=it->data.price; pp=it; qq=q; } } if(pp!=j->next) //进行节点更新,最大点到前面的位置,然后连接去掉最大点的两个点 { qq->next=pp->next; pp->next=j->next; j->next=pp; } j=pp; //循环下一次的条件 if(j->next==NULL) //比较关键的一点,设置跳出条件,不然程序会一直run下去,考虑最后一个点的情况。 { break; } } it=L->next; while(it!=NULL) { printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price); it=it->next; } return 0; }
|