#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int shangpinshu;
//我把提货分成了两种,完全提光的直接删除链表,不完全提光的修改一下就好了
//我在208行的main函数中对输入是否合法进行了检验,附加功能,菜单栏输入是否合法的检验
typedef struct goods //在此定义了链表类型的结构体goods
{
char goodsname[20];
char company[20];
int price;
int amount;
struct goods *next;
} LinkList;
LinkList *creat(int n) //该函数的功能是初始化链表,因为返回值linklist是一个指针所以在creat前面加了个*
{
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (int i = 0; i < n; i++)
{
node = (LinkList*)malloc(sizeof(LinkList));
printf("请输入第%d件商品的信息\n",i+1);
printf("请输入商品名称(不超过20个字)\n");
scanf("%s", node->goodsname);
printf("请输入商品制造商名称(不超过20个字)\n");
scanf("%s", node->company);
printf("请输入商品价格\n");
scanf("%d", &node->price);
printf("请输入商品数量\n");
scanf("%d", &node->amount);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
// 定义链表插入函数
// 在链表位置第pos节点前插入包含数据val的节点
void InsertList(LinkList *List, int val,int va2,char zi1[],char zi2[] )
{
int position = 0;
int pos=2;
LinkList *P = List; // 定义节点p指向头节点
// 寻找pos节点的前驱结点
while (P != NULL&&position<pos - 1)
{
P = P->next;
++position;
}
LinkList *Tmp = (LinkList*)malloc(sizeof(LinkList)); // 分配一个临时节点用来存储要插入的数据
if (Tmp == NULL)
{
printf("内存分配失败!");
exit(-1);
}
// 插入节点
Tmp->amount = val;
Tmp->price = va2;
strcpy(Tmp->goodsname,zi1);
strcpy(Tmp->company,zi2);
Tmp->next = P->next;
P->next = Tmp;
}
void insertSort(LinkList *mylist)//排序,按照价格的升序排序
{
if((mylist->next == NULL) || (mylist -> next -> next == NULL))
{
return;
}
LinkList * head, * p1, * prep1, * p2, * prep2, * temp;
head = mylist;
prep1 = head -> next;
p1 = prep1 -> next;
//prep1和p1是否需要手动后移
bool flag;
while(p1 != NULL)
{
flag = true;
temp = p1;
//由于是单向链表,所以只能从头部开始检索
for(prep2 = head, p2 = prep2 -> next; p2 != p1; prep2 = prep2 -> next, p2 = p2 -> next)
{
//发现第一个较大值
if(p2->price < p1->price)
{
p1 = p1 -> next;
prep1 -> next = p1;
prep2 -> next = temp;
temp -> next = p2;
flag = false;
break;
}
}
//手动后移prep1和p1
if(flag)
{
prep1 = prep1 -> next;
p1 = p1 -> next;
}
}
}
LinkList *DeleteValueNode(LinkList *pNode,char x[20]) //用于删除数据
{
LinkList *pMovePre;
LinkList *pMove;
pMovePre = pNode;
pMove = pNode->next;
while (pMove != NULL)
{
if (strcmp(pMove->goodsname,x) == 0)
{
pMovePre->next = pMove->next;
free(pMove);
pMove = NULL;
printf("成功记录提货信息\n");
return pNode;
}
pMovePre = pMovePre->next;
pMove = pMove->next;
}
printf("提货信息记录失败\n");
return pNode;
}
void WritetoFile(LinkList *head,int n)
{
FILE *fp;
int i,flag;
LinkList *wr;
wr=head;
flag=1;
if((fp = fopen("shop.txt","w"))==NULL)
{
printf("写入数据失败了,回家等着下岗吧!\n");
flag=0;
}
if(flag==1)
{
fprintf(fp,"%d\t",n);
for(i = 0; i < n; i++)
{
wr=wr->next;
fprintf(fp,"%20s%20s%10d%10d",wr->goodsname,wr->company,wr->price,wr->amount);
}
fclose(fp);
}
}
LinkList *ReadfromFile(LinkList *head,int n)
{
FILE *fp;
int i,flag;
LinkList *wr;
wr=head;
flag=1;
if((fp=fopen("shop.txt","r"))==NULL)
{
printf("读取数据失败了,回家等着下岗吧!\n");
flag=0;
}
if(flag==1)
{
fprintf(fp,"%d\t",shangpinshu);
for(i = 0; i < shangpinshu; i++)
{
wr=wr->next;
fprintf(fp,"%20s%20s%10d%10d",wr->goodsname,wr->company,wr->price,wr->amount);
}
fclose(fp);
}
return head;
}
int main()
{
int i;
int choice;
int flag1;
char aa3[20];
int b2;
int bb2;
char bbb2[20];
char bbbb2[20];
char diyi[20];
int yi;
LinkList *tmp4,*tmp5,*tmp11;
for(i=0; i<=10000; i++)
{
printf("请问您想做什么\n");
printf("请输入您想做的事情的编号例如输入1即可进入1的功能\n");
printf("0.初始化商品信息(前提是什么信息都没输入过才可以)\n");//ok
printf("1.变动(在已有商品信息上进行修改)\n"); //ok
printf("2.进货(新增一个商品)\n"); //ok
printf("3.提货(减少一个商品,如果不完全提光请进入1修改)\n"); //ok
printf("4.查询信息\n");
printf("5.开始营业\n"); //ok
printf("6.营业结束\n");
flag1=scanf("%d",&choice);
if((flag1==1)&&(choice<8)&&(choice>-1))
{
switch (choice)
{
case 0:
printf("请输入有多少件商品");
scanf("%d",&shangpinshu);
tmp4=creat(shangpinshu);
insertSort(tmp4);
break;
case 1:
printf("请输入您想更改信息的产品的名字");
scanf("%s",diyi);
tmp11=tmp4->next;
for(i=0; i<shangpinshu; i++)
{
if(strcmp(tmp11->goodsname,diyi)==0)
{
printf("更改商品名请按1,更改制造商名称请按2,更改售价请按3,更改数量请按4\n");
scanf("%d",&yi);
switch (yi)
{
case 1:
printf("请输入现在商品名");
scanf("%s",tmp11->goodsname);
break;
case 2:
printf("请输入现在制造商名");
scanf("%s",tmp11->company);
break;
case 3:
printf("请输入现在售价");
scanf("%d",&tmp11->price);
break;
case 4:
printf("请输入现在数量");
scanf("%d",&tmp11->amount);
break;
}
}
tmp11=tmp11->next;
}
break;
case 2:
printf("请输入商品名称(不超过20个字)\n");
scanf("%s", bbb2);
printf("请输入商品制造商名称(不超过20个字)\n");
scanf("%s", bbbb2);
printf("请输入商品价格\n");
scanf("%d", &b2);
printf("请输入商品数量\n");
scanf("%d", &bb2);
InsertList(tmp4,bb2,b2,bbb2,bbbb2);
shangpinshu = shangpinshu + 1;
break;
case 3:
printf("请输入您要提货并提空的商品的名字\n");
scanf("%s",aa3);
getchar();
tmp4=DeleteValueNode(tmp4,aa3);
shangpinshu = shangpinshu-1;
break;
case 4:
tmp5 = tmp4;
insertSort(tmp4);
for(i=0; i<=1000; i++)
{
if(tmp5->next != NULL)
{
tmp5 = tmp5->next;
printf("第%d件商品的价格为%d,名称为%s,制造商为%s,数量为%d \n",i+1, tmp5->price, tmp5->goodsname, tmp5->company, tmp5->amount);
printf(" \n");
}
else
{
break;
}
}
break;
case 5:
tmp4 = ReadfromFile(tmp4,shangpinshu);
break;
case 6:
WritetoFile(tmp4,shangpinshu);
break;
default:
printf("请重新输入一个数字");
}
}
else
{
printf("输入错误,请重新输入数字");
}
}
return 0;
}
c链表操作
最新推荐文章于 2023-10-15 16:16:56 发布