定義一個鏈表節點結構體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;}
}