链表排序

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 #include "malloc.h"
  4 
  5 const int maxlen=1000;//线性表的最大长度
  6 typedef char type;
  7 
  8 struct Data{
  9     char name[20];//职工的姓名
 10     int num;//职工的编号
 11     float basic;//职工的基本工资
 12     float add;//职工的附加工资
 13     float sub;//职工的扣除工资
 14     float tall;//职工的总工资
 15 };
 16 //-------------链表------------------
 17 struct link_list
 18 {
 19     Data data;
 20     link_list *next;
 21 };
 22 
 23 /*创建链表*/
 24 link_list *Create_list(link_list *head)
 25 {
 26     head = (link_list *)malloc(sizeof link_list);//分配存储区域
 27     if(head==NULL)
 28     {
 29         printf("setup fail\n");
 30 
 31         exit(0);
 32     }
 33     head->data.name[0]='0';//表头结点的 数据区域置空
 34     head->data.num=0;//表头结点的 数据区域置空
 35     head->data.basic =0;   //初始为0基本工资
 36     head->data.add = 0;    //附加工资初始为0
 37     head->data.sub = 0;    //扣除工资初始为0
 38     head->data.tall = 0;    //总工资初始为0
 39     head->next=NULL;
 40     return head;
 41 }
 42 
 43 /*向链表中插入一个元素(插在链表的最后面)*/
 44 void Insert_list(link_list *head,Data data)
 45 {
 46     link_list *q=NULL;
 47     link_list *p=NULL;
 48     link_list *s=NULL;
 49     q=head;//头结点
 50     p=q->next;
 51     while(p!=NULL)//找到尾指针
 52     {
 53         q=p;
 54         p=q->next;
 55     }
 56     s=(link_list *)malloc(sizeof link_list);//分配存储区域
 57     s->data = data;
 58     q->next=s;
 59     s->next=p;
 60 }
 61 
 62 void compute(link_list *head)//计算每个职工的总工资
 63 {
 64     link_list *q=NULL;
 65     q=head->next;
 66     while(q!=NULL)
 67     {
 68         q->data.tall =q->data.basic + q->data.add  -q->data.sub;
 69         q=q->next;
 70     }
 71 }
 72 
 73 void Look(link_list *head)//查看所有职工信息
 74 {
 75     int i;
 76     link_list *q=NULL;
 77     q=head->next;
 78     printf("                         <全部职工信息如下>                             \n");
 79     printf("------------------------------------------------------------------------\n");
 80     printf("|姓名|\t|编号|\t|基本工资|\t附加工资|\t|扣除工资|\t|总工资|\n");
 81     printf("------------------------------------------------------------------------\n");
 82     
 83     while(q!=NULL)
 84     {
 85         for(i=0;q->data.name[i]!='\0';i++)
 86         {
 87             printf("%c",q->data.name[i]);
 88         }
 89         printf("\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",q->data.num,q->data.basic,q->data.add,q->data.sub,q->data.tall);
 90         q=q->next;
 91     }
 92     printf("-------------------------<全部职工信息如上>-----------------------------\n");
 93 }
 94 
 95 link_list *sort(link_list *head)//冒泡排序
 96 {
 97     link_list *p,*p1,*p2,*p3;
 98     link_list h, t;
 99     if (head == NULL) return NULL;
100     h.next=head;
101     p=&h;
102     while (p->next!=NULL)
103     {
104         p=p->next;
105     }
106     p=p->next=&t;
107     while (p!=h.next)
108     {
109         p3=&h;
110         p1=p3->next;
111         p2=p1->next;
112         while (p2!=p) 
113         {
114             if ((p1->data.num)>(p2->data.num))
115             {
116                 p1->next=p2->next;
117                 p2->next=p1;
118                 p3->next=p2;
119 
120                 p3=p2; 
121                 p2=p1->next;
122 
123             } else {
124                 p3=p1;
125                 p1=p2;
126                 p2=p2->next;
127             }
128         }
129         p=p1;
130     }
131     while (p->next!=&t)
132     {
133         p=p->next;
134     }
135     p->next=NULL;
136     return h.next;
137 }
138 void show(link_list *p,int num)//显示p结点的所有信息
139 {
140     int i;
141     printf("-------------------------[编号[%d]职工信息如下]-----------------------\n\n",num); 
142     printf("------------------------------------------------------------------------\n");
143     printf("|姓名|\t|编号|\t|基本工资|\t附加工资|\t|扣除工资|\t|总工资|\n");
144     printf("------------------------------------------------------------------------\n");
145     for(i=0;p->data.name[i]!='\0';i++)
146     {
147         printf("%c",p->data.name[i]);
148     }
149     printf("\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",p->data.num,p->data.basic,p->data.add,p->data.sub,p->data.tall);
150     printf("-------------------------[编号[%d]职工信息如上]-----------------------\n\n",num);
151 }
152 
153 void search(link_list *p,int num)  //按编号num查找职工信息
154 {
155     link_list *head=p;
156     printf("--------------------------<查看编号为[%d]的全部信息>-----------------\n",num); 
157     if(p==NULL)
158     {
159         printf("--------------------------[该链表为空链表]----------------------------\n"); 
160         printf("-------------------------[编号[%d]的职工不存在]-----------------------\n",num); 
161     }
162     else if(num==(p->data.num))   
163     {
164         show(p,num);
165     } else while(p!=NULL){
166         p=p->next;
167         if(p==NULL){
168             printf("-------------------------[该链表为空链表]-----------------------------\n"); 
169             printf("-------------------------[编号[%d]的职工不存在]-----------------------\n",num); 
170             break;
171         }if(num==(p->data.num))    
172         {
173             show(p,num);
174             break;
175         }
176     } 
177     p=head;
178 } 
179 
180 void insert(link_list *head)//链表尾部插入新的职工信息
181 {
182     int i;
183     Data data;
184     char name[20];
185     int num;
186     float basic;
187     float add;
188     float sub;
189     printf("      ------------------------------------\n");
190     printf("     |---------------插入职工信息---------|\n");
191     printf("      请输入职工姓名[字符串]:");
192     scanf("%s",&name);
193     printf("      请输入职工编号[整数]:");
194     scanf("%d",&num);
195     printf("      请输入基本工资[浮点数]:");
196     scanf("%f",&basic);
197     printf("      请输入附加工资[浮点数]:");
198     scanf("%f",&add);
199     printf("      请输入扣除工资[浮点数]:");
200     scanf("%f",&sub);
201     for(i=0;name[i]!='\0';i++)
202     {
203          data.name[i] = name[i];
204     }
205     data.name[i] ='\0';//结束
206     data.num = num;//编号
207     data.basic = basic;//基本工资
208     data.add = add;//附加工资
209     data.sub = sub;//扣除工资
210     data.tall = 0;//扣除工资
211     Insert_list(head,data);//插入职工基本信息
212     printf("     |-----------职工信息插入成功---------|\n");
213     printf("      ------------------------------------\n");
214 }
215 
216 int  main()
217 {
218      link_list* we;
219     link_list *head = NULL;
220     link_list *s = NULL;/*接收指针 case3的指针接收*/
221     head=Create_list(head);
222     int select;
223     do{
224         printf("      ----------------[菜单]--------------\n");
225         printf("     |--------1:插入职工信息--------------|\n");
226         printf("     |--------2:计算职工总工资------------|\n");
227         printf("     |--------3:职工编号(升序)---------- |\n");
228         printf("     |--------4:查找[按职工编号]----------|\n");
229         printf("     |--------5:查看全部职工信息----------|\n");
230         printf("     |--------6:退出----------------------|\n");
231         printf("      ------------------------------------\n");
232         printf("您的选择是:");
233         scanf("%d",&select);
234         while(select!=1&&select!=2&&select!=3&&select!=4&&select!=5&&select!=6)
235         {
236             printf("您输入有误,请重新输入:");
237             scanf("%d",&select);
238         }
239         switch(select)
240         {
241         case 1:
242              insert(head);//插入信息职工信息
243              break;
244         case 2:
245             compute(head);//计算职工总工资
246             Look(head);
247             break;
248         case 3:
249             
250             we = sort(head);
251             Look(we);
252             break;
253         case 4:
254             printf("查询的职工编号:");
255             scanf("%d",&select);
256             search(head,select);
257             break;
258         case 5:
259             Look(head);
260             break;
261         default:
262             exit(0);
263             break;
264         }
265         printf("\n");
266         printf("      ------------------------------------\n");
267         printf("     |--------1:继续操作------------------|\n");
268         printf("     |--------0:退出----------------------|\n");
269         printf("      ------------------------------------\n");
270         printf("您的选择是:");
271         scanf("%d",&select);
272         while(select!=1&&select!=0)
273         {
274             printf("您输入有误,请重新输入:");
275             scanf("%d",&select);
276         }
277     }while(select==1);
278     
279     return 0;
280 }

 

posted @ 2016-01-01 11:26  指间ゝ繁华初逝的格调  阅读(160)  评论(0编辑  收藏  举报