单链表基本操作

template <typename T>
struct Node 
{ 
  T data; 
  Node<T> *next;   
}; 
template <class T>
class LinkList { 
  public: 
  LinkList(){first=new Node<T>;first->next=NULL;}
     LinkList(T a[],int n) ; 
  ~LinkList(); 
  int Length();
  T Get(int i) ; 
  int Locate(T x) ;
  void Insert(int i, T x);
  T Delete(int i); 
  void PrintList( ); 
  private: 
  	Node<T>  *first; // 单链表的头指针 
}; 
//头插法构造单链表
template <class T>  
LinkList<T>:: LinkList(T a[ ], int n) {
    first=new Node<T>;   //生成头结点
   first->next=NULL;
   Node<T> *s;
   for(int i=0; i<n; i++)
   { 
          s=new Node<T>; 
          s->data=a[i];  //为每个数组元素建立一个结点
          s->next=first->next;
          first->next=s;
	}
}
//尾插法构造单链表
template <class T>  
LinkList<T>:: LinkList(T a[], int n) 
{
    Node<T> *r,*s;      //尾指针
    first=new Node<T>;   //生成头结点
	r=first;          
    for (int i=0; i<n; i++)	
    { 
        s=new Node<T>; 
        s->data=a[i];  //为每个数组元素建立一个结点
        r->next=s; 
        r=s;      //插入到终端结点之后
	}
    r->next=NULL;    //单链表建立完毕,将终端结点的指针域置空
 }
//单链表的遍历
template <class T>  
LinkList<T>:: PrintList()
{
    Node<T> *p;
	p=first->next;          
     while(p)
	{
		cout<<p->data;
            p=p->next;
	}
 }
//按位置查找
template <class T>
T LinkList<T>::Get(int i) 
{   
	  Node<T> *p; int j;
	  p=first->next;  j=1;  //或p=first; j=0;
	  while (p && j<i) 
          {
    		p=p->next;       //工作指针p后移
		j++;
  	  }
	  if (!p) throw "位置";
	  else return p->data;
}
//插入操作
template <class T>  
void LinkList<T>::Insert(int i, T x)
{  
   Node<T> *p; int j;
   p=first;j=0;    //工作指针p初始化
   while(p&& <i-1)   
   {
     p=p->next;   //工作指针p后移
     j++;
   }
   if(!p) throw "位置";
    else { 
	  Node<T> *s;
      s=new Node<T>; 
	  s->data=x;  //向内存申请一个结点s,其数据域为x
      s->next=p->next;       //将结点s插入到结点p之后
      p->next=s;	
	}
 }
//删除操作
template <class T>  
T LinkList<T>::Delete(int i){ 
  Node<T> *p; int j;
  p=first ; j=0;  //工作指针p初始化
  while (p && j<i-1) {  //查找第i-1个结点
    p=p->next; 
    j++;
  }
  if (!p||!p->next) throw "位置";  //结点p不存在或结点p的后继结点不存在
    else 
    {
  	  Node<T> *q; T x;
          q=p->next; x=q->data;  //暂存被删结点
          p->next=q->next;  //摘链
          delete q; 
          return x;
	}
}
//析构函数
template <class T>
LinkList<T>:: ~LinkList()
{
   Node<T> *q;
   while (first)
   {
       q=first->next;
       delete first;
       first=q;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值