• 欢迎光临~

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

开发技术 开发技术 2022-12-23 次浏览
单链表实现小商品信息管理系统

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

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("nn");
151     printf("tt     欢迎使用小商品信息管理系统n");
152     printf("tt*-----------------*----------------*n");
153     printf("tt*t1.创建商品链表                 *n");
154     printf("tt*t2.显示商品信息                 *n");
155     printf("tt*t3.录入商品信息                 *n");
156     printf("tt*t4.删除商品记录                 *n");
157     printf("tt*t5.查询商品信息(1.名称2.厂家3.编号)*n");
158     printf("tt*t6.购买管理                    *n");
159     printf("tt*t7.重新录入商品信息(修改)       *n");
160     printf("tt*t8.商品排序(1.售价;2.库存;3.编号)*n");
161     printf("tt*t9.退出程序                    *n");
162     printf("tt*------------------*---------------*n");
163     printf("tttchoice(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("%dt%st%st%dt%.2fn", 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("%dt%st%st%dt%.2fn", 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("%dt%st%st%dt%.2fn", 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库存:tt售价:n");
344             printf("%dtt%stt%st%dtt%.2fn", 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库存:tt售价:n");
355         printf("%dtt%stt%st%dtt%.2fn", p->id, p->name, p->factory, p->count, p->price);
356         printf("购买成功!");
357     } else{
358         printf("购买失败!库存仅有:n");
359         printf("%dtn", (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("%dt%st%st%dt%.2fn", 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

程序员灯塔
转载请注明原文链接:单链表实现小商品信息管理系统
喜欢 (0)