单链表实现小商品信息管理系统
设计一个小商品信息管理系统。根据以下功能,分析使用的逻辑结构和存储结构。
(1)增加功能:能录入新数据(包括:商品名称、商品编号、厂家、库存量,售价等信息)。
(2)删除功能:能够对系统中的商品信息进行删除。
(3)修改功能:能够对系统中的商品信息进行修改。
(4)购买管理:能够进行简单的购买管理(库存量变化和价格提示)。
(5)查询功能:通过商品名称、商品编号、厂家进行查询,显示查询结果。
(6)排序功能:可以根据商品编号、库存量、售价进行排序,使用至少2种排序方法进行排序,可选的排序方法有:直接插入排序、起泡排序、快速排序、简单选择排序等。
(7)显示功能:可以分别在增加、删除、修改、排序后,显示所有商品的信息。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //创建结构体及其成员 6 typedef struct LNode { 7 int id;//商品编号 8 char name[20];//商品名称 9 char factory[20];//生产厂家 10 int count;//库存 11 float price;//售价 12 struct LNode *next;//指针域 13 }Product;//结构体定义为Product 14 15 //函数声明 16 void menu();//商品菜单函数 17 void choose();//菜单选择函数 18 Product *create();//创建商品链表 19 void print(Product *);//输出商品链表 20 void pop_sortp(Product *);//冒泡排序-p 21 void pop_sortc(Product *);//冒泡排序-c 22 void insert_sort(Product *);//直接插入排序-i 23 void insert(Product *);//插入节点函数 24 void del(Product *);//删除节点函数 25 void search1(Product *);//商品名称查找函数 26 void search2(Product *);//生产厂家查找函数 27 void search3(Product *);//商品编号查找函数 28 void purchase(Product *);//购买管理 29 void mod(Product *);//修改商品信息 30 31 //商品菜单函数 32 void choose() { 33 Product *head; 34 int n, a = 1;//n用来控制选择操作类型,a控制循环,以-1终止 35 while (a > 0) { 36 menu();//显示菜单 37 printf("请您选择想使用的功能:"); 38 scanf("%d", &n);//选择操作 39 switch (n)//各操作数字对应菜单数字,通过n确定操作类型 40 { 41 case 1://创建 42 head = create(); 43 break; 44 case 2://输出 45 printf("商品信息为:\n"); 46 //pop_sort(head); 47 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 48 print(head); 49 break; 50 case 3://插入 51 insert(head); 52 printf("添加后:\n"); 53 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 54 print(head); 55 break; 56 case 4://删除 57 del(head); 58 printf("删除后:\n"); 59 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 60 print(head); 61 break; 62 case 5://查询 63 { 64 printf("1.按商品名称查询商品\n"); 65 printf("2.按商品厂家查询商品\n"); 66 printf("3.按商品编号查询商品\n"); 67 printf("请选择操作:\n"); 68 int choose1; 69 scanf("%d", &choose1); 70 switch (choose1) 71 { 72 case 1: 73 { //按商品名称查询商品 74 search1(head); 75 break; 76 } 77 case 2: 78 { //按商品厂家查询商品 79 search2(head); 80 break; 81 } 82 case 3: 83 { 84 //按商品编号查询商品 85 search3(head); 86 break; 87 } 88 } 89 break; 90 } 91 case 6://购买管理 92 purchase(head); 93 break; 94 case 7://修改 95 mod(head); 96 //pop_sort(head); 97 printf("商品信息为:\n"); 98 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 99 print(head); 100 break; 101 case 8://排序 102 { 103 printf("1.按售价--冒泡排序\n"); 104 printf("2.按库存--冒泡排序\n"); 105 printf("3.按编号--直接插入排序\n"); 106 printf("请选择操作:\n"); 107 int choose1; 108 scanf("%d", &choose1); 109 switch (choose1) 110 { 111 case 1: 112 { //售价冒泡 113 printf("商品信息为:\n"); 114 pop_sortp(head); 115 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 116 print(head); 117 break; 118 } 119 case 2: 120 { //库存冒泡 121 printf("商品信息为:\n"); 122 pop_sortc(head); 123 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 124 print(head); 125 break; 126 } 127 case 3: 128 { 129 //编号插入排序 130 printf("商品信息为:\n"); 131 insert_sort(head); 132 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 133 print(head); 134 break; 135 136 } 137 } 138 break; 139 } 140 default: 141 a = -1;//跳出循环条件 142 break; 143 } 144 } 145 system("pause");//防止程序崩溃看不到结果 146 } 147 148 //菜单显示函数 149 void menu() { 150 printf("\n\n"); 151 printf("\t\t 欢迎使用小商品信息管理系统\n"); 152 printf("\t\t*-----------------*----------------*\n"); 153 printf("\t\t*\t1.创建商品链表 *\n"); 154 printf("\t\t*\t2.显示商品信息 *\n"); 155 printf("\t\t*\t3.录入商品信息 *\n"); 156 printf("\t\t*\t4.删除商品记录 *\n"); 157 printf("\t\t*\t5.查询商品信息(1.名称2.厂家3.编号)*\n"); 158 printf("\t\t*\t6.购买管理 *\n"); 159 printf("\t\t*\t7.重新录入商品信息(修改) *\n"); 160 printf("\t\t*\t8.商品排序(1.售价;2.库存;3.编号)*\n"); 161 printf("\t\t*\t9.退出程序 *\n"); 162 printf("\t\t*------------------*---------------*\n"); 163 printf("\t\t\tchoice(1-9):\n"); 164 } 165 166 //创建商品链表 167 Product* create() { 168 Product *head, *p, *q;//定义指针 169 head = (Product *) malloc(sizeof(Product)); //为头节点开辟空间 170 head->next = NULL; //置空头节点的指针域 171 q = head; //q指针记录头节点的地址 172 printf("请您输入商品编号:商品名称:生产厂家:库存:售价:(输入0结束while循环输入)\n"); 173 int id; 174 scanf("%d", &id); 175 while (id != 0) //输入商品编号输入为0停止循环 176 { 177 p = (Product *) malloc(sizeof(Product)); //p指针开辟空间 178 //输入各成员 179 p->id = id; 180 scanf("%s %s %d %f", p->name, p->factory, &p->count, &p->price); 181 p->next = NULL;//置空p节点的指针域 182 q->next = p;//p,q节点连接 183 q = p;//q指针后移 184 printf("请您输入商品编号:商品名称:生产厂家:库存:售价:(输入0结束while循环输入)\n"); 185 scanf("%d", &id); 186 } 187 return head; //返回链表head节点 188 } 189 190 //插入节点(while可多个插入) 191 void insert(Product *head) { 192 int id, flag = 1;//flag标志--实现判断指针是否到达最后一个节点 193 Product *p, *q, *r; //定义指针便于插入操作 194 printf("请您输入商品信息:\n"); 195 printf("请您输入商品编号:(输入0结束while循环输入)\n"); 196 scanf("%d", &id); 197 while (id != 0)//输入商品编号不为零时循环,以零终止,可实现多个插入 198 { 199 r = (Product *) malloc(sizeof(Product));//为r开辟空间 200 r->next = NULL; //置空r的指针域 201 r->id = id; 202 printf("请输入商品名称:生产厂商:商品库存:售价:\n"); 203 scanf("%s %s %d %f", r->name, r->factory, &r->count, &r->price); 204 q = head;//q指针记录头节点的地址 205 p = head->next;//p指针记录头节点的指针域的地址 206 while (q->next != NULL)//循环条件:当q->next不为空,以及按售价排序插入&& p->price < r->price 207 { 208 p = p->next;//p指针后移 209 q = q->next;//q指针后移 210 if (q->next == NULL)//防止q->next为空使得程序出错 211 { 212 p = NULL; 213 q->next = r;//连接节点 214 r->next = NULL;//置空r指针域 215 flag = 0;//到达最后一个节点更改flag 216 break; 217 } 218 } 219 if (flag)//判断是否到达最后一个节点,为真执行该操作 220 { 221 r->next = p; 222 q->next = r; 223 //实现将r节点插入链表 224 } 225 printf("请您输入商品编号:(输入0结束while循环输入)\n"); 226 scanf("%d", &id); 227 } 228 } 229 230 //删除节点 231 void del(Product *head) { 232 Product *p, *q;//定义指针 233 int b;//用于输入编号查找删除 234 p = head;//p记录头节点的地址 235 q = head->next;//q记录头节点的指针域的地址 236 printf("请输入你想要删除的商品编号:"); 237 //输入编号 238 scanf("%d", &b); 239 while (q != NULL)//q不为空时执行循环 240 { 241 if (q->id == b)//判断是否找到输入的编号 242 //为真时 243 { 244 p->next = q->next;//断开q节点 245 free(q);//释放q节点内存 246 q = NULL; //置空q指针防止出现野指针 247 } else { 248 //判断为假时 249 p = p->next;//p指针后移 250 q = q->next;//q指针后移 251 } 252 } 253 if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出输入错误 254 printf("未查询到该商品编号\n"); 255 } 256 257 //按商品名称查找 258 void search1(Product *head) { 259 Product *p;//定义指针 260 char name1[20];//定义name1用于输入查找书名 261 printf("请输入你要查询的商品名称:"); 262 //输入查找商品名称: 263 scanf("%s", name1); 264 p = head->next; 265 while (p != NULL) { 266 if (strcmp(p->name, name1) == 0)//判断是否找到商品 name==name1 返回0; >返回正数,<返回负数 267 { 268 //为真时,输出信息 269 printf("商品信息\n"); 270 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 271 printf("%d\t%s\t%s\t%d\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 272 break; 273 }else 274 //为假时 275 p = p->next;//指针后移 276 } 277 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出未查询到该商品! 278 printf("未查询到该商品!\n"); 279 } 280 281 //按厂家查找 282 void search2(Product *head) { 283 Product *p;//定义指针 284 char name2[20];//定义name2用于输入查找生产厂商 285 printf("输入你想要查询商品的生产厂商:"); 286 //输入查找生产厂商 287 scanf("%s", name2); 288 p = head->next; 289 while (p != NULL) { 290 if (strcmp(p->factory, name2) == 0)//判断是否找到商品 291 { 292 //为真时,输出信息 293 printf("商品信息\n"); 294 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 295 printf("%d\t%s\t%s\t%d\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 296 break; 297 } else 298 //为假时 299 p = p->next;//指针后移 300 } 301 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出未查询到该商品! 302 printf("未查询到该商品!\n"); 303 } 304 305 //按编号查找 306 void search3(Product *head) { 307 Product *p;//定义指针 308 int id1;//定义id1用于输入查找书籍 309 printf("请输入你要搜索的商品编号:"); 310 //输入查找商品编号 311 scanf("%d", &id1); 312 p = head->next; 313 while (p != NULL) { 314 if (p->id == id1)//判断是否找到商品 315 { 316 //为真时,输出信息 317 printf("商品信息\n"); 318 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t售价:\n"); 319 printf("%d\t%s\t%s\t%d\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 320 break; 321 } else 322 //为假时 323 p = p->next;//指针后移 324 } 325 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出未查询到该商品! 326 printf("未查询到该商品!\n"); 327 } 328 329 //购买管理--按商品名称查找 330 int count1=0; 331 void searchp(Product *head) { 332 Product *p;//定义指针 333 char name1[20];//定义name1用于输入查找书名 334 printf("请输入用户需要购买的商品名称:\n"); 335 //输入查找商品名称: 336 scanf("%s", name1); 337 p = head->next; 338 while (p != NULL) { 339 if (strcmp(p->name, name1) == 0)//判断是否找到商品 name==name1 返回0; >返回正数,<返回负数 340 { 341 //为真时,输出信息 342 printf("商品信息:\n"); 343 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t\t售价:\n"); 344 printf("%d\t\t%s\t\t%s\t%d\t\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 345 break; 346 }else 347 //为假时 348 p = p->next;//指针后移 349 } 350 printf("请输入用户购买商品的数目:\n"); 351 scanf("%d", &count1); 352 p->count=(p->count)-count1; //动态更新库存数据 353 if((p->count)>=count1){ 354 printf("商品编号:\t商品名称:\t生产厂商:\t库存:\t\t售价:\n"); 355 printf("%d\t\t%s\t\t%s\t%d\t\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 356 printf("购买成功!"); 357 } else{ 358 printf("购买失败!库存仅有:\n"); 359 printf("%d\t\n", (p->count)+count1); //防止库存变成负数 360 p->count=(p->count)+count1; //动态更新库存数据 361 //防止再次购买时由于上次输入大于库存,当前库存为负数的情况发生 362 } 363 364 if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出未查询到该商品! 365 printf("库存中没有该商品!\n"); 366 } 367 //购买管理 368 void purchase(Product *head){ 369 searchp(head); //返回用户需要购买的商品信息--显示售价 370 } 371 372 //修改商品信息 373 void mod(Product *head) { 374 Product *p;//定义指针 375 int id1, id2, count1; //定义id1用于输入查找商品修改信息,id2用于修改 376 char name1[20], factory1[20]; 377 float price1; 378 printf("请输入你要修改的商品编号:"); 379 //输入要修改的商品编号 380 scanf("%d", &id1);//改前编号 381 p = head->next; 382 while (p != NULL) { 383 if (p->id == id1)//判断是否找到商品 384 { 385 printf("请您重新录入(修改)商品编号:商品名称:生产厂商:库存:售价:\n"); 386 //为真时,重输商品信息 387 scanf("%d %s %s %d %f", &id2, name1, factory1, &count1, &price1); 388 p->id = id2; 389 strcpy(p->name, name1); //strcpy比较字符串name&name1 390 strcpy(p->factory, factory1); 391 p->count = count1; 392 p->price = price1; 393 break; 394 } else 395 //为假时 396 p = p->next;//指针后移 397 } 398 if (p == NULL) //查找到最后一个节点还未查到要的编号时,输出未查询到该商品编号 399 printf("未查询到该商品编号!\n"); 400 } 401 402 //冒泡排序 403 void pop_sortp(Product *head) 404 { 405 //排序中没有修改头节点指针值,只是修改指针内容head->next的值 406 Product *pre, *p, *tail, *temp; 407 tail = NULL; 408 pre = head; 409 while ((head->next)!=tail)//(head->next)!=tail同样适用 ,多执行最后一个步比较 410 { 411 p = head->next; 412 pre = head; 413 while (p->next != tail) { 414 if ((p->price) > (p->next->price)) { 415 pre->next = p->next; //交换节点方法 416 temp = p->next->next; 417 p->next->next = p; 418 p->next = temp; 419 p = pre->next; //p回退一个节点 420 } 421 p = p->next; //p再前进一个节点 422 pre = pre->next; 423 } 424 tail = p; 425 } 426 } 427 428 //冒泡排序 429 void pop_sortc(Product *head) 430 { 431 //排序中没有修改头节点指针值,只是修改指针内容head->next的值 432 Product *pre, *p, *tail, *temp; 433 tail = NULL; 434 pre = head; 435 while ((head->next)!=tail) //(head->next)!=tail同样适用 ,多执行最后一个步比较 436 { 437 p = head->next; 438 pre = head; 439 while (p->next != tail) { 440 if ((p->count) > (p->next->count)) { 441 pre->next = p->next; //交换节点方法 442 temp = p->next->next; 443 p->next->next = p; 444 p->next = temp; 445 p = pre->next; //p回退一个节点 446 } 447 p = p->next; //p再前进一个节点 448 pre = pre->next; 449 } 450 tail = p; 451 } 452 } 453 454 //直接插入排序 455 void insert_sort(Product *head) 456 { 457 //这里的单链表是带头结点的单链表 458 Product* cur,*pre,*p; 459 cur = head->next->next; //指向第二个结点 460 head->next->next = NULL; 461 while(cur){ 462 p = cur->next; //保存当前结点的下一个结点的指针 463 pre = head; 464 //找到合适的位置 465 while(pre->next && pre->next->id < cur->id){ 466 pre = pre->next; 467 } 468 //进行插入操作 469 cur->next = pre->next; 470 pre->next = cur; 471 cur = p; 472 } 473 } 474 475 //输出商品链表--显示 476 void print(Product *head) { 477 Product *p = head->next; 478 while (p)//当p不为空的时候执行 479 { 480 printf("%d\t%s\t%s\t%d\t%.2f\n", p->id, p->name, p->factory, p->count, p->price); 481 p = p->next;//指针后移 482 } 483 } 484 485 //主函数 486 int main(){ 487 choose();//菜单选择函数 488 }
能力有限,略有不足,内容难免存在一些错误和不足,请大家见谅。@xiaoli
标签:head,单链,Product,next,小商品,printf,信息管理系统,商品编号,指针 From: https://www.cnblogs.com/lovexiaoli/p/17000178.html