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 }