首页 > 其他分享 >单链表实现小商品信息管理系统

单链表实现小商品信息管理系统

时间:2022-12-23 10:44:17浏览次数:48  
标签:head 单链 Product next 小商品 printf 信息管理系统 商品编号 指针

单链表实现小商品信息管理系统

设计一个小商品信息管理系统。根据以下功能,分析使用的逻辑结构和存储结构。

(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

相关文章

  • C++实现单链表相关操作
    #include<iostream>#include<cstdlib>//C++动态分配存储空间usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemtype;typedefintStat......
  • 企业员工信息管理系统的设计与实现
    分类号_______________密级________________UDC_______________学号____毕业设计(论文)论文题目企业员工信息管理系统的设计与实现ThesisTopicDesignandimplementation......
  • 单链表与队列和栈
    单链表与队列和栈使用单链表实现队列队列是一个先进先出的数据结构,它包括进队、出队、获取队列大小等功能。代码:/***使用单链表实现队列*队列是一个先进先出的......
  • 如何规划和快速完成学生信息管理系统
    学生信息管理系统,是我们遇到的第一个比较完成的系统型项目。这个也是一个比较简单的一个项目,麻雀虽小五脏俱全。官方规定的完成时间是一周,但是同学们一般计划完成的时间一般......
  • C/C++校园超市商品信息管理系统
    C/C++校园超市商品信息管理系统实验14校园超市商品信息管理系统商品包含以下信息项:商品编号、商品名称、商品厂家名称、商品类型、商品销售价格商品进货价格、商品生产......
  • C++小型公司人员信息管理系统(多态)
    C++小型公司人员信息管理系统(多态)1.实验题目及要求已有应用为:某公司包含多种员工类型:技术员,产品经理,销售员、销售经理。技术员(包含工号(6位:000001999999)、姓名、电话......
  • 餐饮企业提升用户价值,从基于点单链路的精细化运营开始
     近几年,餐饮业的经营增长面临着巨大挑战,在这种情况下,餐饮企业如何提升用户价值,提高多风险下持续增长的动力呢?神策数据杨丽月聚焦用户运营,围绕“一条链路,四个指标”,跟大家分......
  • 基于springboot疫情防控期间某村外出务工人员信息管理系统设计与实现的源码+文档
    摘 要网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合,利用java技术建设疫情防控期间某村外出务工人员信息管理系统......
  • C++高校人员信息管理系统
    C++高校人员信息管理系统题目1高校人员信息管理系统设计1问题描述某高校有四类员工:教师、实验员、行政人员、教师兼行政人员:共有的信息包括编号、姓名、性别、年龄......
  • 单链表的扩展操作21----legend050709
    单链表的操作之补充: (1).单链表的反转: (2).单链表的排序(插入排序,选择排序,冒泡排序等): (3).单链表取得最小值的节点,及其前驱: (4).单链表获取最小的k个节点:(4-1)单链表......