链表操作---面向过程--到---面型对象---到模板类

设计一个链表操作,从分设计到实现分别从3个step进行

(1)面向过程的程序设计---结构体+函数

/*
链表操作-----step1-----用结构体实现链表操作

链表设计----需求分析
1。创建
2。插入
3。遍历
4。获取长度
5。链接两个链表
6。可以实现插入多个类型的目的---未实现,用类封装后用模板实现
7。根据index来获取数据
8。增加一个排序的功能
9。将以上功能用类进行封装------未实现
*/
#include <iostream>
using namespace std;

struct Node   //链表节点声明
{
public:
	int date;
	Node * next;
};

Node * creat_List()  //创建链表,返回该链表的头指针
{
	Node * head=NULL;  //链表头节点
	Node * p=NULL; 
	int  count; //要创建的链表节点个数
	cout<<"please input the size of the list :";
	cin>>count;	
	while(count<0)
	{  
		cout<<"Warning: the size of list is not smaller than 0,please input again:";
		cin>>count;
	}
	cout<<"the size of list is "<<count<<endl;
	if(count==0)
		return head;  
	while(count--)
	{
		cout<<"the value is ";
		Node * s=new Node;
		cin>>s->date;
		s->next=NULL;
		if(head==NULL) //如果是第一个节点
		{ head=s;
		p=s; //p指向当前链表中的最后一个节点
		}
		else  //如果不是第一个节点
		{
			p->next=s;
			p=s; //p指向当前链表中的最后一个节点
		}
	}
	cout<<"create a list successful!"<<endl<<endl;
	return head;
}

int getvalue_List(Node * head,int index) //根据index值获取节点数据
{
    
	if(index==0)
		return head->date;
	int i=0;
	Node * p=head;
	for(i=0;i<index;i++)
		p=p->next;
	return p->date;	   
}

void print_List(Node * head)  //遍历链表
{
	Node * p=head;
	if(head==NULL)  //判断是否为空链表
	{ cout<<"the list is empty!"<<endl;
	return ;  
	}
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ cout<<p->date<<" "; 
	p=p->next;
	}
	cout<<p->date;
	cout<<endl;
	cout<<"print list finished!"<<endl<<endl;
}

int length_List(Node * head)  //获取链表长度(链表中节点数)
{
    if(head==NULL)
		return 0;
	int length=0;
	Node * p=head;
	while(p->next!=NULL)
	{length++;
	p=p->next;
	}
	return length+1;
}

Node * insert_List(Node * head) //插入多个节点
{
	int count=0; //记录总共插入的节点个数
	char flag='y';
	cout<<"do you want to insert a new node? (input \'y\' to insert,inputt \'n\' to exit )"<<endl;
	cin>>flag;
	Node * s=NULL; //指向要插入的节点
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	while(flag=='y')
	{
		s=new Node;
		cout<<"the value is ";
		cin>>s->date;
		s->next=NULL;
		p=head;
		if(head==NULL)
			head=s;
		else
		{
			if (s->date<p->date) //要插入的节点比头节点数据还小
			{
				s->next=p;
				head=s;
			}
			else 
			{
				while(s->date>p->date&&p->next!=NULL)
				{ q=p;
				p=p->next;
				}
				if(p->next!=NULL)
				{
					s->next=p;
					q->next=s;
				}
				if(p->next==NULL)
				{
					if(s->date>p->date)
						p->next=s;
					else
					{
						s->next=p;
						q->next=s;
					}
				}
			}		
		}
		count++;
		cout<<"Insert a new node again? (input \'y\' to insert,input \'n\' to exit )"<<endl;
		cin>>flag;
	}
	cout<<"insert "<<count<<" nodes successful!"<<endl<<endl;
	return head;
}


Node * insert_Node(Node * head,Node * s) //插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
{
	//Node * s=NULL; 
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	
	s->next=NULL;
	p=head;
	if(head==NULL)
		head=s;
	else
	{
		if (s->date<p->date) //要插入的节点比头节点数据还小
		{
			s->next=p;
			head=s;
		}
		else 
		{
			while(s->date>p->date&&p->next!=NULL)
			{ q=p;
			p=p->next;
			}
			if(p->next!=NULL)
			{
				s->next=p;
				q->next=s;
			}
			if(p->next==NULL)
			{
				if(s->date>p->date)
					p->next=s;
				else
				{
					s->next=p;
					q->next=s;
				}
			}
		}		
	}
	//cout<<"insert a node successful!"<<endl<<endl;	
	return head;
}

Node * link_Lists(Node * list1,Node * list2) //将list2链表链接到list1后面
{
	if(list1==NULL)
		return list2;
	if(list2==NULL)
		return list1;
	Node * p=list1;
	while(p->next!=NULL)
		p=p->next;
	p->next=list2;
	cout<<"the link of the two lists successful!"<<endl<<endl;
	return list1;
}


Node * delete_List(Node * head)   //删除链表
{   int count=0;
    if(head==NULL)
	{cout<<"the list is empty ,no node to delete!"<<endl;
	return head;
	}
    Node * p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		delete p;
		count++;
	}
	cout<<"delete "<<count<<" nodes"<<"from list successful!"<<endl<<endl;
	return head;
}

//排序思路
//将无序链表从第一个节点开始依次插入到一个开始为空的空链表上(插入函数要先找到要插入的位置)
Node * list_sort(Node * head)//链表排序
{     
	Node  * head_sort=NULL;
	if(head==NULL)
		return head;
	Node * p;
	//Node * q;
	while(head!=NULL)
	{   p=head;  //将p指向的节点从原链表中删除
	    head=head->next; //原链表头节点后移
	    p->next=NULL; //将p与原链表中的下一个节点断开
	    head_sort=insert_Node(head_sort,p);
	}
	cout<<"the sort of list successful!"<<endl<<endl;
	return head_sort;
}

int main()
{   //创建第一个链表,并对其进行相应操作
	cout<<"create  the first list......: list1"<<endl;
    Node * head1=NULL;  //链表头节点	
	head1=creat_List();  //创建链表
	
    print_List(head1); //遍历链表
	
	cout<<"the length of the list1 is "<<length_List(head1)<<endl<<endl; //链表长度
	
	head1=insert_List(head1); //向链表中插入多个节点
	
	print_List(head1); //遍历链表
	
	cout<<"the length of the list1 is "<<length_List(head1)<<endl<<endl; //链表长度   
	
	int index;
	int length=length_List(head1);
	
	if(head1!=NULL)
	{
		//cout<<"请输入要查找的链表list1的index值,注意index>=0 且 index<"<<length<<endl<<endl;
        cout<<"please input the index of list1(index>=0  index<"<<length<<"):";
		cin>>index;
		while(index<0||index>=length)  //判断index是否合理
		{
			cout<<"the index is not right,please input the index again :";
			cin>>index;
		}
		cout<<"the index="<<index<<" node value="<<getvalue_List(head1,index)<<endl<<endl;
	}
	else
	{ 
		cout<<"the list is empty,the index operation not work!"<<endl;
	}
	
	//增加一个新节点
	Node * p=new Node;
	cout<<"please input the data of the new insert node:";
	cin>>p->date;
	p->next=NULL;
	head1=insert_Node(head1,p);
    print_List(head1); //遍历链表
	cout<<"the length of the list1 is "<<length_List(head1)<<endl<<endl; //链表长度
	
    //对链表进行排序
	head1=list_sort(head1);
	print_List(head1); //遍历链表
	cout<<"the length of the list1 is "<<length_List(head1)<<endl<<endl; //链表长度
	
    
	
	
	//创建第二个链表,并对其进行相应操作
	cout<<"create  the second list......: list2"<<endl;
	Node * head2=NULL;  //链表头节点	
	head2=creat_List();  //创建链表
    print_List(head2); //遍历链表
	cout<<"the length of the list2 is "<<length_List(head2)<<endl<<endl; //链表长度
	head2=insert_List(head2);
	print_List(head2); //遍历链表
    cout<<"the length of the list2 is "<<length_List(head2)<<endl<<endl; //链表长度
    
	
	cout<<endl<<endl;
	cout<<"create  the third list......: list3"<<endl;
    //创建第三个链表,完成对list1和list2的链接
    Node * head3=NULL;  //链表头节点
    head3=link_Lists(head1,head2);
	print_List(head3); //遍历链表
    cout<<"the length of the list3 is "<<length_List(head3)<<endl<<endl; //链表长度

    head3=list_sort(head3);
	print_List(head3); //遍历链表
    cout<<"the length of the list3 is "<<length_List(head3)<<endl<<endl; //链表长度
	
	
  	//删除链表3
	head3=delete_List(head3);  //只需要删除链表3,因为链表3将链表1和链表2链接
	
	return 0;
}


(2)面向对象分析设计-----用类进行封装

/*
链表操作----step2----用类对链表进行封装

链表设计----需求分析
1。创建
2。插入
3。遍历
4。获取长度
5。链接两个链表
6。可以实现插入多个类型的目的---未实现,用类封装后用模板实现
7。根据index来获取数据
8。增加一个排序的功能
9。将以上功能用类进行封装
*/
#include <iostream>
using namespace std;

struct Node   //链表节点声明
{
	int date;
	Node * next;
};

class MyList
{ public:
      Node * head; //链表头指针
	  int size;    //链表大小,链表中节点个数
	  MyList() //构造函数
	  {
          head=NULL;
		  size=0;
	  }
      void creat_List();  //创建链表,返回该链表的头指针
	  Node * get_head();  //返回链表头指针	 
	  int get_size();  //返回链表大小	 
      void print_List();  //遍历链表
	  int length_List();  //获取链表长度(链表中节点数)
	  int getvalue_List(int index); //根据index值获取节点数据
      void insert_List();//插入多个节点     
	  void insert_Node(Node * s);//插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
	  void list_sort();//链表排序
	  void delete_List();   //删除链表											 
	  void link_Lists(MyList); //将list链表链接到当前链表后	  
	  void link_copy(MyList); //链表拷贝(深拷贝)
};

void MyList::creat_List()  //创建链表
{
	head=NULL;  //链表头节点
	Node * p=NULL; 
	int  count; //要创建的链表节点个数
	cout<<"please input the size of the list :";
	cin>>count;	
	while(count<0)
	{  
		cout<<"Warning: the size of list is not smaller than 0,please input again:";
		cin>>count;
	}
	cout<<"the size of list is "<<count<<endl;
	size=count;
	if(count==0)
		return ;  
	while(count--)
	{
		cout<<"the value is ";
		Node * s=new Node;
		cin>>s->date;
		s->next=NULL;
		if(head==NULL) //如果是第一个节点
		{ head=s;
		p=s; //p指向当前链表中的最后一个节点
		}
		else  //如果不是第一个节点
		{
			p->next=s;
			p=s; //p指向当前链表中的最后一个节点
		}
	}
	cout<<"create a list successful!"<<endl<<endl;
}


Node * MyList::get_head()  //返回链表头指针
{
	return head;
}

int MyList::get_size()   //返回链表大小
{
	return size;
}


void MyList::print_List( )  //遍历链表
{
	Node * p=head;
	if(head==NULL)  //判断是否为空链表
	{ cout<<"the list is empty!"<<endl;
	return ;  
	}
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ cout<<p->date<<" "; 
	p=p->next;
	}
	cout<<p->date;
	cout<<endl;
	cout<<"print list finished!"<<endl<<endl;
}

int MyList::length_List( )  //获取链表长度(链表中节点数)
{
    if(head==NULL)
		return 0;
	int length=0;
	Node * p=head;
	while(p->next!=NULL)
	{length++;
	p=p->next;
	}
	return length+1;
	/*
	return size;
	*/
}



int MyList::getvalue_List(int index) //根据index值获取节点数据
{
    
	if(index==0)
		return head->date;
	int i=0;
	Node * p=head;
	for(i=0;i<index;i++)
		p=p->next;
	return p->date;	   
}


void MyList::insert_List() //插入多个节点
{
	int count=0; //记录总共插入的节点个数
	char flag='y';
	cout<<"do you want to insert a new node? (input \'y\' to insert,input \'n\' to exit )"<<endl;
	cin>>flag;
	Node * s=NULL; //指向要插入的节点
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	while(flag=='y')
	{
		s=new Node;
		cout<<"the value is ";
		cin>>s->date;
		s->next=NULL;
		p=head;
		if(head==NULL)
			head=s;
		else
		{
			if (s->date<p->date) //要插入的节点比头节点数据还小
			{
				s->next=p;
				head=s;
			}
			else 
			{
				while(s->date>p->date&&p->next!=NULL)
				{ q=p;
				p=p->next;
				}
				if(p->next!=NULL)
				{
					s->next=p;
					q->next=s;
				}
				if(p->next==NULL)
				{
					if(s->date>p->date)
						p->next=s;
					else
					{
						s->next=p;
						q->next=s;
					}
				}
			}
		}
		count++;
		cout<<"Insert a new node again? (input \'y\' to insert,input \'n\' to exit )"<<endl;
		cin>>flag;
	}
	size=size+count;
	cout<<"insert "<<count<<" nodes successful!"<<endl<<endl;
}


void  MyList::insert_Node(Node * s) //插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
{
	
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	
	s->next=NULL;
	p=head;
	if(head==NULL)
		head=s;
	else
	{
		if (s->date<p->date) //要插入的节点比头节点数据还小
		{
			s->next=p;
			head=s;
		}
		else 
		{
			while(s->date>p->date&&p->next!=NULL)
			{ q=p;
			p=p->next;
			}
			if(p->next!=NULL)
			{
				s->next=p;
				q->next=s;
			}
			if(p->next==NULL)
			{
				if(s->date>p->date)
					p->next=s;
				else
				{
					s->next=p;
					q->next=s;
				}
			}
		}		
	}
	size++;
}

//排序思路
//将无序链表从第一个节点开始依次插入到一个开始为空的空链表上(插入函数要先找到要插入的位置)
void MyList::list_sort()//链表排序
{     
	MyList mylist_sort; //定义一个临时MyList变量 mylist_sort,mylist_sort.head=NULL
	if(head==NULL)
		return ;
	Node * p;
	while(head!=NULL)
	{   p=head;  //将p指向的节点从原链表中删除
	    head=head->next; //原链表头节点后移
	    p->next=NULL; //将p与原链表中的下一个节点断开
	    mylist_sort.insert_Node(p); //将从原链表脱离的头节点插入到 mylist_sort对象的链表中
	}
	cout<<"the sort of list successful!"<<endl;
	head=mylist_sort.get_head();
}

void MyList::delete_List()   //删除链表
{   
	int count=0;  //count用来记录要链表上删除的节点个数
	if(head==NULL)
	{
		cout<<"the list is empty ,no node to delete!"<<endl;
		return ;
	}
	Node * p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		delete p;
		count++;
	}
	cout<<"delete "<<count<<" nodes"<<" from list successful!"<<endl<<endl;
	size-=count;
}


void MyList::link_Lists(MyList list_after) //将list_after链表链接到当前链表后
{
	if(head==NULL)
	{   this->link_copy(list_after);
		return ;
	}
	if(list_after.get_head()==NULL)
		return ;
	Node * p=head;
	while(p->next!=NULL)
		p=p->next;
	Node *q,*s;
	q=list_after.get_head();//q首先指向被链接的链表的头节点
    int count=list_after.get_size();
	while(count--)
	{   s=new Node;
		s->date=q->date;
		s->next=NULL;
		p->next=s;
		p=s;
		q=q->next;	
	}		
	cout<<"the link of the two lists successful!"<<endl<<endl;	
	size+=list_after.length_List();
}


 void MyList::link_copy(MyList list_copyed)//链表拷贝(深拷贝)
 {
    if(list_copyed.get_head()==NULL)
	{
       head=NULL;
       size=0;
	}
	else
	{
        int count=list_copyed.get_size();
		size=count;
		head=NULL;
		Node * p,*q,*s;
		q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
		s=new Node;
		p=s;
		head=p;
		while(count--)
		{
		  s->date=q->date;
		  s->next=NULL;
		  if(head==NULL)
		  {
			  head=s;
		      p=s;			  
		  }
		  else
		  {
			  p->next=s;
			  p=s;
		  }
		  q=q->next;	
		  s=new Node;
		}		
	}
 }

int main()
{   //创建第一个链表,并对其进行相应操作
	cout<<"create  the first list......: list1"<<endl;
	MyList mylist1; //建立链表对象mylist1
	mylist1.creat_List();//创建链表
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度


	int index;
	int length=mylist1.length_List();
	if(mylist1.get_head()!=NULL)
	{
		cout<<"\nplease input the index of list1 (index>=0  index<"<<length<<"): ";
		cin>>index;
		while(index<0||index>=length)  //判断index是否合理
		{
			cout<<"the index is not right,please input the index again :";
			cin>>index;
		}
		cout<<"the index="<<index<<" node value="<<mylist1.getvalue_List(index)<<endl<<endl;
	}
	else
	{ 
		cout<<"the list is empty,the index operation not work!"<<endl;
	}
	
	mylist1.insert_List(); //向链表中插入多个节点
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度
	
	
	Node * p=new Node;//增加一个新节点
	cout<<"please input the data of the new  node insert to list1:";
	cin>>p->date;
	p->next=NULL;
	mylist1.insert_Node(p);
    mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度

  	//对链表进行排序
	cout<<"the result of after sorting list1"<<endl;
	mylist1.list_sort();	
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

		
	//创建第二个链表,并对其进行相应操作
	cout<<"create  the second list......: list2"<<endl;
	MyList mylist2; //建立链表对象mylist2
	mylist2.creat_List();//创建链表
	mylist2.print_List();//遍历链表
	cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度

	//将链表2链到链表1后
	cout<<"link list1 and list2..."<<endl;	
	mylist1.link_Lists(mylist2);
    mylist1.print_List();//遍历链表
	cout<<"after link the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"after link the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

	//创建第三个链表,由链表1深拷贝而来
	cout<<"create  the second list......: list3"<<endl;    
	MyList mylist3; //建立链表对象mylist3
	cout<<"list3 is copy from list1"<<endl;
	mylist3.link_copy(mylist1);
	mylist3.print_List();
    cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

    cout<<"delete the list1."<<endl;
	mylist1.delete_List(); //删除链表1
	//cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	//cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度


	cout<<"delete the list3."<<endl;
	mylist3.delete_List(); //删除链表3
	//cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	//cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

	cout<<"delete the list2."<<endl;
	mylist2.delete_List(); //删除链表2
	//cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	//cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度


	return 0;
}

(3)将具体类用模板类来实现,这样对node数据的类型可以进行指定

/*
链表操作----step3----用类对链表进行封装,再用类模板实现

链表设计----需求分析
1。创建
2。插入
3。遍历
4。获取长度
5。链接两个链表
6。可以实现插入多个类型的目的---用模板实现
7。根据index来获取数据
8。增加一个排序的功能
9。将以上功能用类进行封装
*/
#include <iostream>
using namespace std;

template<class T>
struct Node   //链表节点声明
{
	T date;
	Node<T> * next;
};

template<class T>
class MyList
{ public:
      Node<T> * head; //链表头指针
	  int size;    //链表大小,链表中节点个数
	  MyList() //构造函数
	  {
          head=NULL;
		  size=0;
	  }
      void creat_List();  //创建链表,返回该链表的头指针
	  Node<T> * get_head();  //返回链表头指针	 
	  int get_size();  //返回链表大小	 
      void print_List();  //遍历链表
	  int length_List();  //获取链表长度(链表中节点数)
	  T getvalue_List(int index); //根据index值获取节点数据
      void insert_List();//插入多个节点     
	  void insert_Node(Node<T> * s);//插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
	  void list_sort();//链表排序
	  void delete_List();   //删除链表											 
	  void link_Lists(MyList); //将list链表链接到当前链表后	  
	  void link_copy(MyList); //链表拷贝(深拷贝)
};

template<class T>
void MyList<T>::creat_List()  //创建链表
{
	head=NULL;  //链表头节点
	Node<T> * p=NULL; 
	int  count; //要创建的链表节点个数
	cout<<"please input the size of the list :";
	cin>>count;	
	while(count<0)
	{  
		cout<<"Warning: the size of list is not smaller than 0,please input again:";
		cin>>count;
	}
	cout<<"the size of list is "<<count<<endl;
	size=count;
	if(count==0)
		return ;  
	while(count--)
	{
		cout<<"the value is ";
		Node<T> * s=new Node<T>;
		cin>>s->date;
		s->next=NULL;
		if(head==NULL) //如果是第一个节点
		{ head=s;
		p=s; //p指向当前链表中的最后一个节点
		}
		else  //如果不是第一个节点
		{
			p->next=s;
			p=s; //p指向当前链表中的最后一个节点
		}
	}
	cout<<"create a list successful!"<<endl<<endl;
}

template<class T>
Node<T> * MyList<T>::get_head()  //返回链表头指针
{
	return head;
}

template<class T>
int MyList<T>::get_size()   //返回链表大小
{
	return size;
}

template<class T>
void MyList<T>::print_List( )  //遍历链表
{
	Node<T> * p=head;
	if(head==NULL)  //判断是否为空链表
	{ cout<<"the list is empty!"<<endl;
	return ;  
	}
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ cout<<p->date<<" "; 
	p=p->next;
	}
	cout<<p->date;
	cout<<endl;
	cout<<"print list finished!"<<endl<<endl;
}

template<class T>
int MyList<T>::length_List( )  //获取链表长度(链表中节点数)
{
    if(head==NULL)
		return 0;
	int length=0;
	Node<T> * p=head;
	while(p->next!=NULL)
	{length++;
	p=p->next;
	}
	return length+1;
	/*
	return size;
	*/
}


template<class T>
T MyList<T>::getvalue_List(int index) //根据index值获取节点数据
{
    
	if(index==0)
		return head->date;
	int i=0;
	Node<T> * p=head;
	for(i=0;i<index;i++)
		p=p->next;
	return p->date;	   
}

template<class T>
void MyList<T>::insert_List() //插入多个节点
{
	int count=0; //记录总共插入的节点个数
	char flag='y';
	cout<<"do you want to insert a new node? (input \'y\' to insert,input \'n\' to exit )"<<endl;
	cin>>flag;
	Node<T> * s=NULL; //指向要插入的节点
	Node<T> * p=NULL; //指向要插入的节点位置
	Node<T> * q=NULL; //指向要插入的节点位置的前一个位置
	while(flag=='y')
	{
		s=new Node<T>;
		cout<<"the value is ";
		cin>>s->date;
		s->next=NULL;
		p=head;
		if(head==NULL)
			head=s;
		else
		{
			if (s->date<p->date) //要插入的节点比头节点数据还小
			{
				s->next=p;
				head=s;
			}
			else 
			{
				while(s->date>p->date&&p->next!=NULL)
				{ q=p;
				p=p->next;
				}
				if(p->next!=NULL)
				{
					s->next=p;
					q->next=s;
				}
				if(p->next==NULL)
				{
					if(s->date>p->date)
						p->next=s;
					else
					{
						s->next=p;
						q->next=s;
					}
				}
			}
		}
		count++;
		cout<<"Insert a new node again? (input \'y\' to insert,input \'n\' to exit )"<<endl;
		cin>>flag;
	}
	size=size+count;
	cout<<"insert "<<count<<" nodes successful!"<<endl<<endl;
}

template<class T>
void  MyList<T>::insert_Node(Node<T> * s) //插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
{
	
	Node<T> * p=NULL; //指向要插入的节点位置
	Node<T> * q=NULL; //指向要插入的节点位置的前一个位置
	
	s->next=NULL;
	p=head;
	if(head==NULL)
		head=s;
	else
	{
		if (s->date<p->date) //要插入的节点比头节点数据还小
		{
			s->next=p;
			head=s;
		}
		else 
		{
			while(s->date>p->date&&p->next!=NULL)
			{ q=p;
			p=p->next;
			}
			if(p->next!=NULL)
			{
				s->next=p;
				q->next=s;
			}
			if(p->next==NULL)
			{
				if(s->date>p->date)
					p->next=s;
				else
				{
					s->next=p;
					q->next=s;
				}
			}
		}		
	}
	size++;
}

//排序思路
//将无序链表从第一个节点开始依次插入到一个开始为空的空链表上(插入函数要先找到要插入的位置)
template<class T>
void MyList<T>::list_sort()//链表排序
{     
	MyList<T> mylist_sort; //定义一个临时MyList变量 mylist_sort,mylist_sort.head=NULL
	if(head==NULL)
		return ;
	Node<T> * p;
	while(head!=NULL)
	{   p=head;  //将p指向的节点从原链表中删除
	    head=head->next; //原链表头节点后移
	    p->next=NULL; //将p与原链表中的下一个节点断开
	    mylist_sort.insert_Node(p); //将从原链表脱离的头节点插入到 mylist_sort对象的链表中
	}
	cout<<"the sort of list successful!"<<endl;
	head=mylist_sort.get_head();
}

template<class T>
void MyList<T>::delete_List()   //删除链表
{   
	int count=0;  //count用来记录要链表上删除的节点个数
	if(head==NULL)
	{
		cout<<"the list is empty ,no node to delete!"<<endl;
		return ;
	}
	Node<T> * p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		delete p;
		count++;
	}
	cout<<"delete "<<count<<" nodes"<<" from list successful!"<<endl<<endl;
	size-=count;
}

template<class T>
void MyList<T>::link_Lists(MyList list_after) //将list_after链表链接到当前链表后
{
	if(head==NULL)
	{   this->link_copy(list_after);
		return ;
	}
	if(list_after.get_head()==NULL)
		return ;
	Node<T> * p=head;
	while(p->next!=NULL)
		p=p->next;
	Node<T> *q,*s;
	q=list_after.get_head();//q首先指向被链接的链表的头节点
    int count=list_after.get_size();
	while(count--)
	{   s=new Node<T>;
		s->date=q->date;
		s->next=NULL;
		p->next=s;
		p=s;
		q=q->next;	
	}		
	cout<<"the link of the two lists successful!"<<endl<<endl;	
	size+=list_after.length_List();
}


template<class T>
 void MyList<T>::link_copy(MyList list_copyed)//链表拷贝(深拷贝)
 {
    if(list_copyed.get_head()==NULL)
	{
       head=NULL;
       size=0;
	}
	else
	{
        int count=list_copyed.get_size();
		size=count;
		head=NULL;
		Node<T> * p,*q,*s;
		q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
		s=new Node<T>;
		p=s;
		head=p;
		while(count--)
		{
		  s->date=q->date;
		  s->next=NULL;
		  if(head==NULL)
		  {
			  head=s;
		      p=s;			  
		  }
		  else
		  {
			  p->next=s;
			  p=s;
		  }
		  q=q->next;	
		  s=new Node<T>;
		}		
	}
 }

int main()
{   //创建第一个链表,并对其进行相应操作
	cout<<"create  the first list......: list1"<<endl;
	MyList<char> mylist1; //建立链表对象mylist1
	mylist1.creat_List();//创建链表
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度


	int index;
	int length=mylist1.length_List();
	if(mylist1.get_head()!=NULL)
	{
		cout<<"\nplease input the index of list1 (index>=0  index<"<<length<<"): ";
		cin>>index;
		while(index<0||index>=length)  //判断index是否合理
		{
			cout<<"the index is not right,please input the index again :";
			cin>>index;
		}
		cout<<"the index="<<index<<" node value="<<mylist1.getvalue_List(index)<<endl<<endl;
	}
	else
	{ 
		cout<<"the list is empty,the index operation not work!"<<endl;
	}
	
	mylist1.insert_List(); //向链表中插入多个节点
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度
	
	
	Node<char> * p=new Node<char>;//增加一个新节点
	cout<<"please input the data of the new  node insert to list1:";
	cin>>p->date;
	p->next=NULL;
	mylist1.insert_Node(p);
    mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度

  	//对链表进行排序
	cout<<"the result of after sorting list1"<<endl;
	mylist1.list_sort();	
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

		
	//创建第二个链表,并对其进行相应操作
	cout<<"create  the second list......: list2"<<endl;
	MyList<char> mylist2; //建立链表对象mylist2
	mylist2.creat_List();//创建链表
	mylist2.print_List();//遍历链表
	cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度

	//将链表2链到链表1后
	cout<<"link list1 and list2..."<<endl;	
	mylist1.link_Lists(mylist2);
    mylist1.print_List();//遍历链表
	cout<<"after link the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"after link the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

	//创建第三个链表,由链表1深拷贝而来
	cout<<"create  the third list......: list3"<<endl;    
	MyList<char> mylist3; //建立链表对象mylist3
	cout<<"list3 is copy from list1"<<endl;
	mylist3.link_copy(mylist1);
	mylist3.print_List();
    cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

    cout<<"delete the list1."<<endl;
	mylist1.delete_List(); //删除链表1
	//cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	//cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度


	cout<<"delete the list3."<<endl;
	mylist3.delete_List(); //删除链表3
	//cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	//cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

	cout<<"delete the list2."<<endl;
	mylist2.delete_List(); //删除链表2
	//cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	//cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度


	return 0;
}


注意:在step2时,我对链表的链接进行了改进,还添加了一个对象拷贝的功能。

(4)

/*
链表操作----step2-2----用类对链表进行封装
在链表操作----step2 的基础上增加运算符重载的相关操作
在step2的基础上
(1)增加了一个拷贝构造函数
(2)增加了<<输出运算符重载函数
(2)增加了+运算符重载函数


链表设计----需求分析
1。创建
2。插入
3。遍历
4。获取长度
5。链接两个链表
6。可以实现插入多个类型的目的---未实现,用类封装后用模板实现
7。根据index来获取数据
8。增加一个排序的功能
9。将以上功能用类进行封装
*/
#include <iostream>
using namespace std;

struct Node   //链表节点声明
{
	int date;
	Node * next;
};

class MyList
{ public:
      Node * head; //链表头指针
	  int size;    //链表大小,链表中节点个数
	  MyList(); //构造函数
	  MyList(MyList & ); //拷贝构造函数
	  void creat_List();  //创建链表,返回该链表的头指针
	  Node * get_head();  //返回链表头指针	 
	  int get_size();  //返回链表大小	 
      void print_List();  //遍历链表
	  int length_List();  //获取链表长度(链表中节点数)
	  int getvalue_List(int index); //根据index值获取节点数据
      void insert_List();//插入多个节点     
	  void insert_Node(Node * s);//插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
	  void list_sort();//链表排序
	  void delete_List();   //删除链表											 
	  void link_Lists(MyList); //将list链表链接到当前链表后	  
	  void link_copy(MyList); //链表拷贝(深拷贝)

	  //运算符重载函数声明
	  MyList   operator+(MyList mylist);  //成员函数
	  friend ostream & operator<<(ostream & out, MyList & mylist);  //对输出运算符进行重载,友元函数
};

MyList::MyList() //构造函数
{
	head=NULL;
    size=0;
}

MyList::MyList(MyList & list_copyed) //拷贝构造函数,使用深拷贝来拷贝资源,链表上的节点
{  
    if(list_copyed.get_head()==NULL)
   {
       head=NULL;
       size=0;
   }
   else
   {
	   int count=list_copyed.get_size();
	   size=count;
	   head=NULL;
	   Node * p,*q,*s;
	   q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
	   s=new Node;
	   p=s;
	   head=p;
	   while(count--)
	   {
		   s->date=q->date;
		   s->next=NULL;
		   if(head==NULL)
		   {
			   head=s;
			   p=s;			  
		   }
		   else
		   {
			   p->next=s;
			   p=s;
		   }
		   q=q->next;	
		   s=new Node;
	   }		
	} 

}

void MyList::creat_List()  //创建链表
{
	head=NULL;  //链表头节点
	Node * p=NULL; 
	int  count; //要创建的链表节点个数
	cout<<"please input the size of the list :";
	cin>>count;	
	while(count<0)
	{  
		cout<<"Warning: the size of list is not smaller than 0,please input again:";
		cin>>count;
	}
	cout<<"the size of list is "<<count<<endl;
	size=count;
	if(count==0)
		return ;  
	while(count--)
	{
		cout<<"the value is ";
		Node * s=new Node;
		cin>>s->date;
		s->next=NULL;
		if(head==NULL) //如果是第一个节点
		{ head=s;
		p=s; //p指向当前链表中的最后一个节点
		}
		else  //如果不是第一个节点
		{
			p->next=s;
			p=s; //p指向当前链表中的最后一个节点
		}
	}
	cout<<"create a list successful!"<<endl<<endl;
}


Node * MyList::get_head()  //返回链表头指针
{
	return head;
}

int MyList::get_size()   //返回链表大小
{
	return size;
}


void MyList::print_List( )  //遍历链表
{
	Node * p=head;
	if(head==NULL)  //判断是否为空链表
	{ cout<<"the list is empty!"<<endl;
	return ;  
	}
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ cout<<p->date<<" "; 
	p=p->next;
	}
	cout<<p->date;
	cout<<endl;
	cout<<"print list finished!"<<endl<<endl;
}

int MyList::length_List( )  //获取链表长度(链表中节点数)
{
    if(head==NULL)
		return 0;
	int length=0;
	Node * p=head;
	while(p->next!=NULL)
	{length++;
	p=p->next;
	}
	return length+1;
	/*
	return size;
	*/
}



int MyList::getvalue_List(int index) //根据index值获取节点数据
{
    
	if(index==0)
		return head->date;
	int i=0;
	Node * p=head;
	for(i=0;i<index;i++)
		p=p->next;
	return p->date;	   
}


void MyList::insert_List() //插入多个节点
{
	int count=0; //记录总共插入的节点个数
	char flag='y';
	cout<<"do you want to insert a new node? (input \'y\' to insert,input \'n\' to exit )"<<endl;
	cin>>flag;
	Node * s=NULL; //指向要插入的节点
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	while(flag=='y')
	{
		s=new Node;
		cout<<"the value is ";
		cin>>s->date;
		s->next=NULL;
		p=head;
		if(head==NULL)
			head=s;
		else
		{
			if (s->date<p->date) //要插入的节点比头节点数据还小
			{
				s->next=p;
				head=s;
			}
			else 
			{
				while(s->date>p->date&&p->next!=NULL)
				{ q=p;
				p=p->next;
				}
				if(p->next!=NULL)
				{
					s->next=p;
					q->next=s;
				}
				if(p->next==NULL)
				{
					if(s->date>p->date)
						p->next=s;
					else
					{
						s->next=p;
						q->next=s;
					}
				}
			}
		}
		count++;
		cout<<"Insert a new node again? (input \'y\' to insert,input \'n\' to exit )"<<endl;
		cin>>flag;
	}
	size=size+count;
	cout<<"insert "<<count<<" nodes successful!"<<endl<<endl;
}


void  MyList::insert_Node(Node * s) //插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
{
	
	Node * p=NULL; //指向要插入的节点位置
	Node * q=NULL; //指向要插入的节点位置的前一个位置
	
	s->next=NULL;
	p=head;
	if(head==NULL)
		head=s;
	else
	{
		if (s->date<p->date) //要插入的节点比头节点数据还小
		{
			s->next=p;
			head=s;
		}
		else 
		{
			while(s->date>p->date&&p->next!=NULL)
			{ q=p;
			p=p->next;
			}
			if(p->next!=NULL)
			{
				s->next=p;
				q->next=s;
			}
			if(p->next==NULL)
			{
				if(s->date>p->date)
					p->next=s;
				else
				{
					s->next=p;
					q->next=s;
				}
			}
		}		
	}
	size++;
}

//排序思路
//将无序链表从第一个节点开始依次插入到一个开始为空的空链表上(插入函数要先找到要插入的位置)
void MyList::list_sort()//链表排序
{     
	MyList mylist_sort; //定义一个临时MyList变量 mylist_sort,mylist_sort.head=NULL
	if(head==NULL)
		return ;
	Node * p;
	while(head!=NULL)
	{   p=head;  //将p指向的节点从原链表中删除
	    head=head->next; //原链表头节点后移
	    p->next=NULL; //将p与原链表中的下一个节点断开
	    mylist_sort.insert_Node(p); //将从原链表脱离的头节点插入到 mylist_sort对象的链表中
	}
	cout<<"the sort of list successful!"<<endl;
	head=mylist_sort.get_head();
}

void MyList::delete_List()   //删除链表
{   
	int count=0;  //count用来记录要链表上删除的节点个数
	if(head==NULL)
	{
		cout<<"the list is empty ,no node to delete!"<<endl;
		return ;
	}
	Node * p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		delete p;
		count++;
	}
	cout<<"delete "<<count<<" nodes"<<" from list successful!"<<endl<<endl;
	size-=count;
}


void MyList::link_Lists(MyList list_after) //将list_after链表链接到当前链表后
{
	if(head==NULL)
	{   this->link_copy(list_after);
		return ;
	}
	if(list_after.get_head()==NULL)
		return ;
	Node * p=head;
	while(p->next!=NULL)
		p=p->next;
	Node *q,*s;
	q=list_after.get_head();//q首先指向被链接的链表的头节点
    int count=list_after.get_size();
	while(count--)
	{   s=new Node;
		s->date=q->date;
		s->next=NULL;
		p->next=s;
		p=s;
		q=q->next;	
	}		
	cout<<"the link of the two lists successful!"<<endl<<endl;	
	size+=list_after.length_List();
}


 void MyList::link_copy(MyList list_copyed)//链表拷贝(深拷贝)
 {
    if(list_copyed.get_head()==NULL)
	{
       head=NULL;
       size=0;
	}
	else
	{
        int count=list_copyed.get_size();
		size=count;
		head=NULL;
		Node * p,*q,*s;
		q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
		s=new Node;
		p=s;
		head=p;
		while(count--)
		{
		  s->date=q->date;
		  s->next=NULL;
		  if(head==NULL)
		  {
			  head=s;
		      p=s;			  
		  }
		  else
		  {
			  p->next=s;
			  p=s;
		  }
		  q=q->next;	
		  s=new Node;
		}		
	}
 }

//运算符重载函数定义

 MyList   MyList::operator+(MyList list_after)  //+运算符重载函数作为MyList的成员函数
 {
	 MyList  result;

	 if(this->head==NULL)
	 {   result.link_copy(list_after);
	     result.size=list_after.get_size();			 
	     return result;
	 }

	 if(list_after.get_head()==NULL)
	 { 
		 result.link_copy(*this);
		 result.size=this->size;
		 return result;
	 }

      Node * p=NULL;
	  Node * s=NULL;
	  Node * q=NULL;


      q=this->get_head();//q首先指向+的左操作数
	  int count=this->get_size(); //count获取左操作数的链表节点个数
	  while(count--)   
	  {   
		 s=new Node;
		 s->date=q->date;
		 s->next=NULL;
		 if(result.get_head()==NULL)
		 {
		    result.head=s;
			p=s;
			q=q->next;
		 }
		 else
		 {
			 p->next=s;
			 p=s;
			 q=q->next;	
		 }
		
	 }		
	 q=list_after.get_head();//q首先指向+的右操作数
	 count=list_after.get_size(); //count获取右操作数的链表节点个数
	 while(count--)
	 {   
		  s=new Node;
	      s->date=q->date;
	      s->next=NULL;
	      p->next=s;
	      p=s;
	      q=q->next;	
	 }		
	
	result.size=this->length_List()+list_after.length_List();
	return result;
 }


ostream & operator<<(ostream & out, MyList & mylist)  //<<运算符重载函数作为MyList的友元函数
{
  
   Node * head=mylist.get_head();
   Node * p=head;
   if(head==NULL)  //判断是否为空链表
   { out<<"the list is empty!"<<endl;
     return  out;  
   } 
   out<<"the list is :";
   while(p->next!=NULL)  //遍历链表,输出各个节点数据
   { out<<p->date<<" "; 
     p=p->next;
   }
   out<<p->date;
   out<<endl;
   return out;
}  

int main()
{   //创建第一个链表,并对其进行相应操作
	cout<<"create  the first list......: list1"<<endl;
	MyList mylist1; //建立链表对象mylist1
	mylist1.creat_List();//创建链表
	mylist1.print_List();//遍历链表

    cout<<mylist1; //使用输出运算符重载来对MyList对象的链表节点数据进行输出
   
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度
    /*
    
	int index;
	int length=mylist1.length_List();
	if(mylist1.get_head()!=NULL)
	{
		cout<<"\nplease input the index of list1 (index>=0  index<"<<length<<"): ";
		cin>>index;
		while(index<0||index>=length)  //判断index是否合理
		{
			cout<<"the index is not right,please input the index again :";
			cin>>index;
		}
		cout<<"the index="<<index<<" node value="<<mylist1.getvalue_List(index)<<endl<<endl;
	}
	else
	{ 
		cout<<"the list is empty,the index operation not work!"<<endl;
	}
	
	mylist1.insert_List(); //向链表中插入多个节点
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度
	
	
	Node * p=new Node;//增加一个新节点
	cout<<"please input the data of the new  node insert to list1:";
	cin>>p->date;
	p->next=NULL;
	mylist1.insert_Node(p);
    mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度

  	//对链表进行排序
	cout<<"the result of after sorting list1"<<endl;
	mylist1.list_sort();	
	mylist1.print_List();//遍历链表
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度
    */
		
	//创建第二个链表,并对其进行相应操作
	cout<<"create  the second list......: list2"<<endl;
	MyList mylist2; //建立链表对象mylist2
	mylist2.creat_List();//创建链表
	mylist2.print_List();//遍历链表

	cout<<mylist2;//使用输出运算符重载来对MyList对象的链表节点数据进行输出

	cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度

    MyList mylist5=mylist1; //调用拷贝构造函数
	cout<<"list5=list1    "<<mylist5;
	
	mylist5=mylist1+mylist2; //使用运算符重载函数
	cout<<"list5=list1 + list2  "<<mylist5;
		
    /*

	//将链表2链到链表1后
	cout<<"link list1 and list2..."<<endl;	
	mylist1.link_Lists(mylist2);
    mylist1.print_List();//遍历链表
	cout<<"after link the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"after link the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

	//创建第三个链表,由链表1深拷贝而来
	cout<<"create  the second list......: list3"<<endl;    
	MyList mylist3; //建立链表对象mylist3
	cout<<"list3 is copy from list1"<<endl;
	mylist3.link_copy(mylist1);
	mylist3.print_List();
    cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

    cout<<"delete the list1."<<endl;
	mylist1.delete_List(); //删除链表1
	//cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	//cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度


	cout<<"delete the list3."<<endl;
	mylist3.delete_List(); //删除链表3
	//cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	//cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

	cout<<"delete the list2."<<endl;
	mylist2.delete_List(); //删除链表2
	//cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	//cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度
    */

	return 0;
}


(5)

/*
链表操作----step3----用类对链表进行封装,再用类模板实现
在链表操作----step3 的基础上增加运算符重载的相关操作
在step3的基础上
(1)增加了一个拷贝构造函数
(2)增加了<<输出运算符重载函数
(2)增加了+运算符重载函数


链表设计----需求分析
1。创建
2。插入
3。遍历
4。获取长度
5。链接两个链表
6。可以实现插入多个类型的目的---用模板实现
7。根据index来获取数据
8。增加一个排序的功能
9。将以上功能用类进行封装
*/
#include <iostream>
using namespace std;

template<class T>
struct Node   //链表节点声明
{
	T date;
	Node<T> * next;
};

template<class T>
class MyList
{ public:
      Node<T> * head; //链表头指针
	  int size;    //链表大小,链表中节点个数
	  MyList() //构造函数
	  {
          head=NULL;
		  size=0;
	  }
	  MyList(MyList & ); //拷贝构造函数
      void creat_List();  //创建链表,返回该链表的头指针
	  Node<T> * get_head();  //返回链表头指针	 
	  int get_size();  //返回链表大小	 
      void print_List();  //遍历链表
	  int length_List();  //获取链表长度(链表中节点数)
	  T getvalue_List(int index); //根据index值获取节点数据
      void insert_List();//插入多个节点     
	  void insert_Node(Node<T> * s);//插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
	  void list_sort();//链表排序
	  void delete_List();   //删除链表											 
	  void link_Lists(MyList); //将list链表链接到当前链表后	  
	  void link_copy(MyList); //链表拷贝(深拷贝)

	  //运算符重载函数声明
	  MyList   operator+(MyList mylist);  //成员函数
	  friend ostream & operator<<(ostream & out, MyList & mylist);  //对输出运算符进行重载,友元函数
};

template<class T>
MyList<T>::MyList(MyList<T> & list_copyed) //拷贝构造函数,使用深拷贝来拷贝资源,链表上的节点
{  
    if(list_copyed.get_head()==NULL)
	{
		head=NULL;
		size=0;
	}
	else
	{
		int count=list_copyed.get_size();
		size=count;
		head=NULL;
		Node<T> * p,*q,*s;
		q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
		s=new Node<T>;
		p=s;
		head=p;
		while(count--)
		{
			s->date=q->date;
			s->next=NULL;
			if(head==NULL)
			{
				head=s;
				p=s;			  
			}
			else
			{
				p->next=s;
				p=s;
			}
			q=q->next;	
			s=new Node<T>;
		}		
	} 
	
}


template<class T>
void MyList<T>::creat_List()  //创建链表
{
	head=NULL;  //链表头节点
	Node<T> * p=NULL; 
	int  count; //要创建的链表节点个数
	cout<<"please input the size of the list :";
	cin>>count;	
	while(count<0)
	{  
		cout<<"Warning: the size of list is not smaller than 0,please input again:";
		cin>>count;
	}
	cout<<"the size of list is "<<count<<endl;
	size=count;
	if(count==0)
		return ;  
	while(count--)
	{
		cout<<"the value is ";
		Node<T> * s=new Node<T>;
		cin>>s->date;
		s->next=NULL;
		if(head==NULL) //如果是第一个节点
		{ head=s;
		p=s; //p指向当前链表中的最后一个节点
		}
		else  //如果不是第一个节点
		{
			p->next=s;
			p=s; //p指向当前链表中的最后一个节点
		}
	}
	cout<<"create a list successful!"<<endl<<endl;
}

template<class T>
Node<T> * MyList<T>::get_head()  //返回链表头指针
{
	return head;
}

template<class T>
int MyList<T>::get_size()   //返回链表大小
{
	return size;
}

template<class T>
void MyList<T>::print_List( )  //遍历链表
{
	Node<T> * p=head;
	if(head==NULL)  //判断是否为空链表
	{ cout<<"the list is empty!"<<endl;
	return ;  
	}
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ cout<<p->date<<" "; 
	p=p->next;
	}
	cout<<p->date;
	cout<<endl;
	cout<<"print list finished!"<<endl<<endl;
}

template<class T>
int MyList<T>::length_List( )  //获取链表长度(链表中节点数)
{
    if(head==NULL)
		return 0;
	int length=0;
	Node<T> * p=head;
	while(p->next!=NULL)
	{length++;
	p=p->next;
	}
	return length+1;
	/*
	return size;
	*/
}


template<class T>
T MyList<T>::getvalue_List(int index) //根据index值获取节点数据
{
    
	if(index==0)
		return head->date;
	int i=0;
	Node<T> * p=head;
	for(i=0;i<index;i++)
		p=p->next;
	return p->date;	   
}

template<class T>
void MyList<T>::insert_List() //插入多个节点
{
	int count=0; //记录总共插入的节点个数
	char flag='y';
	cout<<"do you want to insert a new node? (input \'y\' to insert,input \'n\' to exit )"<<endl;
	cin>>flag;
	Node<T> * s=NULL; //指向要插入的节点
	Node<T> * p=NULL; //指向要插入的节点位置
	Node<T> * q=NULL; //指向要插入的节点位置的前一个位置
	while(flag=='y')
	{
		s=new Node<T>;
		cout<<"the value is ";
		cin>>s->date;
		s->next=NULL;
		p=head;
		if(head==NULL)
			head=s;
		else
		{
			if (s->date<p->date) //要插入的节点比头节点数据还小
			{
				s->next=p;
				head=s;
			}
			else 
			{
				while(s->date>p->date&&p->next!=NULL)
				{ q=p;
				p=p->next;
				}
				if(p->next!=NULL)
				{
					s->next=p;
					q->next=s;
				}
				if(p->next==NULL)
				{
					if(s->date>p->date)
						p->next=s;
					else
					{
						s->next=p;
						q->next=s;
					}
				}
			}
		}
		count++;
		cout<<"Insert a new node again? (input \'y\' to insert,input \'n\' to exit )"<<endl;
		cin>>flag;
	}
	size=size+count;
	cout<<"insert "<<count<<" nodes successful!"<<endl<<endl;
}

template<class T>
void  MyList<T>::insert_Node(Node<T> * s) //插入一个节点,s指向要插入的节点,找到比s数据大的节点前插入
{
	
	Node<T> * p=NULL; //指向要插入的节点位置
	Node<T> * q=NULL; //指向要插入的节点位置的前一个位置
	
	s->next=NULL;
	p=head;
	if(head==NULL)
		head=s;
	else
	{
		if (s->date<p->date) //要插入的节点比头节点数据还小
		{
			s->next=p;
			head=s;
		}
		else 
		{
			while(s->date>p->date&&p->next!=NULL)
			{ q=p;
			p=p->next;
			}
			if(p->next!=NULL)
			{
				s->next=p;
				q->next=s;
			}
			if(p->next==NULL)
			{
				if(s->date>p->date)
					p->next=s;
				else
				{
					s->next=p;
					q->next=s;
				}
			}
		}		
	}
	size++;
}

//排序思路
//将无序链表从第一个节点开始依次插入到一个开始为空的空链表上(插入函数要先找到要插入的位置)
template<class T>
void MyList<T>::list_sort()//链表排序
{     
	MyList<T> mylist_sort; //定义一个临时MyList变量 mylist_sort,mylist_sort.head=NULL
	if(head==NULL)
		return ;
	Node<T> * p;
	while(head!=NULL)
	{   p=head;  //将p指向的节点从原链表中删除
	    head=head->next; //原链表头节点后移
	    p->next=NULL; //将p与原链表中的下一个节点断开
	    mylist_sort.insert_Node(p); //将从原链表脱离的头节点插入到 mylist_sort对象的链表中
	}
	cout<<"the sort of list successful!"<<endl;
	head=mylist_sort.get_head();
}

template<class T>
void MyList<T>::delete_List()   //删除链表
{   
	int count=0;  //count用来记录要链表上删除的节点个数
	if(head==NULL)
	{
		cout<<"the list is empty ,no node to delete!"<<endl;
		return ;
	}
	Node<T> * p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		delete p;
		count++;
	}
	cout<<"delete "<<count<<" nodes"<<" from list successful!"<<endl<<endl;
	size-=count;
}

template<class T>
void MyList<T>::link_Lists(MyList list_after) //将list_after链表链接到当前链表后
{
	if(head==NULL)
	{   this->link_copy(list_after);
		return ;
	}
	if(list_after.get_head()==NULL)
		return ;
	Node<T> * p=head;
	while(p->next!=NULL)
		p=p->next;
	Node<T> *q,*s;
	q=list_after.get_head();//q首先指向被链接的链表的头节点
    int count=list_after.get_size();
	while(count--)
	{   s=new Node<T>;
		s->date=q->date;
		s->next=NULL;
		p->next=s;
		p=s;
		q=q->next;	
	}		
	cout<<"the link of the two lists successful!"<<endl<<endl;	
	size+=list_after.length_List();
}


template<class T>
 void MyList<T>::link_copy(MyList list_copyed)//链表拷贝(深拷贝)
 {
    if(list_copyed.get_head()==NULL)
	{
       head=NULL;
       size=0;
	}
	else
	{
        int count=list_copyed.get_size();
		size=count;
		head=NULL;
		Node<T> * p,*q,*s;
		q=list_copyed.get_head();//q首先指向被拷贝的链表的头节点
		s=new Node<T>;
		p=s;
		head=p;
		while(count--)
		{
		  s->date=q->date;
		  s->next=NULL;
		  if(head==NULL)
		  {
			  head=s;
		      p=s;			  
		  }
		  else
		  {
			  p->next=s;
			  p=s;
		  }
		  q=q->next;	
		  s=new Node<T>;
		}		
	}
 }


//运算符重载函数定义
template<class T>
MyList<T>   MyList<T>::operator+(MyList<T> list_after)  //+运算符重载函数作为MyList的成员函数
{
	MyList<T>  result;
	
	if(this->head==NULL)
	{   result.link_copy(list_after);
	result.size=list_after.get_size();			 
	return result;
	}
	
	if(list_after.get_head()==NULL)
	{ 
		result.link_copy(*this);
		result.size=this->size;
		return result;
	}
	
	Node<T> * p=NULL;
	Node<T> * s=NULL;
	Node<T> * q=NULL;
	
	
	q=this->get_head();//q首先指向+的左操作数
	int count=this->get_size(); //count获取左操作数的链表节点个数
	while(count--)   
	{   
		s=new Node<T>;
		s->date=q->date;
		s->next=NULL;
		if(result.get_head()==NULL)
		{
			result.head=s;
			p=s;
			q=q->next;
		}
		else
		{
			p->next=s;
			p=s;
			q=q->next;	
		}
		
	}		
	q=list_after.get_head();//q首先指向+的右操作数
	count=list_after.get_size(); //count获取右操作数的链表节点个数
	while(count--)
	{   
		s=new Node<T>;
		s->date=q->date;
		s->next=NULL;
		p->next=s;
		p=s;
		q=q->next;	
	}		
	
	result.size=this->length_List()+list_after.length_List();
	return result;
}

template<class T>
ostream & operator<<(ostream & out, MyList<T> & mylist)  //<<运算符重载函数作为MyList的友元函数
{
	
	Node<T> * head=mylist.get_head();
	Node<T> * p=head;
	if(head==NULL)  //判断是否为空链表
	{ out<<"the list is empty!"<<endl;
	return  out;  
	} 
	out<<"the list is :";
	while(p->next!=NULL)  //遍历链表,输出各个节点数据
	{ out<<p->date<<" "; 
	p=p->next;
	}
	out<<p->date;
	out<<endl;
	return out;
}  

int main()
{   //创建第一个链表,并对其进行相应操作
	cout<<"create  the first list......: list1"<<endl;
	MyList<char> mylist1; //建立链表对象mylist1
	mylist1.creat_List();//创建链表
	mylist1.print_List();//遍历链表
	cout<<mylist1<<endl;
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度


	int index;
	int length=mylist1.length_List();
	if(mylist1.get_head()!=NULL)
	{
		cout<<"\nplease input the index of list1 (index>=0  index<"<<length<<"): ";
		cin>>index;
		while(index<0||index>=length)  //判断index是否合理
		{
			cout<<"the index is not right,please input the index again :";
			cin>>index;
		}
		cout<<"the index="<<index<<" node value="<<mylist1.getvalue_List(index)<<endl<<endl;
	}
	else
	{ 
		cout<<"the list is empty,the index operation not work!"<<endl;
	}
	
	mylist1.insert_List(); //向链表中插入多个节点
	mylist1.print_List();//遍历链表
	cout<<mylist1<<endl;
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度
	
	
	Node<char> * p=new Node<char>;//增加一个新节点
	cout<<"please input the data of the new  node insert to list1:";
	cin>>p->date;
	p->next=NULL;
	mylist1.insert_Node(p);
    mylist1.print_List();//遍历链表
	cout<<mylist1<<endl;
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl;  //链表长度

  	//对链表进行排序
	cout<<"the result of after sorting list1"<<endl;
	mylist1.list_sort();	
	mylist1.print_List();//遍历链表
	cout<<mylist1<<endl;
	cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

		
	//创建第二个链表,并对其进行相应操作
	cout<<"create  the second list......: list2"<<endl;
	MyList<char> mylist2; //建立链表对象mylist2
	mylist2.creat_List();//创建链表
	mylist2.print_List();//遍历链表
	cout<<mylist2<<endl;
	cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度

	//将链表2链到链表1后
	cout<<"link list1 and list2..."<<endl;	
	mylist1.link_Lists(mylist2);
    mylist1.print_List();//遍历链表
	cout<<mylist1<<endl;
	cout<<"after link the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	cout<<"after link the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度

	//创建第三个链表,由链表1深拷贝而来
	cout<<"create  the third list......: list3"<<endl;    
	MyList<char> mylist3; //建立链表对象mylist3
	cout<<"list3 is copy from list1"<<endl;
	mylist3.link_copy(mylist1);
	mylist3.print_List();
	cout<<mylist3<<endl;
    cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

    //创建第四个链表,由链表1复制拷贝而来
	cout<<"create  the third list......: list4"<<endl; 
	MyList<char> mylist4=mylist1; //调用拷贝构造函数
	cout<<"list4=list1    "<<mylist4<<endl;
	
	mylist4=mylist1+mylist2; //使用运算符重载函数
	cout<<"list4=list1 + list2  "<<mylist4<<endl;

    cout<<"delete the list1."<<endl;
	mylist1.delete_List(); //删除链表1
	//cout<<"the length of the list1: "<<mylist1.length_List()<<endl;  //链表长度
	//cout<<"the size of the list1: "<<mylist1.get_size()<<endl<<endl;  //链表长度


	cout<<"delete the list2."<<endl;
	mylist2.delete_List(); //删除链表2
	//cout<<"the length of the list2: "<<mylist2.length_List()<<endl;  //链表长度
	//cout<<"the size of the list2: "<<mylist2.get_size()<<endl<<endl;  //链表长度

   	cout<<"delete the list3."<<endl;
	mylist3.delete_List(); //删除链表3
	//cout<<"the length of the list3: "<<mylist3.length_List()<<endl;  //链表长度
	//cout<<"the size of the list3: "<<mylist3.get_size()<<endl<<endl;  //链表长度

	cout<<"delete the list4."<<endl;
	mylist4.delete_List(); //删除链表3
	//cout<<"the length of the list4: "<<mylist4.length_List()<<endl;  //链表长度
	//cout<<"the size of the list4: "<<mylist4.get_size()<<endl<<endl;  //链表长度


	return 0;
}



 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值