对于前面的内容暂时概不罗嗦
直接进入正题
首先是类库和头文件
#include<iostream>
#include<string>
using namespace std;
//直接定义一个Stuent类为一个结点
class Student
{
public:;
string name;
int id;
};
class NodeStu
{
public :Student stu;
NodeStu *prior;
NodeStu *after;
NodeStu(int _id=0,string _name="")
{
stu.id=_id;
stu.name=_name;
prior=NULL;
after=NULL;
}
};
class LinkStu
{
private:
NodeStu *head;
int length;
public :
LinkStu()
{
head=NULL;
length=0;
}
void CreateLink(int ,Student s[]);
string SelectLinkByID(int );
void AddLink(int ,string);
void DeleteLinkByID(int );
void ChangeLinkByID(int ,string);
void PrintLink();
};
void LinkStu::CreateLink(int _length,Student s[])
{
NodeStu *p;
p=head=new NodeStu();
length=_length;
for(int i=1;i<=length;i++)
{
(*p).after=new NodeStu(s[i-1].id,s[i-1].name);
(*(*p).after).prior=p;
p=(*p).after;
}
}
void LinkStu::PrintLink()
{
NodeStu *p=head;
p=(*p).after;
cout<<"length="<<length<<endl;
while(p)
{
cout<<(*p).stu.id<<" "<<(*p).stu.name<<endl;
p=(*p).after;
}
cout<<endl;
}
void LinkStu::AddLink(int _id,string _name)
{
NodeStu *p=head;
p=(*p).after;
//WRONG PRIOR 已改正 需要注意一下
if(_id<(*p).stu.id)
{
NodeStu *temp=head,*temp2=(*head).after;
(*head).after=new NodeStu(_id,_name);
(*(*head).after).prior=NULL;
(*(*head).after).after=(temp2);
//(*(*p).after).after=(*temp).after;
(*temp2).prior=(*head).after;
length++;
return ;
}
while(p)
{
if((*p).after==NULL)
{
(*p).after=new NodeStu(_id,_name);
(*(*p).after).prior=p;
p=(*p).after;
length++;
return;
}
if(((*p).stu.id<_id)&&((*(*p).after).stu.id>_id))
{
NodeStu *temp=p,*temp2=(*p).after;
(*p).after=new NodeStu(_id,_name);
(*(*p).after).prior=p;
(*(*p).after).after=(temp2);
//(*(*p).after).after=(*temp).after;
p=(*p).after;
(*(*temp).after).prior=p;
length++;
return ;
}
p=(*p).after;
}
}
void LinkStu::DeleteLinkByID(int _id)
{
NodeStu *p=head;
p=(*p).after;
while(p)
{
if((*p).stu.id==_id)
{
if((*p).after==NULL){(*(*p).prior).after=NULL;length--;return;}
else
{
NodeStu *tPrior,*tAfter;
tPrior=(*p).prior;
tAfter=(*p).after;
//cout<<(*p).stu.id<<endl;
//cout<<(*(*p).prior).stu.id<<endl;
//cout<<(*tPrior).stu.id<<endl;
//cout<<(*tAfter).stu.id<<endl;
(*tPrior).after=tAfter;
(*tAfter).prior=tPrior;
length--;
//(*(*p).after).prior=(*p).prior;
//(*(*p).prior).after=(*p).after;
return;
}
}
p=(*p).after;
}
}
void LinkStu::ChangeLinkByID(int _id,string _name)
{
NodeStu *p=head;
p=(*p).after;
while(p)
{
if((*p).stu.id==_id){(*p).stu.name=_name;break;}
p=(*p).after;
}
}
string LinkStu::SelectLinkByID(int _id)
{
NodeStu *p=head;
string goalName="";
p=(*p).after;
while(p)
{
if((*p).stu.id==_id){goalName=(*p).stu.name;break;}
p=(*p).after;
}
if(goalName==""){return "";}
else {return goalName;}
}
然后是main函数
#include<iostream>
#include<string>
#include"hTest1_2.h"
using namespace std;
void Choice(LinkStu &ls)
{
int flag=true;
while(flag)
{
cout<<"请选择您所需要的服务1-增加 2-删除(按ID) 3-查询(按ID) 4-修改(按ID) 5-输出显示 6-退出"<<endl;
int choice=0,id=0;
string name="";
cin>>choice;
switch(choice)
{
case 1:
{
cout<<"请输入需要的添加的 ID 和 Name"<<endl;
cin>>id>>name;
(ls).AddLink(id,name);break;
}
case 2:
{
cout<<"请输入需要删除的ID号"<<endl;
cin>>id;
ls.DeleteLinkByID(id);
break;
}
case 3:
{
cout<<"请输入需要查询的人的ID"<<endl;
cin>>id;
cout<<"ID:"<<id<<" 姓名:"<<ls.SelectLinkByID(id)<<endl;
break;
}
case 4:
{
try
{
cout<<"请输入需要修改的人的ID 和 修改后的名字"<<endl;
//Getline();
cin>>id;
cin>>name;//为什么会出问题 读取String类型需要注意的事项
ls.ChangeLinkByID(id,name);
//sl.SortStu();
//ls.PrintLink();
break;
}
catch(exception ex){}
}
case 5:
{
ls.PrintLink();
break;
}
case 6:{flag=0;break;}
}
cout<<endl;
}
}
int main()
{
Student s[3]={{"张三",12},{"李四",25},{"王五",88}};
LinkStu ls;
ls.CreateLink(3,s);
Choice(ls);
//ls.PrintLink();
//ls.AddLink(7," adc");
//ls.PrintLink();
//ls.AddLink(14,"qunima");
//ls.PrintLink();
//ls.DeleteLinkByID(12);
//ls.PrintLink();
//ls.ChangeLinkByID(25,"sanba");
//ls.PrintLink();
//cout<<endl<<ls.SelectLinkByID(25)<<endl;
return 1;
}
PS:可能关于指针的部分有点混乱,大家将就看吧...