源代码:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<string.h>
#include<fstream.h>
//---------------------------------------------------------------
const int MaxSize=10;
struct goods
{
char code[5];//商品的代号
char name[15];//商品的名称
int minq;//最低库存量
int curq;//当前库存量
};
typedef goods ElemType;
struct LNode
{
ElemType data;
LNode* next;
};
//------运算符重载-----
//“==”
int operator ==(const ElemType& e1,const ElemType& e2)
{
return (strcmp(e1.code,e2.code)==0);
}
//“<”
int operator <(const ElemType& e1,const ElemType& e2)
{
return (strcmp(e1.code,e2.code)==-1);
}
//"<<"
ostream& operator <<(ostream& ostr,const ElemType& x)
{
ostr<<x.code<<setw(12)<<x.name<<setw(4)<<x.minq<<setw(4)
<<x.curq<<endl;
return ostr;
}
//------------调用的函数---------
void InsertRear(LNode * & HL,const ElemType& item);
//向表末尾中加一个元素
void TraverseList(LNode * & HL);
//遍历一个线形表
void InitList(LNode* & HL);
//初始化线形表
int Update(LNode * & HL,const ElemType& item);
//更新新线形表中给定值的第一个元素
int Delete(LNode * & HL,const ElemType& item);
//从线形表中删除等于给定值的第一个元素
void LinkSort(LNode * & HL);
//对线形表排序
ElemType GetElem(LNode * & HL,int pos);
//GetElem得到线形表中指定序号的元素
int Find(LNode* HL,ElemType& item);
//Find从线形表中查找给定值的第一个元素
int ListSize(LNode * & HL);
//ListSize得到线形表长度
void ClearList(LNode* &HL);
//ClearList删除链表所有结点,使其为空
//-------------------------------
//#include"list.h"//调用头文件
void SetupGoodsList(LNode* & HL,char* fname)
{
ifstream ifstr(fname,ios::in|ios::nocreate);
cout<<fname;
if(!ifstr)
{
cerr<<"file not found!"<<endl;
exit(1);
}
goods g;
while(ifstr>>g.code)
{
ifstr>>g.name>>g.minq>>g.curq;
InsertRear(HL,g);
}
ifstr.close();
}
void WriteGoodsFile(char* fname,LNode * & HL)
{
ofstream ofstr(fname);
if(!ofstr)
{
cerr<<"file no create!"<<endl;
exit(1);
}
goods g;
int n=ListSize(HL);
for(int i=1;i<=n;i++)
{
g=GetElem(HL,i);
ofstr<<g.code<<" "<<g.name<<" "
<<g.minq<<" "<<g.curq<<endl;
}
ofstr.close();
}
//------------------------程序的实现-----------------------------
void main()
{
LNode* L2;//说明一个链表
InitList(L2);//初始化L2
SetupGoodsList(L2,"d:\\goods.txt");//把记录顺序读到L2中
int i,flag=1;
while(flag)//当flag为真时执行循环
{
cout<<"1打印整个库存表"<<endl;
cout<<"2修改库存表中的记录"<<endl;
cout<<"3删除库存表中的记录"<<endl;
cout<<"4对库存表排序"<<endl;
cout<<"5结束处理过程"<<endl;
cout<<"输入你的选择:";
cin>>i;
while(i<1||i>5)
{
cout<<"请选择1~5之间的数据:";
cin>>i;
}
cout<<endl;
switch(i)
{
case 1://打印
TraverseList(L2);
break;
case 2://修改
goods g;
int x;
cout<<"输入待修改的商品号:";
cin>>g.code;
if(Find(L2,g))
{
cout<<"输入该商品的修正量";
cin>>x;
g.curq+=x;
Update(L2,g);
}
else
{
cout<<"输入新商品记录的其他字段的内容:"<<endl;
cin>>g.name>>g.minq>>g.curq;
InsertRear(L2,g);
}
case 3://删除
cout<<"输入待删除商品的商品代号:";
cin>>g.code;
Delete(L2,g);
break;
case 4://排序
LinkSort(L2);
break;
case 5://结束
cout<<"本次处理结束,再见!"<<endl;
flag=0;
}
}
WriteGoodsFile("d:\\goods.txt",L2);//把处理好的线形表重新写入愿文件中。
}
//------------------函数主体--------------------------
void InsertRear(LNode* & HL,const ElemType& item)
//向表末尾中加一个元素
{
LNode* newptr;
newptr=new LNode; //为保存新元素分配动态结点,newtpr指向这个结点
if(newptr==NULL)
{
cerr<<"memory allocation failare!"<<endl;
exit(1);
}
newptr->data=item;
newptr->next=NULL;
if(HL==NULL)
HL=newptr;
else{
LNode* p=HL;
while(p->next!=NULL)
p=p->next;
p->next=newptr;
}
}
void TraverseList(LNode* & HL)
//遍历一个线形表
{
LNode* p=HL;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void InitList(LNode* & HL)
//初始化线形表
{
HL=NULL;
}
int Update(LNode* & HL,const ElemType& item)
//更新新线形表中给定值的第一个元素
{
LNode* p=HL;
while(p!=NULL)
if(p->data==item)
break;
else
p=p->next;
if(p==NULL)
return 0;
else
{
p->data=item;
return 1;
}
}
int Delete(LNode* & HL,const ElemType& item)
//从线形表中删除等于给定值的第一个元素
{
if(HL==NULL)
{
cerr<<"HL is NULL!"<<endl;
return 0;
}
LNode *ap,*cp;
ap=NULL;cp=HL;
while(cp!=NULL)
if(cp->data==item)
break;
else
{
ap=cp;
cp=cp->next;
}
if(cp==NULL){
cerr<<"Deleted element is not exist!"<<endl;
return 0;
}
if(ap==NULL)
HL=HL->next;
else
ap->next=cp->next;
delete cp;
return 1;
}
void LinkSort(ElemType a[],int n)
//对线形表排序
{
LNode* head=NULL;
int i;
for(i=0;i<n;i++)
InsertRear(head,a[i]);
LNode* p=head;
i=0;
while(p!=NULL){
a[i++]=p->data;
p=p->next;
}
ClearList(head);
}
//GetElem得到线形表中指定序号的元素
ElemType GetElem(LNode* & HL,int pos)
{
if(pos<1){
cerr<<"pos is out range!"<<endl;
exit(1);
}
LNode* p=HL;
int i=0;
while(p!=NULL){
i++;
if(i==pos)break;
p=p->next;
}
if(p!=NULL)
return p->data;
else{
cerr<<"pos is out range!"<<endl;
exit(1);
}
}
//Find从线形表中查找给定值的第一个元素
int Find(LNode* HL,ElemType& item)
{
LNode* p=HL;
while(p!=NULL)
if(p->data==item){
item=p->data;
return 1;
}
else
p=p->next;
return 0;
}
//ListSize得到线形表长度
int ListSize(LNode* & HL)
{
LNode* p=HL;
int i=0;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
//ClearList删除链表所有结点,使其为空
void ClearList(LNode* &HL)
{
LNode* cp, *np; //用np作为指向当前结点(即代处理结点)的指针
//(current pointer),用np作为指向当前结点的
//的后继结点的指针(next pointer)
cp=HL; //表头指针赋给cp
while(cp!=NULL)
{
np=cp->next; //保存下一个结点的指针
delete cp; //删除当前结点
cp=np; //使下一个结点成为当前结点
}
HL=NULL; //置单链表为空
}
//--------------------------------------------------------
头文件:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<string.h>
#include<fstream.h>
/*
//------运算符重载-----
//“==”
int operator == (const ElemType& e1,const ElemType& e2)
{
return (strcmp(e1.code,e2.code)==0);
}
//“<”
int operator <(const ElemType& e1,const ElemType& e2)
{
return (strcmp(e1.code,e2.code)==-1);
}
//"<<"
ostream& operator <<(ostream& ostr,const ElemType& x)
{
ostr<<x.code<<setw(12)<<x.name<<setw(4)<<x.minq<<setw(4)
<<x.curq<<endl;
}
//---------------------
*/
void SetupGoodsFile(char* fname)
{
ofstream ofstr(fname);
if(!ofstr){
cerr<<"file no create!"<<endl;
exit(1);
}
char a[30];
for(int i=0;i<6;i++)
{
cin.getline(a,30);
ofstr<<a<<endl;
}
ofstr.close();
}
/*
struct goods //商品记录类型
{
char code[5];
char name[15];
int minp;
int curp;
};
typedef goods ElemType;
*/
以上是我编的关于用链表实现的商品库存管理表,连接时出现了一些问题,请各位大侠帮忙指正一下,不胜感激,算法初学者,很迷茫.....
[此贴子已经被作者于2006-10-26 16:28:28编辑过]