C++ 数据结构学习二(单链表)

模板类

//LinkList.h 单链表
#ifndef LINK_LIST_HXX
#define LINK_LIST_HXX
#include <iostream>
using namespace std;

template<class T>
struct Node
{
  T data;
  Node * next;
};

template<class T>
class LinkList
{
  public:
    LinkList(); //无参构造函数,建立只有头结点的空链表
    LinkList(T a[],int n); //有参构造函数,建立有n个元素的单链表
    ~LinkList(); //析构函数
    int Length(); //求单链表长度
    T Get(int i); //按位查找,在单链表中查找第i个结点的元素值
    int Locate(T x); //按值查找,在单链表中查找值为x的元素序号
    void Insert(int i,T x); //插入操作,在第i个位置插入元素值为x的结点
    T Delete(int i); //删除操作,在单链表中删除第i个结点
    void PrintList(); //遍历操作,按顺序依次输出各元素
  private:
    Node<T> * first; //单链表的头指针
};

template<class T>
LinkList<T>::LinkList()
{
  first=new Node<T>; //生成头结点
  first->next=NULL; //头结点指针置空
}

/*
template<class T>
LinkList<T>::LinkList(T a[],int n) //头插法建立单链表LinkList
{

  first=new Node<T>;
  first->next=NULL; //初始化一个空链表
  for(int i=0;i<n;i++)
  {
    Node<T> *s=new Node<T>;
    s->data=a[i]; //为每个元素建立一个结点
    s->next=first->next;
    first->next=s; //将结点s插入到头结点之后
  }
}
*/

template<class T>
LinkList<T>::LinkList(T a[],int n) //尾插法建立单链表LinkList
{
  first=new Node<T>;
  Node<T> *r=new Node<T>;
  r=first;
  for(int i=0;i<n;i++)
  {
    Node<T> *s=new Node<T>;
    s->data=a[i]; //为每个元素建立一个结点
    r->next=s; //将结点s插入到终结点之后
    r=s;
  }
  r->next=NULL; //单链表建立完毕,将终结点的指针置空

}

template<class T>
LinkList<T>::~LinkList()
{
  while(first!=NULL) //释放单链表的每一个结点的存储空间
  {
    Node<T> *q=new Node<T>;
    q=first; //暂存被释放的结点
    first=first->next;//first指向被释放结点的下一个结点
    delete q;
  }
}

template<class T>
int LinkList<T>::Length()
{
  Node<T> *p=first->next;
  int count=0; //工作指针p和累加器count初始化
  while(p!=NULL)
  {
    p=p->next;
    count++;
  }
  return count; //注意count的初始化和返回值的关系
}

template<class T>
T LinkList<T>::Get(int i)
{
  Node<T> *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 T>
int LinkList<T>::Locate(T x)
{
  Node<T> *p=first->next;
  int count=1;
  while(p!=NULL)
  {
    if(p->data==x) return count; //查找成功,结束返回位号
    p=p->next;
    count++;
  }
  return 0; //返回0表明查找失败
}

template<class T>
void LinkList<T>::Insert(int i,T x)
{
  Node<T> *p=first->next; //工作指针指向头结点
  int count=1;
  while(p!=NULL&&count<i-1) //查找第i-1个结点
  {
    p=p->next; //工作指针后移
    count++;
  }
  if(p==NULL) throw "位置"; //没有找到第i-1个结点
  else{
    Node<T> *s=new Node<T>;
    s->data=x;
    s->next=p->next; //将结点s插到结点p之后
    p->next=s;
  }
}
template<class T>
T LinkList<T>::Delete(int i)
{
  Node<T> *p=new Node<T>;
  p=first->next;
  int count=1;

  while(p!=NULL&&count<i-1)
  {
    p=p->next;
    count++;
  }
  if(p==NULL||p->next==NULL) throw "位置"; //结点p不存在 或者 p指向的下一个结点不存在
  else{
    Node<T> *q=new Node<T>;
    q=p->next;
    T x=p->data;
    p->next=q->next; //摘链

    delete q;
    return x;
  }
}
template<class T>
void LinkList<T>::PrintList()
{
  Node<T> *p=first->next;
  while(p!=NULL)
  {
    cout<<p->data<<endl;
    p=p->next;
  }
}
#endif

测试

//LinkListDemo.cpp

#include <iostream>

#include "LinkList.h"
using namespace std;

int main()
{
  int a[10]={1,2,3,4,5,6,7,8,9,10};

  LinkList<int> linkList(a,10);
  cout<<"原始单链表数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  linkList.Delete(5);
  cout<<"删除后数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  linkList.Insert(5,108);
  cout<<"插入后数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  cout<<"查询数据"<<linkList.Get(10)<<endl;

  cout<<"查询位置"<<linkList.Locate(108);

  return 0;

}

上一篇:MySQL源码之mysqld启动


下一篇:【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用