C++创建单链表,完整代码

前端时间搜了下创建单链表,发现全是些片段,创完我都不知道如何声明!!

气煞我也,下面是我自己的代码,包括对单链表的增删查改操作,以及应用实例。

#include <iostream>
using namespace std;
template <class DataType>
struct Node
{
	 DataType data;
	 Node<DataType> *next;                 //结点类 
};
template <class DataType>
class LinkList
{   
public:
     LinkList( );                          //新建空表 
     LinkList(DataType a[ ], int n);       //链表赋值 
     ~LinkList( ); 						   //析构函数 
     int Length( );          			   //计算长度 
     DataType Get(int i);           	   //按位查找 
     int Locate(DataType x);       		   //按值查找 
     void Insert(int i, DataType x);       //插入操作 
     DataType Delete(int i);        	   //删除操作 
     void PrintList( );           		   //遍历操作 
private:
     Node<DataType> *first; 			
};
template <class DataType>
void LinkList<DataType> :: PrintList( )
{
     Node<DataType> *p = first->next; 
     while (p != NULL)
     {
         cout << p->data;
         p = p->next;   
     }
     cout<<endl; 
}
template <class DataType>
int LinkList<DataType> :: Length( )
{
     Node<DataType> *p = first->next;int count = 0;     
     while (p != NULL)
     {
         p = p->next;
         count++;
     }
     return count;     //注意count的初始化和返回值之间的关系
}
template <class DataType>  
int LinkList<DataType> :: Locate(DataType x) 
{
     Node<DataType> *p = first->next;
	 int count = 1;         
    while (p != NULL)    
    {
        if (p->data == x) return count;     //查找成功,返回序号
        p = p->next;                   
        count++;
    }
    return 0;                                          //退出循环表明查找失败
}
template <class DataType>  
 void LinkList<DataType> :: Insert(int i, DataType x)
 {
	  Node<DataType> *p = first ,*s;
	  int count = 0;                		//工作指针p应指向头结点
      while (p != NULL && count < i - 1)     //查找第i – 1个结点
     {
          p = p->next;                   
          count++;
     }
     if (p == NULL) throw "位置";      //没有找到第i – 1个结点
    else { 
        s = new Node<DataType>;  s->data = x;         //申请一个结点s
        s->next = p->next; p->next = s;   //结点s插入结点p之后
    }
 }
template <class DataType>  
DataType LinkList<DataType> :: Get(int i)
{
	 Node<DataType> *p=first->next;int count=1;
	 while (p!=NULL && count<i)
	 {
	 	 p=p->next;
	 	 count++;
	 }
	 if(p == NULL)throw "位置";
	 else return p->data; 
}
template <class DataType>  
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
     Node<DataType> *r,*s;
 	 first = new Node<DataType>;                 	 //生成头结点
     r = first;                         //尾指针初始化
    for (int i = 0; i < n; i++)
    { 
        s = new Node<DataType>; s->data = a[i];        
        r->next = s; r = s;                 
    }
     r->next = NULL;        
}
template <class DataType>  
LinkList<DataType> :: LinkList()
{
	 first=new Node<DataType>;                 	//生成头结点
	 first->next=NULL;				  //头节点的指针域置空 
}
template <class DataType>  
DataType LinkList<DataType> :: Delete(int i)
{
     Node<DataType> *p,*q;
     DataType x;
	 p = first ;int count = 0;            
     while (p != NULL && count < i - 1)
     {
         p = p->next;
         count++;
     }
     if (p == NULL || p->next == NULL)  throw "位置"; 
     else {
         q = p->next; x = q->data;         
         p->next = q->next;              
         delete q; return x;
     }
}
template <class DataType>
LinkList<DataType> :: ~LinkList( )
{	 Node<DataType> *q;
     while (first != NULL)
     {
         q = first;                 
         first = first->next;         
         delete q;    
     }
}
int main(){
	int a[5]={11,22,33,44,55}; 
	LinkList <int> L(a,5);
	cout<<"插入前数据:";L.PrintList();
	cout<<"第二位数据的值:";cout<<L.Get(2);cout<<endl;
	cout<<"11对应的序号:";cout<<L.Locate(11);cout<<endl;
	try
	 {
		L.Insert(1,66);
	 }
	catch(char *s)
	 {
	 	cout<<s<<endl;
	 }
	cout<<"插入后的数据:";L.PrintList();
	try
	 {
		L.Delete(5);
	 }
	catch(char *s)
	 {
	 	cout<<s<<endl;
	 }
	cout<<"删除后的数据:";L.PrintList();
	cout<<"数组长度:";cout<<L.Length();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/TaloyerG/article/details/120415438
今日推荐