数据结构-单链表_c++

来源:互联网 发布:python 分词 编辑:程序博客网 时间:2024/05/22 13:30

**

节点结构的定义:**

template<class T>struct Node{T data;Node * link;Node(){Link=NULL;}Node(T x,Node *next=NULL){ data=x; link=next; }};

单链表类的定义

template<class T>class LinkList {   Node<T> * head;//单链表头指针public:   LinkList();//默认构造函数   LinkList(T a[ ],int n);//生成有n个数据的链表(采用尾插法)   ~LinkList();//析构函数   Node<T> *invert(Node<T> *x);//单链表的反转   int ListLength();//求单链表的长度   T get(int pos);//按位查找   int Locate(T item);//按值查找   void PrintLinkList();//遍历单链表输出   bool Insert(int i,const T &item);//单链表的插入   bool Remove(int i,T&x);//单链表的删除};

**

3 算法设计与实现(类的成员函数实现)

**
(1) 默认构造函数

template<class T>LinkList<T>::LinkList()    //构造函数1{ //创建带表头结点的空单链表    head=new Node<T>;//创建表头结点}

(2)有参构造函数

template<class T>LinkList<T>::LinkList(T a[],int n)    //构造函数2{  //用尾插法创建单链表    Node<T> *p,*r;    head=p=new Node<T>;//创建表头结点,p指针指向当前单链表的最后一个结点    for(int i=0;i<n;i++)    {        r=new Node<T>(data[i]);        p->link=r;       //链接到p指针所指结点之后        p=p->link;       //p指针后移    }}

(3)析构函数

template<class T>LinkList<T>::~LinkList()   //清空操作,将各元素结点空间释放,单链表为空表{Node<T> *current=head->link; // current指向首元结点    while(current!=NULL) //依次扫描链表结点,并逐个释放空间    {           Node<T> *r=current;        current=current->link;        delete r;    }    head->link =NULL; //单链表为空}

(4)单链表的反转

template<classT>Node<T> LinkList<T>::*invert(Node *x){    Node<T> *p,*q,*r;    p=x;    q=NULL;    while(p)    {        r=q;        q=p;        p=p->link;        q->link=r;    }    return q;}

(5)求单链表的长度

template<classT>int LinkList<T>::ListLength(){    int num=0;    Node<T> *p=head->link;    while(P)    {        p=p->link;        num++;    }    return num;}

(6)按位查找

template<classT>T LinkList<T>::Get(int pos){    Node<T> *p=head->link;    j=1;    while(p&&j<pos)    {        p=p->link;        j++;     }     if(!p||j>pos)     {         cout<<"查找位置非法"<<endl;         exit(1);     }     else      return p->data;}

(7)按值查找

template<classT>int LinkList<T>::Locate(T item){    Node<T>*p=head->link;    int j=1;    while(p&&p->data!=item)    {        p=p->link;        j++;    }    if(p) return j;    else return 0;}

(8) 插入操作
算法描述:
① 若i<1,则插入失败,结束;
② 扫描单链表,寻找单链表中第i-1个元素结点的指针p;
③ 若p存在(p非空)则在其后插入,操作成功,否则不能插入。

template<class T>bool LinkList<T>::Insert(int i,const T&item){ //在单链表的第i个元素之前插入元素item,插入成功返回true,否则返回false。    if(i<1) //插入位置不合法        return false;    Node<T> *s,*p=head;    int count=0; // count是计数器    while(p && count<i-1)//找第i-1个元素结点的指针front    {        p=p->link;        count++;    }    if(!p) //插入位置不合法        return false;     s=new Node<T>(item,p->link);        s->data=item;        s->link= p->link;//确定待插入结点(s所指结点)的link指针(s->link)指向    p->link=s; //修改链表中的指针(p->link)指向    return true;}

(9) 删除操作
a) 算法步骤:(删除单链表中的第pos个元素)
① 若pos<1,则删除失败,结束;
② 在单链表中找第pos -1个元素结点的指针p;
③ 若p和p->link均非空,则删除p->link所指结点,否则删除失败。

template<classT>bool LinkList<T>::Remove(int i,T&x) //删除单链表的第i个元素,并置入x{    if(i<1)   //删除位置不合法        return false;    Node<T> *current,*p=head;    int count=0;// count是计数器    while(p->link && count<i-1)//找第i-1个元素结点的指针    {        p=p->link;        count++;    }    if(!p->link)  //删除位置不合法,pos大于表长        return false;    current=p->link;  // current指向被删除结点    p->link=current->link; //修改链表指针    x= current->data;    delete current;    return true;}

(10)打印整个链表

template<class T>void LinkList<T>::PrintLinkList(){    Node<T>*current = head->link;    while(current)    {        cout<<current->data<<" ";        current=current->link;    }    cout<<endl;}
阅读全文
0 0
原创粉丝点击