数据结构(二):线性表的链式存储结构-单链表的实现

来源:互联网 发布:乐视网络电视for mac 编辑:程序博客网 时间:2024/06/08 02:04

单链表节点类型

在单链表中,一个节点的结构包含:数据域和指针域

template <typename T>//定义模板节点类型struct LinkList{    T data;//存放数据元素    LinkList<T> *next;//用于指向下一个节点的指针域 };

基本运算算法

template <class T> class LinkListClass{    LinkList<T> *head;              //单链表头节点 public:    LinkListClass<T>();             //构造函数,创建一个空单链表     ~LinkListClass<T>();           //析构函数     void CreateListF(T a[], int n);//头插法建表     void CreateListR(T a[], int n);//尾插法建表     void DispList();                //遍历显示链表数据     int ListLength();               //求长度     bool GetElem(int i, T &e);      //求链表中某个数据元素的值     int LocateElem(T e);            //按元素值查找     bool ListInsert(int i , T e);   //插入数据元素     bool ListDelete(int i);         //删除元素 public: //友元函数  开放型    //查找最后一个值为X的节点逻辑序号    template<typename C>    friend int Findlast(LinkListClass<C> &L, C x);     //逆置链表中所有的节点    template<typename D>    friend void Reverse(LinkListClass<D> &L);     //两个链表交叉存放到第三个链表中    template<typename A>    friend void Combo(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3);     //二路归并     template<typename A>    friend void Merge2(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3); };

C++中模板类使用友元模板函数 – – 开放型

指的是友元函数声明在模板类中, 但是在类外进行定义

 template <class T> class LinkListClass{public:    //查找最后一个值为X的节点逻辑序号    template<typename C>    friend int Findlast(LinkListClass<C> &L, C x);};template<typename C>int Findlast(LinkListClass<C> &L, C x){    …………}

注意点: 友元函数需声明为 public:

实现代码

#include<iostream>using namespace std;template <typename T>struct LinkList{    T data;    LinkList<T> *next; }; template <class T> class LinkListClass{    LinkList<T> *head;              //单链表头节点 public:    LinkListClass<T>();             //构造函数,创建一个空单链表     ~LinkListClass<T>();           //析构函数     void CreateListF(T a[], int n);//头插法建表     void CreateListR(T a[], int n);//尾插法建表     void DispList();                //遍历显示链表数据     int ListLength();               //求长度     bool GetElem(int i, T &e);      //求链表中某个数据元素的值     int LocateElem(T e);            //按元素值查找     bool ListInsert(int i , T e);   //插入数据元素     bool ListDelete(int i);         //删除元素 public:     //友元函数     //查找最后一个值为X的节点逻辑序号    template<typename C>    friend int Findlast(LinkListClass<C> &L, C x);     //逆置链表中所有的节点    template<typename D>    friend void Reverse(LinkListClass<D> &L);     //两个链表交叉存放到第三个链表中    template<typename A>    friend void Combo(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3);     //二路归并     template<typename A>    friend void Merge2(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3); }; template<typename C>int Findlast(LinkListClass<C> &L, C x){    LinkList<C> *p = L.head->next;    int i = 0, j = i;    while(p != NULL)    {        i ++;        if(p->data == x) j = i;        p = p->next;    }    return j;}template<typename D>void Reverse(LinkListClass<D> &L){    LinkList<D> *p = L.head->next, *q;    L.head->next = NULL;    while(p != NULL)    {        q = p->next;        p->next = L.head->next;        L.head->next = p;        p = q;    }}//两个链表交叉存放到第三个链表中template<typename A>void Combo(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3) {    LinkList<A> *p = L1.head->next, *q = L2.head->next;    LinkList<A> *s, *r;    r = L3.head;    while(p != NULL && q != NULL)    {        s = new LinkList<A>();        s->data = p->data;        r->next = s;        r = s;        p = p->next;        s = new LinkList<A>();        s->data = q->data;        r->next = s;        r = s;        q = q->next;     }    while(p != NULL)    {        s = new LinkList<A>();        s->data = p->data;        r->next = s;        r = s;        p = p->next;    }        while(q != NULL)    {        s = new LinkList<A>();        s->data = q->data;        r->next = s;        r = s;        q = q->next;    }    r->next = NULL;}//二路归并 template<typename A>void Merge2(LinkListClass<A> &L1,LinkListClass<A> &L2, LinkListClass<A> &L3){    LinkList<A> *p = L1.head->next, *q = L2.head->next;    LinkList<A> *p1, *q1, *r;    L1.head->next = NULL;    L2.head->next = NULL;    r = L3.head;    while(p != NULL && q != NULL)    {        if(p->data < q->data)        {            p1 = p->next;            r->next = p;            r = p;            p = p1;        }        else        {            q1 = q->next;            r->next = q;            r = q;            q = q1;        }    }    while(p != NULL)    {        p1= p->next;        r->next = p;        r = p;        p = p1;    }    while(q != NULL)    {        q1= q->next;        r->next = q;        r = q;        q = q1;    }} //初始化和销毁 template<typename T> LinkListClass<T>::LinkListClass() {    head = new LinkList<T>();    head->next = NULL;  }    template<typename T> LinkListClass<T>::~LinkListClass() {    LinkList<T> *pre, *p;    pre = head;    p = pre->next;    while(p != NULL)    {        delete pre;        pre = p;        p = p->next;     }     delete pre; } //建立单链表 //头插法建表 template<typename T> void LinkListClass<T>::CreateListF(T a[], int n) {    LinkList<T> *s; int i;    head->next = NULL;    for(i = 0; i < n; i++)    {        s = new LinkList<T>();        s->data = a[i];        s->next = head->next;        head->next = s;     }  }   //尾插法建表template<typename T>void LinkListClass<T>:: CreateListR(T a[], int n){    LinkList<T> *s, *r;    int i;    r = head;    for(i = 0; i < n; i++)    {        s = new LinkList<T>();        s->data = a[i];        r->next = s;        r = s;      }      r->next = NULL;}  //输出单链表 template <typename T> void LinkListClass<T>::DispList() {    LinkList<T> *p;    p = head->next;    while(p != NULL)    {        cout <<p->data<< " ";         p = p->next;      }     cout << endl;  }  //求;链表长度 template<typename T> int LinkListClass<T>::ListLength() {    int i = 0;    LinkList<T> *p;    p = head;    while(p->next != NULL)    {        i++;        p = p.next;     }     return i;  }   //求某个数据元素的值  template<typename T>  bool LinkListClass<T>::GetElem(int i, T &e)  {    int j = 0;    LinkList<T> *p;    p = head;    while(j < i && p != NULL)    {        j++;        p = p->next;      }      if(p == NULL)        return false;    else    {        e = p->data;        return true;    }   } //按元素值查找template<typename T>int LinkListClass<T>::LocateElem(T e){    int i = 1;    LinkList<T> *p;    while(p != NULL && p->data!=e)    {        p=p.next;        i++;    }    if(p==NULL) return 0;    else    return i;}  //插入数据元素 template<typename T> bool LinkListClass<T>::ListInsert(int i, T e) {    int j = 0;    LinkList<T> *s, *p;    if(i < 1) return false;    p = head;    while(j < i-1 && p != NULL)    {        j++;        p = p.next;     }     if(p == NULL) return false;     else     {        s = new LinkList<T>();        s->data = e;        s->next = p.next;        p->next = s;        return true;     }  }  //删除元素 template<typename T> bool LinkListClass<T>::ListDelete(int i) {    int j = 0;    LinkList<T> *q, *p;    if(i < 1) return false;    p = head;    while(j < i-1 && p != NULL)    {        j ++;        p = p->next;     }     if(p == NULL) return false;     else     {        q = p->next;        if(q == NULL) return true;        p->next = q->next;        delete q;        return true;     }  }  int main() {    int n;    int a[5] = {1,20,30,40,50};    int a2[7] = {11,22,33,44,55,90,80};    LinkListClass<int> Link;    LinkListClass<int> Link2;    LinkListClass<int> Link3;    //Link.CreateListF(a, 5);    Link.CreateListR(a, 5);    Link2.CreateListR(a2, 7);    //Link.GetElem(3, n);    //cout << Findlast(Link, 2) << endl;    //Reverse(Link);    //Combo(Link, Link2, Link3);    Link.DispList();    cout << endl;    Link2.DispList();    cout << endl;    Merge2(Link, Link2, Link3);    //cout << n << endl;    Link3.DispList();    return 0; }

本人github链接:**https://github.com/ITMasterC**欢迎来共同探讨,C++,cocos2dx游戏,数据结构,C语言实现小游戏代码…………

0 0
原创粉丝点击