1. (起评分 80)请使用线性表编写程序,实现一在线商城对商品进行管理,商 城客户可以查询商品信息,商城的商家可以添加、删除、查询、修改自己发布的 商品信息。 要求: 商品用户分为客户和商家。 客户可以在程序中查询商家发布的商品信息。 商家可以在程序中对自己发布的商品进行添加、删除、查询、修改操作。 代码符合规范,正确、易读、易操作。 提交材料包括:
(1) 对数据结构的分析,其逻辑结构、存储结构;
(2) 系统实现思路,可用流程图表示;
(3) 编码实现系统(包括代码和运行结果的截图);
(4) 分析代码的运行效率,如时间复杂度和空间复杂度
- 对数据结构的分析,其逻辑结构、存储结构
在这里用了顺序表,先对单个商品的数量和价格构造一个结构,
再用了另一个结构构造了以单个商品组成的数组顺序表,并对这个顺序表给了一个length来记录顺序表的长度,这样表的每个下标可以对应该单品的数量价格和位置,其中表的下标为商品位置。
- 系统实现思路,可用流程图表示
3.编码实现系统
下面是函数包(初始化,添加,删除,查询,修改,输出等)
(1)初始化
int InitList(SqList &L)//顺序表初始化
{
L.elem = (Good*)malloc(MAX_SIZE*sizeof(Good));
if(!L.elem)
{
printf("创建位置失败!\n");
return FALSE;
}
printf("创建位置成功!\n");
L.elem[1].num = 452; L.elem[1].price = 23.14;
L.elem[2].num = 78; L.elem[2].price = 65.10;
L.elem[3].num = 452; L.elem[3].price = 23.14;
L.elem[4].num = 46; L.elem[4].price = 56.00;
L.elem[5].num = 95; L.elem[5].price = 24.36;
L.elem[6].num = 14; L.elem[6].price = 47.29;
L.elem[7].num = 786; L.elem[7].price = 45.99;
L.elem[8].num = 37; L.elem[8].price = 99.99;
L.length = 8;
return OK;
}
(2)添加
int ListInsert(SqList &L,int i,int num,float price)//添加商品信息
{
if((i<1)||(i>L.length+1))
{
printf("不在正确位置,添加失败!\n");
return FALSE;
}
if(L.length == MAX_SIZE)
{
printf("位置已满,添加失败!\n");
return FALSE;
}
for(int j = L.length+1;j >= i;j--)
{
L.elem[j] = L.elem[j-1];
}
L.elem[i].num = num;
L.elem[i].price = price;
L.length++;
printf("添加成功!");
return OK;
}
(3)删除
int ListDelete(SqList &L,int i)//删除商品
{
if((i<1)||(i>L.length)) {
printf("删除失败!\n");
return FALSE;
}
for(int j = i;j<=L.length-1;j++)
{
L.elem[j] = L.elem[j+1];
}
L.length--;
printf("删除成功!\n");
return OK;
}
(4)查询
void ListSearch(SqList &L,int i)//查询商品信息
{
if(L.length == 0)
{
printf("无商品!");
}
if((i<1)||(i>L.length)){
printf("搜索失败,请重新输入\n");
return;
}
printf("查询结果为:\n");
printf("第%d个商品:商品数量%d;商品价格%.3f\n",i,L.elem[i].num,L.elem[i].price);
}
(5)修改
void ListChange(SqList &L,int i,int num,float price)//修改商品的数量和价格
{
if((i<1) || (i > L.length))
{
printf("修改失败!");
return;
}
L.elem[i].num = num;
L.elem[i].price = price;
printf("修改成功!");
}
(6)输出
void ListPrint(SqList &L)
{
int i;
for(i = 1; i <= L.length;i++)
{
printf("第%d个商品的数量为%d,价格为%.3f\n",i,L.elem[i].num,L.elem[i].price);
}
}
主函数
int main()
{
int user,select,i,j,k,number;
float price;
SqList L;
InitList(L);
printf("请输入数字1或2来进行操作:1表示商家,2表示客户:\n");
scanf("%d",&user);
int flag = 1;
int newflag = 1;
if(user == 1)
{
while(flag != 0)
{
printf("请输入要进行的操作;添加按1;删除按2;查询按3;修改按4\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("依次输入添加位置,商品数量,商品价格\n");
scanf("%d%d%f",&i,&number,&price);
ListInsert(L,i,number,price);
break;
case 2:
printf("请输入要删除的商品位置\n");
scanf("%d",&i);
ListDelete(L,i);
break;
case 3:
printf("请输入要查询的商品位置\n");
scanf("%d",&i);
ListSearch(L,i);
break;
case 4:
printf("请依次输入要修改的商品位置和该商品的新数量和新价格\n");
int newnum;float newprice;
scanf("%d%d%f",&i,&newnum,&newprice);
ListChange(L,i,newnum,newprice);
break;
}
printf("输入0停止操作;输入1继续操作");//可自行选择停止和进行操作
scanf("%d",&flag);
}
}
else if(user == 2)
{
while(newflag!=0)
{
printf("请输入要查询的商品位置\n");
scanf("%d",&i);
ListSearch(L,i);
printf("输入0停止操作;输入1继续操作\n");
scanf("%d",&newflag);
}
}
else{
printf("操作失败!");
}
ListPrint(L);//输出已知的所有商品信息
return 0;
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define MAX_SIZE 100
typedef struct
{
int num;
float price;
}Good;//对单个商品的信息结构
typedef struct
{
Good *elem;
int length;
}SqList;//关于Good数组类型的顺序表
int InitList(SqList &L)//顺序表初始化
{
L.elem = (Good*)malloc(MAX_SIZE*sizeof(Good));
if(!L.elem)
{
printf("创建位置失败!\n");
return FALSE;
}
printf("创建位置成功!\n");
L.elem[1].num = 452; L.elem[1].price = 23.14;
L.elem[2].num = 78; L.elem[2].price = 65.10;
L.elem[3].num = 452; L.elem[3].price = 23.14;
L.elem[4].num = 46; L.elem[4].price = 56.00;
L.elem[5].num = 95; L.elem[5].price = 24.36;
L.elem[6].num = 14; L.elem[6].price = 47.29;
L.elem[7].num = 786; L.elem[7].price = 45.99;
L.elem[8].num = 37; L.elem[8].price = 99.99;
L.length = 8;
return OK;
}
int ListInsert(SqList &L,int i,int num,float price)//添加商品信息
{
if((i<1)||(i>L.length+1))
{
printf("不在正确位置,添加失败!\n");
return FALSE;
}
if(L.length == MAX_SIZE)
{
printf("位置已满,添加失败!\n");
return FALSE;
}
for(int j = L.length+1;j >= i;j--)
{
L.elem[j] = L.elem[j-1];
}
L.elem[i].num = num;
L.elem[i].price = price;
L.length++;
printf("添加成功!");
return OK;
}
int ListDelete(SqList &L,int i)//删除商品
{
if((i<1)||(i>L.length)) {
printf("删除失败!\n");
return FALSE;
}
for(int j = i;j<=L.length-1;j++)
{
L.elem[j] = L.elem[j+1];
}
L.length--;
printf("删除成功!\n");
return OK;
}
void ListSearch(SqList &L,int i)//查询商品信息
{
if(L.length == 0)
{
printf("无商品!");
}
if((i<1)||(i>L.length)){
printf("搜索失败,请重新输入\n");
return;
}
printf("查询结果为:\n");
printf("第%d个商品:商品数量%d;商品价格%.3f\n",i,L.elem[i].num,L.elem[i].price);
}
void ListChange(SqList &L,int i,int num,float price)//修改商品的数量和价格
{
if((i<1) || (i > L.length))
{
printf("修改失败!");
return;
}
L.elem[i].num = num;
L.elem[i].price = price;
printf("修改成功!");
}
void ListPrint(SqList &L)
{
int i;
for(i = 1; i <= L.length;i++)
{
printf("第%d个商品的数量为%d,价格为%.3f\n",i,L.elem[i].num,L.elem[i].price);
}
}
int main()
{
int user,select,i,j,k,number;
float price;
SqList L;
InitList(L);
printf("请输入数字1或2来进行操作:1表示商家,2表示客户:\n");
scanf("%d",&user);
int flag = 1;
int newflag = 1;
if(user == 1)
{
while(flag != 0)
{
printf("请输入要进行的操作;添加按1;删除按2;查询按3;修改按4\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("依次输入添加位置,商品数量,商品价格\n");
scanf("%d%d%f",&i,&number,&price);
ListInsert(L,i,number,price);
break;
case 2:
printf("请输入要删除的商品位置\n");
scanf("%d",&i);
ListDelete(L,i);
break;
case 3:
printf("请输入要查询的商品位置\n");
scanf("%d",&i);
ListSearch(L,i);
break;
case 4:
printf("请依次输入要修改的商品位置和该商品的新数量和新价格\n");
int newnum;float newprice;
scanf("%d%d%f",&i,&newnum,&newprice);
ListChange(L,i,newnum,newprice);
break;
}
printf("输入0停止操作;输入1继续操作");//可自行选择停止和进行操作
scanf("%d",&flag);
}
}
else if(user == 2)
{
while(newflag!=0)
{
printf("请输入要查询的商品位置\n");
scanf("%d",&i);
ListSearch(L,i);
printf("输入0停止操作;输入1继续操作\n");
scanf("%d",&newflag);
}
}
else{
printf("操作失败!");
}
ListPrint(L);//输出已知的所有商品信息
return 0;
}
4.运行结果
如果为客户(查询)
若为商家(添加,删除,查询,修改各一遍)
5.时间复杂度和空间复杂度
对于我这个代码刚开始就已经初始化了一个100个元素的顺序表,就像一个超市,它所可以容纳的空间有限,可以根据实际情况改变这个数值,但是如果是大型的线上平台购物的类似空间的话,如果商品的种类的变化很快,这里就会浪费很多空间。所以大致来说,空间的利用率还有待提高
对于时间复杂度,在这里时间复杂度为O(1),因为在这里每一步都需要去操作,因为是顺序表,可以直接的找到商品,并可以对该商品进行操作