C++數據結構----完美鏈表

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


發佈了37 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章