一.源程序代码
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 100
typedef 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;