数据结构课程设计

来源:互联网 发布:位面淘宝txt 编辑:程序博客网 时间:2024/06/08 14:27

一.源程序代码

   1. 头文件 goods.h

#ifndef GOODS_H_INCLUDED#define GOODS_H_INCLUDED#include<stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <malloc.h>#define MAXSIZE 100typedef struct                         //数据域定义为一个结构体{    char name[30];                     //商品名称    char no[30];                       //商品编号    int  num;                          //商品数量}goods;                                //商品结构体typedef struct node                    //定义单链表节点类型{    goods data;                        //数据域    struct node *next;                 //指针域,指向后继结点}LNode;LNode *Init_G();                       //初始化链表void input(LNode *L);                  //创建链表(尾插法)void run_over(LNode *L);               //浏览商品信息LNode* search(LNode *L,goods x);       //查找商品void goodspai(LNode *L);               //商品信息排序void insert(LNode *L,goods x);         //插入商品void storage(LNode *L,goods x);        //商品入库void goodsChange(LNode *L,goods x);    //以商品编号进行修改int del(LNode *L,goods x);             //删除void out(LNode *L,goods x);            //商品出库void save(LNode *L);                   //保存操作void menu();                           //功能选择窗口  //#endif // GOODS_H_INCLUDED


   2.实现函数功能的cpp文件 goods.cpp

#include "goods.h"#include <windows.h>#include <time.h>/************************************* 功能描述:录入商品信息* 输入参数:输入录入个数及需要录入的信息* 输出参数:无* 备注信息:尾插法创建链表*************************************/void input(LNode *L)                                //尾插法创建链表{    int i,n;    LNode *r=L,*s;    goods x;    printf("\n请输入商品的种数:");    scanf("%d",&n);    printf("\n ****   请输入商品的名称、编号、数量   ****\n");    printf("\n");    for(i=1;i<=n;i++)    {        printf("              o商品名称: ");        scanf("%s",x.name);        printf("              o商品编号: ");        scanf("%s",x.no);        printf("              o商品数量: ");        scanf("%d",&x.num);        s=(LNode*)malloc(sizeof(LNode));        s->data=x;        s->next=NULL;        r->next=s;        r=s;        printf("\n");    }    printf("\n ****       录入结束,返回上一级      ****\n");}/************************************* 功能描述:浏览商品信息清单* 输入参数:无* 输出参数:所有商品信息* 备注信息:链表的遍历及输出*************************************/void run_over(LNode *L){    LNode *p=L->next;    if(p==NULL)    {        printf("--------------该系统还未录入商品信息,请录入后在进行操作--------------\n");        menu();    }    printf("\n-----------下面是商品信息一览表-----------\n");    printf("\n");    printf("商品名称   商品编号    商品数量\n");    printf("\n");    while(p!=NULL)    {        printf("%5s%10s%12d\n",p->data.name,p->data.no,p->data.num);        p=p->next;    }    printf("\n");    printf("\n");}/************************************* 功能描述:查找商品信息* 输入参数:要查找的商品编号* 输出参数:商品信息* 备注信息:按元素值在链表中查询*************************************/LNode* search(LNode *L,goods x){    LNode *p=L->next;    while(p!=NULL&&(strcmp(p->data.no,x.no)!=0))    {        p=p->next;    }    if(p!=NULL&&(strcmp(p->data.no,x.no)==0))            //查找到相应商品,返回指针    {        return p;    }    else    {        return NULL;    }}/************************************* 功能描述:插入新增商品* 输入参数:新增商品的编号,名称及数量* 输出参数:无* 备注信息:链表的插入*************************************/void insert(LNode *L,goods x){    LNode *p=L,*s;    while(p->next!=NULL&&(strcmp(p->next->data.no,x.no)!=0))               //商品不存在时可插入到已有链表上    {        p=p->next;    }    s=(LNode*)malloc(sizeof(LNode));    s->data=x;    s->next=p->next;    p->next=s;}/************************************* 功能描述:排序商品信息* 输入参数:无* 输出参数:无* 备注信息:直接插入排序和冒泡排序*************************************/void goodspai(LNode *L){    LNode *p,*q,*r;    int choose;    goods x;    printf("请选择排序方式:");    printf("1.按商品编号排序   2.按库存数量排序 \n");    scanf("%d",&choose);    switch(choose)    {        case 1:                            //按商品编号排序为直接插入排序            p=L->next->next;                                                     //p指向第一个节点的后继            L->next->next=NULL;                                                  //直接插入排序,第一个元素在有序区,从第二元素起依次插入            while(p!=NULL)            {                r=p->next;                                                       //r指针暂存p的后继                q=L;                while(q->next!=NULL&&(strcmp(q->next->data.no,p->data.no)>0))    //查找插入位置                    q=q->next;                                                   //将p节点链入链表                p->next=q->next;                q->next=p;                p=r;            }            break;        case 2:                          //按商品数量排序为冒泡排序             p=L->next;             while(p)             {                q=p->next;                while(q)                {                    if(p->data.num<=q->data.num)                    {                        x=p->data;                        p->data=q->data;                        q->data=x;                    }                    q=q->next;                }                p=p->next;            }            break;    }}/************************************* 功能描述:商品入库* 输入参数:入库商品信息* 输出参数:无* 备注信息:无*************************************/void storage(LNode *L,goods x){    LNode *p;    p=search(L,x);    if(p==NULL)                                            //链表中没有这个商品时可直接插入    {        insert(L,x);    }    else    {        p->data.num=p->data.num+x.num;                     //链表中中有这个商品时只增加商品的数量    }}/************************************* 功能描述:商品信息修改* 输入参数:商品编号* 输出参数:无* 备注信息:无*************************************/void goodsChange(LNode *L,goods x)                           //以商品编号进行修改{    LNode *p;    char chname[30];    char chno[30];    int chnum;    p=search(L,x);    if(p==NULL)    {        printf("\n仓库中无此商品!\n");    }    else    {        printf("\n             o 修改商品编号:         ");        scanf("%s",chno);        strcpy(p->data.no,chno);        printf("\n             o 修改商品名称:         ");        scanf("%s",chname);        strcpy(p->data.name,chname);        printf("\n             o 修改商品数量:         ");        scanf("%d",&chnum);        p->data.num=chnum;        printf("\n                               √成功修改!\n");        printf("\n");    }}/************************************* 功能描述:删除商品* 输入参数:要删除的商品编号* 输出参数:无* 备注信息:删除链表元素*************************************/int del(LNode *L,goods x)                           //删除商品信息{    LNode *p;    long n;    int flag=0;                                      //flag为判断商品是否删除的标志    p=L;    for(; p!=NULL; p=p->next)    {        if(p->next!=NULL&&(strcmp(p->next->data.no,x.no)==0))        {            p->next=p->next->next;               //删除语句            flag=1;            break;        }    }    if(p==NULL&&flag==0)    {        printf("\n                             不存在此商品!");       printf("\n--------------------------------------------------");       menu();    }    return 1;}/************************************* 功能描述:商品出库* 输入参数:出库商品及出库数量* 输出参数:是否购买成功* 备注信息:模拟超市实际购买操作,增加系统可用性*************************************/void out(LNode *L,goods x){    int j;    LNode *p;    p=search(L,x);    if(p==NULL)    {        printf("\n仓库中无此商品!\n");    }    else    {        printf("\n   您要购买的商品为:%s。\n",p->data.name);        if(p->data.num>x.num)                                     //购买的商品数量少于库存量时        {            printf("\n购买成功!欢迎下次光临!\n");            p->data.num=p->data.num-x.num;                        //库存数=原库存数-购买数            printf("\n");            printf("\n该商品还有%d件。\n",p->data.num);           //显示现在的库存        }        else if(p->data.num==x.num)                               //购买的商品数量等于库存量时        {            printf("\n购买成功!欢迎下次光临!\n");                            del(L,x);                                             //调用删除函数,系统显示已售空            printf("\n");            printf("\n该商品已售空,请及时补充库存。\n");                  }        else if(p->data.num<x.num)                                //购买的商品数量多于库存量时        {            printf("\n该商品数量不足,仅剩%d。是否购买\n",p->data.num);            printf("(购买请按1,不购买请按0。)\n");            printf("请输入您的的选择:");            scanf("%d",&j);            if(j==1)            {                del(L,x);                                         //若选择购买,则把剩余的该商品全部买走                printf("\n购买成功!欢迎下次光临!\n");                printf("\n");                printf("\n该商品已售空,请及时补充库存。\n");            }            else            {                printf("\n欢迎下次光临!\n");            }        }    }}/************************************* 功能描述:保存操作数据* 输入参数:无* 输出参数:所有信息* 备注信息:把数据写入文件*************************************/void save(LNode *L)                           //保存操作结果{    int i;    LNode *p=L->next, *q=L->next;    FILE *fp;                                 //文件指针    if(p==NULL)    {        printf("现在没有商品信息,请先输入信息再进行操作\n");        return;    }    fp=fopen("goods.txt","w");                 //在当前目录下打开goods.txt文件并设置只允许“写”操作    if(!fp)    {        printf("文件不存在\n");        return;    }    //将商品信息写入文件    fprintf(fp,"===========================商品信息一览表===========================\n");    fprintf(fp,"\n");    fprintf(fp,"商品名称\t商品编号\t商品数量\n");    while(p!=NULL)    {        fprintf(fp,"%s\t\t%s\t\t%d\t\t",p->data.name,p->data.no,p->data.num);        fprintf(fp,"\n");        p=p->next;    }    fclose(fp);                                //把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针    printf("数据已成功导入文件goods.txt!\n");}/************************************* 功能描述:显示系统功能界面* 输入参数:无* 输出参数:无* 备注信息:无*************************************/void menu(){    printf("\n\n\n\n\n\n");    printf("************************欢迎进入超市商品管理系统************************\n");    printf("\n\n");    system("color 74");    printf("请稍后...\n");    for(int k=0;k<75;k++)    {        Sleep(30);        printf(">");    }    system("cls");    printf("\n\n\n\n\n\n");    printf("                       ┏━━━━━━━━━━━━━━━━━━┓\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃       请选择您要操作的项目         ┃\n");    printf("  ◥◤~~~~◥◤       ┃                                    ┃\n");    printf("                       ┃          1 录入商品信息            ┃\n");    printf("┃           ┃    ┃                                    ┃\n");    printf("                       ┃          2 浏览商品清单            ┃\n");    printf("   ≡━ ﹏ ━≡        ┃                                    ┃\n");    printf("                       ┃          3 查找商品信息            ┃\n");    printf("┗━━┳∞┳━━┛     ┃                                    ┃\n");    printf("                       ┃          4 修改商品信息            ┃\n");    printf("    ┏┫  ┣┓         ┃                                    ┃\n");    printf("                       ┃          5 商品信息排序            ┃\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃          6 商品入库                ┃\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃          7 商品出库                ┃\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃          8 删除商品                ┃\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃          9 保存操作                ┃\n");    printf("                       ┃                                    ┃\n");    printf("                       ┃          0 退出系统                ┃\n");    printf("                       ┗━━━━━━━━━━━━━━━━━━┛\n");}
   3.main函数
#include "goods.h"#include <windows.h>#include <time.h>int main(){    goods x;    int sel;    LNode *L,*p;    L=(LNode *)malloc(sizeof(LNode));    do    {        menu();        printf("\n");        printf("\n");        printf("  o 请输入您的选择:\n");        scanf("%d",&sel);        switch(sel)        {            case 1:                   printf("\n您选择了录入商品信息功能!\n\n");                   input(L);                   Sleep(2000);                   system("cls");                   break;            case 2:                   printf("\n您选择了浏览商品清单功能!\n\n");                   printf("\n");                   run_over(L);                   Sleep(2000);                   system("cls");                   break;            case 3:                   printf("\n您选择了查找商品信息功能!\n\n");                   printf("\n");                   printf("\n请输入要查找的商品的编号:\n");                   printf("\n");                   printf("您输入的编号为:");                   printf("\n");                   scanf("%s",x.no);                   p=search(L,x);                   if(p==NULL)                   {                       printf("\n该商品不存在。\n");                   }                   else                   {                       printf("\n商品名称    商品编号    商品数量\n");                       printf("%5s%10s%12d\n",p->data.name,p->data.no,p->data.num);                   }                   Sleep(2000);                   system("cls");                   break;            case 4:                   printf("\n您选择了修改商品信息功能!\n\n");                   printf("\n");                   printf("\n请输入要修改的商品的编号:\n");                   printf("\n");                   printf("              o商品编号: ");                   scanf("%s",x.no);                   goodsChange(L,x);                   Sleep(2000);                   system("cls");                   break;            case 5:                   goodspai(L);                   printf("\n已完成排序,若要查看排序后的结果,请回到初始界面。 \n");                   Sleep(2000);                   system("cls");                   break;            case 6:                   printf("\n您选择了商品入库功能!\n\n");                   printf("\n");                   printf("\n请输入要入库的商品的名称、编号及数量:\n");                   printf("\n");                   printf("              o商品名称: ");                   scanf("%s",x.name);                   printf("              o商品编号: ");                   scanf("%s",x.no);                   printf("              o商品数量: ");                   scanf("%d",&x.num);                   storage(L,x);                   printf("\n                              √入库成功! \n");                   Sleep(2000);                   system("cls");                   break;            case 7:                  printf("\n您选择了商品出库功能!\n\n");                  printf("\n");                  printf("\n请输入要出库的商品的编号、数量:\n");                  printf("\n");                  printf("              o商品编号: ");                  scanf("%s",x.no);                  printf("              o商品数量: ");                  scanf("%d",&x.num);                  out(L,x);                  Sleep(2000);                  system("cls");                  break;            case 8:                  printf("\n您选择了商品删除功能!\n\n");                  printf("\n");                  printf("\n请输入要出库的商品的编号:\n");                  printf("\n");                  printf("              o商品编号: ");                  scanf("%s",x.no);                  del(L,x);                  printf("\n                              √成功删除!");                  printf("\n");                  printf("\n---------------------------------------------");                  Sleep(2000);                  system("cls");                  break;            case 9:                  printf("\n您选择了保存操作功能!\n\n");                  printf("\n");                  save(L);                  printf("\n                              √保存成功!");                  break;        }    }    while(sel!=0);    printf("感谢您的使用,再见!\n");    return 0;}
二、程序运行截图

       1.初始界面




       2.录入商品信息


           浏览当前商品清单


       4.修改商品信息

           输入有误时


           输入无误时


          浏览修改后的商品信息


       5.商品信息排序

          按编号排序


          浏览排序后的信息


          按库存量排序


          浏览排序后的信息


       6.查找商品信息

          商品不存在时


          商品存在时


       7.商品入库


          浏览商品入库后的信息


       8.商品出库   

          购买数量小于库存数时


          购买数量等于库存数时


          购买数量大于库存数时


          浏览出库后的商品信息


       9.删除商品信息


            浏览删除后的信息


       11.把商品信息写入文件



       12.退出系统


       

原创粉丝点击