定义一个链表节点结构体Node,
定义一个类,成员为链表的头指针head,即head指向第一个节点
类中封装了各种链表处理函数如下
List& push_front(const T& d);//前插,插在头节点
void push_back(const T& d);//后插,插在末尾
int size()const;//计算链表长度
bool empty(){return head==NULL;}//是否空
void insert(const T& d,int pos);//在指定位置pos插入数据d,如pos=1;插在1节点与2节点之间
Node*& getptr(int pos);//获取第k个节点的成员指针的引用
void clear();//清空链表
void travel()const;//遍历链表并输出
void find(const T& d)const;//在链表中查找数据d
void change(const T& d,int pos);//把pos位置的节点数据改成d
int dele1(int pos);//删除指定位置的数据
void dele2(const T& d);//删除等于指定数据的节点
void Oth();//倒置整个链表
void Sort(bool f);//链表进行升降序排列
void Save(char* argv);//保存链表数据到文件argv
链表处理函数过多,简单的就不再赘述,经典函数罗列如下:
1.getptr
Node*& List::getptr(int pos)//返回第K个成员的成员指针引用!
{
if(pos>size()||pos<0) return head;
if(pos==0) return head;
Node* p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
return (*p).next;
}
2 insert函数
void List::insert(const T& d,int pos)
{
Node*& pn = getptr(pos);//注意引用!一直引用!
Node* p=new Node(d);
p->next=pn;
pn=p;
}
3.倒置链表Oth函数
void List::Oth(){//倒置一个链表,进行data倒置
int len=size();
Node* ptr[len];
ptr[0]=head;
for(int i=1;i<len;i++)
{
ptr[i]=ptr[i-1]->next;
}
for(int i=0;i<len/2;i++)
{
(ptr[i]->data)^=(ptr[len-i-1]->data);
(ptr[len-i-1]->data)^=(ptr[i]->data);
(ptr[i]->data)^=(ptr[len-i-1]->data);
}
}
4.排序函数
void List::Sort(bool f){
int i,j;
int len=size();
for(i=1;i<len;i++)
{
Node* p=head;
for(j=0;j<len-i;j++)
{
if((f&&(p->data)>(p->next->data))||(!f&&(p->data)<(p->next->data)))
{
(p->data)^=(p->next->data);
(p->next->data)^=(p->data);
(p->data)^=(p->next->data);
}
p=p->next;
}
}
}
5.保存链表数据到文件argv的save函数
void List::Save(char* argv){
ofstream fo(argv,ios::out|ios::binary);
Node* p=head;
if(!fo){cout<<"打开文件"<<"失败"<<endl;}
for(int i=0;i<size();i++)
{
fo<<"第"<<i+1<<"个节点:"<<"数据:"<<(p->data)<<endl;
p=p->next;
}
fo.close();
}
本人添加由用户输入命令来决定链表操作,显得格外有趣
menu函数:用于显示菜单,用于人机交互
void menu()
{
cout<<'\t'<<"欢迎进入链表管理系统"<<'\t'<<endl;
cout<<'\t'<<"指定位置插入数据: i 位置 数据"<<'\t'<<endl;
cout<<'\t'<<"前面插入数据:f 数据"<<'\t'<<endl;
cout<<'\t'<<"末尾插入数据:b 数据"<<'\t'<<endl;
cout<<'\t'<<"删除指定位置的数据: e 位置"<<'\t'<<endl;
cout<<'\t'<<"删除等于指定数据的所有数据: r 数据"<<endl;
cout<<'\t'<<"显示链表中的所有的数据:t "<<'\t'<<endl;
cout<<'\t'<<"清空链表中的数据: c"<<'\t'<<endl;
cout<<'\t'<<"删除指定位置的数据: e 位置"<<'\t'<<endl;
cout<<'\t'<<"删除链表中等于指定数据的数据: r 位置"<<'\t'<<endl;
cout<<'\t'<<"结束程序请按 q"<<'\t'<<endl;
cout<<'\t'<<"把链表中的数据保存到指定文件中:s 文件名"<<'\t'<<endl;
cout<<'\t'<<"对链表中的数据进行排序(1:升序 0:降序):o 1或0 "<<'\t'<<endl;
cout<<'\t'<<"把指定文件中的数据全部追加到链表末尾"<<'\t'<<endl;
}
main函数:用switch()根据用户的命令执行链表操作
int main(int argc,char* argv[])
{
char ch;
List l;
try{
while(1)
{
menu();
cin>>ch;
switch(ch)
{
case 'i':{int num,pos;cin>>pos;cin>>num; l.insert(num,pos); break;}
case 'f':{int num;cin>>num;l.push_front(num);break;}
case 'b':{int num;cin>>num;l.push_back(num);break;}
case 't':{l.travel();break;}
case 'c':{l.clear();break;}
case 'q':throw 1;
case 'e':{int pos;cin>>pos;l.dele1(pos);break;}
case 'r':{int data;cin>>data;l.dele2(data);break;}
case 's':{char str[100];cin>>str;l.Save(str);break;}
case 'o':{bool f;cin>>f;l.Sort(f);break;}
default: break;}
}
}
catch(...){cout<<"程序结束"<<endl;}
}