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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章