链表排序
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 }