线性表的一道C语言题目——商品管理系统

线性表

近段时间有个朋友来问了我一个数据结构的实例,要求是用线性表的方法来撰写。

1)题目描述:
使用C语言的线性表技术,模拟实现一个简易的商品管理系统,以顺序表或者链表的形式储存商品信息数据。能够实现简单的信息输入,阅览查询、删除、修改等功能

2)程序功能要求:
A.实现一个线性表的结构体的定义:储存商品的编号、名称、价格、剩余数量
B.能够实现商品的输入、查看、删除 等功能
C.实现商品的进货和出售等功能(商品余额的修改)
当我看到这道题目的时候,我想的是既然已经很明确的给出了要求用的是线性表来做,那不如就用这道题目来复习一下线性表吧。

线性表
是最基本、最简单、也是最常用的一种数据结构,线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

特征

  1. 集合中必存在唯一的一个“第一元素”。
  2. 集合中必存在唯一的一个 “最后元素” 。
  3. 除最后一个元素之外,均有唯一的后继(后件)。
  4. 除第一个元素之外,均有唯一的前驱(前件)。

储存结构
线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。

结构特点

  1. .均匀性:虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度。
  2. 有序性:各数据元素在线性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素(直接前驱)和后面均只有一个数据元素(直接后继)。

对于表的基本操作

  1. ListEmpty(L):测试表L是否为空
  2. ListLength(L):表L的长度
  3. ListLocate(x,L):元素x在表L中的位置。若x在表中重复出现多次,则返回最前面x的位置
  4. ListRetrieve(k,L):返回表L的位置k处的元素。表中没有位置k时,该运算无定义
  5. ListInsert(k,x,L):表L的位置k之后插入元素x,并将原来占据该位置的元素及其后面的元素都向后推一个位置
    例如:设表L为a(1),a(2),…,a(n),那么在执行ListInsert(k,x,L)后,表L变为a(1),a(2),…,a(k),x,a(k+1),……,a(n)。若表中没有位置k,则该运算无定义。
  6. ListDelete(k,L):从表L中删除位置k出的元素,并返回被删除的元素。
    例如:设表L为a(1),a(2),…,a(n),那么在执行ListDelete(k,L)后,表L变为a(1),a(2),…,a(k-1),a(k+1),……,a(n)。返回单元素为a(k)。当表中没有位置k时,运算无定义
  7. PrintList(L):将表L中所有元素按位置的先后次序打印输出。

对于线性表的基本操作

  1. 创建线性表(Init):
int ListInit(List &L)
{
    L.element = (ElementType *)malloc(LIST_INIT_SIZE * sizeof(ElementType));//开辟存储空间,并把这块存储空间的基地址赋值给element
    if (!L.element)
    {
        return -1; //空间分配失败
    }
    L.length = 0; //将长度置为0
    L.listsize = LIST_INIT_SIZE; //将表分配为LIST_INIT_SIZE容量
    return 0;
}
  1. 查找线性表中的元素(Locate)

int ListLocate(List L, ElementType T)
{
    int pos=-1,i;//先将位置设为非法
    for (i=0;i<L.length;i++)
    {
        if (L.element[i]==T)//查询到
        {
            pos = i;//保存地址
        }
    }
    return pos;//返回地址,若为-1则报错
}
  1. 插入元素到线性表(Insert)
	
int ListInsert(List &L,int k)
{
    if (k<1||k>L.length+1)return -1;//判断插入位置是否合法
    //插入元素
    ElementType *pointer_L, *pointer_R; //定义2个指针变量
    pointer_L=&(L.element[k-1]); //左指针为插入位置(注意k是序号,序号是从从1开始的,而下标是从0开始的,因此这里转成下标后是k-1)
    for (pointer_R=&(L.element[L.length-1]);pointer_R>=pointer_L;--pointer_R) //从a[k]到a[n-1]依次后移,后移要用右指针依次左移
    {
        *(pointer_R+1)=*pointer_R;
    }
    L.length++;//表长加1
    return 0;
}
  1. 删除线性表中的元素(Delete)

int ListDelete(List &L,int k)
{
    //判断删除位置是否合法
    if (k<1||k>L.length)return -1; 
    //删除操作
    ElementType p; //用来保存被删除的元素,要是后续要用到可以直接取用
    p=&(L.element[k-1]);//p为被删除元素的,元素序号比位置要大1
    for (int i=k;i<L.length;i++)//从k位置开始依次前移
    {
        L.emelent[i-1]=L.element[i];
    }
    L.length--;//表长减1
    return p;
}
  1. 打印线性表(Print)
void PrintList(List L)
{
	int i;
	for (i=0;i<L.length;i++) printf("%d ",L.element[i]);
}

在这个基本框架下,我们来思考这道题目,由于题目告诉我们要保存的信息有商品的编号(Num),商品的名称(Name),商品的价格(Price)和商品的剩余数量(Rest),所以这里的ElementType是我们对储存商品信息定义的一个结构体

typedef struct ElementType
{
	int Num;
	char Name[20]
	double Price;
	int Rest
}ElementType;

创建一个表的类型

typedef struct list
{
	ElementType *element;
	int listsize;
	int length;
}SQList

结合上刚刚写的模板代码
还有对于用户交互体验的一些设计
就把这道题目写完了
下面是我写的代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define LIST_INIT_SIZE 100
typedef struct ElementType
{
    int Num;
    char Name[20];
    double Price;
    int Rest;
}ElementType;
typedef struct list
{
    ElementType *element;
    int listsize;
    int length;
}SQList;
int Initlist(SQList &L)
{
    L.element = (ElementType *)malloc(LIST_INIT_SIZE * sizeof(ElementType));
    if (!L.element)
    {
        return -1;
    }
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return 1;
}
int Locatelist(SQList L,int x)
{
    int pos=-1;
    for (int i=0;i<=L.length;i++)
    {
        if (L.element[i].Num==x)
        {
            pos = i;
        } 
    }
    return pos;
}
int ListDelete(SQList &L,int i)
{
    if(i<1||i>L.length)return -1;
    struct ElementType *p,*q;
    p = &(L.element[i-1]);
    q = L.element+L.length-1;
    for(;p<=q;p++)
    {
        *p = *(p+1);
    }
    --L.length;
    return 0;
}
int main(){
    SQList List;
    int n,z=1,change;
    system("title 商品管理系统 By:/你的名字");
    system("color A1");
	while(1){
        system("cls");
        printf("欢迎使用商品管理系统,请按提示使用!\n");
		printf("1.输入信息\n2.阅览查询\n3.删除信息\n4.信息修改\n0.退出系统\n");
        char ch=getch();
        while (ch>52||ch<48) ch=getch();
        int sNum;
		if(ch=='0')
        {
            system("cls");
			printf("谢谢您的使用,再见!\n\n\n\n");
			break; 
		}
        if (ch=='1')
        {
            system("cls");
            if (!z)
            {
                system("cls");
                printf("数据已经导入,请勿重复操作!\n\n\n\n\n");
                system("pause");
            }
            else
            {
                Initlist(List);
                printf("请输入你想输入多少个商品的信息:");
                scanf("%d",&n);
                List.length=n;
                for (int i=0;i<n;i++)
                {
                    system("cls");
                    printf("请输入第%d个商品的信息:\n",i+1);
                    printf("编号:");
                    scanf("%d",&List.element[i].Num);
                    printf("名称:");
                    scanf("%s",List.element[i].Name);
                    printf("价格:");
                    scanf("%lf",&List.element[i].Price);
                    printf("剩余数量:");
                    scanf("%d",&List.element[i].Rest);
                    printf("\n");
                    z=0;
                }
                continue;
            }
        }
		if(ch=='2')
        {
            system("cls");
            if (z)
            {
                printf("您还未输入数据,请先进行输入操作!\n\n\n\n\n");
                system("pause");
            }
			else
            {
                printf("请输入你想查询的商品编号:");
                scanf("%d",&sNum);
                system("cls");
                if (Locatelist(List,sNum)<0)
                {
                    system("cls");
                    printf("该商品未查询到\n\n\n\n\n");
                    system("pause");
                } 
                else 
                {
                    printf("%d号商品的信息为:\n编号:%d\n名称:%s\n价格:%.2lf\n剩余数量:%d\n",sNum,List.element[Locatelist(List,sNum)].Num,List.element[Locatelist(List,sNum)].Name,List.element[Locatelist(List,sNum)].Price,List.element[Locatelist(List,sNum)].Rest);
                    system("pause");
                }
            }
            continue;
        }
		if(ch=='3')
        {
            system("cls");
            if (z)
            {
                printf("您还未输入数据,请先进行输入操作!\n\n\n\n\n");
                system("pause");
            }
            else
            {
                printf("请输入你想删除的商品编号:");
                scanf("%d",&sNum);
                system("cls");
                if (Locatelist(List,sNum)<0)
                {
                    system("cls");
                    printf("该商品未查询到!\n\n\n\n\n");
                    system("pause");
                }
                else {
                    ListDelete(List,Locatelist(List,sNum)+1);
                    printf("该商品删除成功!\n\n\n\n\n");
                    system("pause");
                }
            }
            continue;
        }
        if (ch=='4')
        {
            system("cls");
            if (z)
            {
                printf("您还未输入数据,请先进行输入操作!\n\n\n\n\n");
                system("pause");
            }
            else
            {
                printf("请输入你要修改商品的编号:");
                scanf("%d",&sNum);
                system("cls");
                if (Locatelist(List,sNum)<0)
                {
                    system("cls");
                    printf("该商品未查询到!\n\n\n\n\n");
                    system("pause");
                }
                else {
                    while(1)
                    {
                        printf("选择你要进行的操作:\n1.进货出货\n2.修改单价\n0.退出修改");
                        char ch2=getch();
                        while(ch2>50||ch2<48)ch2=getch();
                        system("cls");
                        if (ch2=='0')
                        {
                            break;
                        }
                        if (ch2=='1')
                        {
                            system("cls");
                            printf("1.进货\n2.出货\n0.返回菜单");
                            char ch3=getch();
                            while (ch3>50||ch3<49)ch3=getch();
                            system("cls");
                            if (ch3=='0'){
                                break;
                            }
                            if (ch3=='1')
                            {
                                printf("请输入要增加多少库存:");
                                scanf("%d",&change);
                                List.element[Locatelist(List,sNum)].Rest+=change;
                                system("cls");
                                printf("库存已增加!");
                            }
                            if (ch3=='2')
                            {
                                printf("请输入要减少多少库存:");
                                scanf("%d",&change);
                                system("cls");
                                List.element[Locatelist(List,sNum)].Rest-=change;
                                if (List.element[Locatelist(List,sNum)].Rest<0)
                                {   
                                    system("cls");
                                    printf("库存不允许为负数!\n\n\n\n\n");
                                    system("pause");
                                    system("cls");
                                    List.element[Locatelist(List,sNum)].Rest+=change;
                                    break;
                                }
                                printf("库存已减少!\n\n\n\n\n");
                            }
                        }
                        if (ch2=='2')
                        {
                            system("cls");
                            printf("请选择修改后的商品单价:");
                            scanf("%lf",&List.element[Locatelist(List,sNum)].Price);
                            printf("商品单价已修改\n");
                        }
                        system("pause");
                        system("cls");
                    }
                }              
            }
        }
    }
    system("pause");
    return 0;
}

借鉴文章:https://www.cnblogs.com/Lance–blog/p/4908268.html
数据结构与算法设计(王晓东著)

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
设计一个商品销售管理程序。该程序应该具有以下功能: (1)录入、修改、删除某商品信息; (2)显示所有商品信息; (3)按商品编号由小到大的顺序显示商品信息; (4)按商品销售数量从大到小的顺序显示商品信息; (5)按商品名称、商品编号、供货商等信息进行查询,若查询信息不存在,输出没找到的信息; (6)商品的销售; (7)统计缺货商品(可设定一个边界范围,如数量小于5,以便及时订货),并产生订货信息; (8)商品销售统计。 题目要求: (1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序,即在程序中加入异常处理,检查用户输入数据的有效性,以保证程序的健壮性; (2)商品信息应该包括商品编号、名称、规格、进货数量、销售数量、价格、供货商名称等; (3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单选项选则所需进行的操作项目,菜单要界面友好、清晰; (4)将所有商品信息存储在一个文件中,并实现文件的读写操作,即将输入的数据以文件的形式存盘,将原来已经存盘的文件读入内存,进行管理; (5)应保证测试用例测试程序的各种边缘情况。 输入要求: 应用程序运行后,在屏幕上显示一个菜单。用户可以根据需要,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。 输出要求: (1)应用程序运行后,在屏幕上显示一个菜单。 (2)要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Capzera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值