List C++链式线性表

来源:互联网 发布:matlab约束粒子群算法 编辑:程序博客网 时间:2024/04/30 10:02

 

顺序结构的线性表-(C++)链表实现法 (本人在VC++6.0调试并编译通过)

#include<iostream>
#include<string>
using namespace std;
class infoOrder
{

public:
char PID[5];
int amount;
void get(char p[],int n)
{

memset(PID,0,5);
strcpy(PID,p);//产品代码
amount=n;//订购数量

}
void display()//显示单个产品条目的信息
{
cout<<"产品代码:"<<PID<<","<<"产品数量:"<<amount<<endl;
}

};

class Node
{
public:
//infoOrder *info;
infoOrder info;//直接定义实体就可以了,没必要用指针。
Node *NEXT; //链表接点指针
Node (char *p,int n)/*infoOrder *s=NULL,Node *n=NULL*//*:info(s),NEXT(n) */
{
info.get(p,n);
};
};
class List
{
private:
Node *START;
/* *CURRENT,
*PRECEDE; */
public:
List()
{
START=NULL;/*=CURRENT=PRECEDE=*/
};
~List()
{
destroy();
}
void addNode(infoOrder *s); //增加购买条目
bool delNode(infoOrder *s); //删除某个购买条目
bool updateNode(infoOrder *s);//更新某个购买条目的数量
void traverse(); //显示购买清单
void destroy(); //销毁购买清单
};

void List::destroy()
{
/*while(START!=NULL)
{
CURRENT=START;
START=START->NEXT;
delete CURRENT;
}*/
//START=PRECEDE=CURRENT=NULL;
START=NULL;
}

void List::addNode(infoOrder *s)
{
if(START==NULL)//链表为空时
{
START=new Node(s->PID,s->amount);
START->NEXT=NULL;
}
else//链表为非空时,插到表头
{
Node *p=new Node(s->PID,s->amount);
p->NEXT=START;
START=p;

}


}
bool List::updateNode(infoOrder *s)
{

Node *p=START;
for(p;p!=NULL;p=p->NEXT)//循环查找匹配的产品
{
if(strcmp(p->info.PID,s->PID)==0)//找到要修改的接点。
{
p->info.get(s->PID,s->amount);
}
}
return true;
}
void List::traverse()
{
Node *p=START;
if(START!=NULL)
{
cout<<"产品清单为:"<<endl;
for(p;p!=NULL;p=p->NEXT)//循环显示每一个产品
{
//p->info.display;
cout<<"商品代码"<<p->info.PID<<","<<"商品数量"<<p->info.amount<<endl;
}
}
else
{
cout<<"清单为空"<<endl;
}


}

bool List::delNode(infoOrder *s)
{

int flag=0;

if(START==NULL)
{
cout<<"清单为空,删除操作失败"<<endl;
}
else
{
Node *p=START;
Node *p1=START;
for(p;p!=NULL;p=p->NEXT)//循环查找匹配的产品
{
if(strcmp(p->info.PID,s->PID)==0)
{
flag=1;
break;
}
}
if(p==START)//删除头结点
{
START=START->NEXT;
p->NEXT==NULL;
delete p;
}
else if(p!=NULL)
{
for(p1=START;p1->NEXT!=p;p1=p1->NEXT);//删除非头结点,找到p的前一个接点。作好删除准备
p1->NEXT=p->NEXT;
p->NEXT=NULL;
delete p;
}

}
if(flag==0)
{
cout<<"清单中没有要删除的商品"<<endl;
}

return true;
}
int main()
{
infoOrder *sh;
sh=new infoOrder;
List obj;
char name[5];
int num;
int flag=1;
while(flag)
{
cout<<"1.添加结点:"<<endl;
cout<<"2.删除结点:"<<endl;
cout<<"3.修改结点:"<<endl;
cout<<"4.遍历结点:"<<endl;
cout<<"5.清空清单:"<<endl;
char ch;
cin>>ch;
switch(ch)
{
case '1'://添加结点
{
cout<<"输入要填加的商品和采购数量"<<endl;
cin>>name;
cin>>num;
sh->get(name,num);
obj.addNode(sh);
}
break;
case '2'://删除结点
{
cout<<"输入要删除的商品和采购数量"<<endl;
cin>>name;
cin>>num;
sh->get(name,num);
if(obj.delNode(sh)==false)
{
cout<<"not found"<<endl;
}
}
break;
case '3'://修改结点
{
cout<<"输入要修改的商品和采购数量"<<endl;
cin>>name;
cin>>num;
sh->get(name,num);

obj.updateNode(sh);
}
break;
case '4'://遍历结点
obj.traverse();
break;
case '5'://清空清单
obj.destroy();
break;
}
cout<<"继续操作请输入1,退出请输入0"<<endl;
cin>>flag;
}
delete sh;
return 0;
}