链表的实现(类模板)

来源:互联网 发布:蔡珍妮淘宝退货地址 编辑:程序博客网 时间:2024/06/07 18:14

上一篇文章的链表实现有点小问题,此处使用类模板再做描述,不过部分代码有所不同。

#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;template<class T>class LinkList;    //类的声明template<class T>class ListNode{   //由于结构体不太便于描述,故此处使用类来描述结点public:    friend class LinkList<T>;    //为了使LinkList类能访问该类的私有变量,应将其设为ListNode的友元类    //friend void f();private:    T data;    ListNode<T>* next;};template<class T>class LinkList{public:    LinkList(){head = NULL;}   //构造函数,初始化链表    ~LinkList(){};             //析构函数    bool ListEmpty(){return head == NULL;}      int ListLength();          //求链表长度    void CreateListF();        //头插法构造链表    void CreateListR();        //尾插法构造链表    void CreateList();         //带头结点的尾插法    bool GetElem(int i,T& x);  //判断第i个结点是否存在,若存在,将其记录在x中    int LocateElem(T x);       //求x所在的位置    void InsertNode(int i,T x);//在第i个元素前插入x    void DeleteNode(int i,T& x);//删除第i个元素,并将其记录在x中    void PrintList();          //打印该链表    //void f();private:    ListNode<T>* head;};template<class T>void LinkList<T>::CreateListF(){    ListNode<T>* p = head,* s;    T ch;    ch = getchar();    while(ch != '\n'){         //换行符作为结束标志        s = new ListNode<T>;        s -> data = ch;        s -> next = p;        p = s;        ch = getchar();    }    head = p;}template<class T>void LinkList<T>::CreateListR(){    ListNode<T>* s,* rear = NULL;    T ch;    ch =getchar();    while(ch != '\n'){        s = new ListNode<T>;        s -> data = ch;        if(head == NULL)            head = s;        else            rear = s;        ch = getchar();    }    rear -> next = NULL;}template<class T>void LinkList<T>::CreateList(){    ListNode<T>* s,* rear = NULL;    T ch;    head = new ListNode<T>;    rear = head;    ch = getchar();    while(ch != '\n'){        s = new ListNode<T>;        s -> data = ch;        rear -> next = s;        rear = s;        ch = getchar();    }    rear -> next = NULL;}template<class T>int LinkList<T>::ListLength(){    ListNode<T>* p = head -> next;    int num = 1;    while(p){        p = p -> next;        num ++;    }    return num;}template<class T>bool LinkList<T>::GetElem(int i, T& x){    int j = 1;    ListNode<T>* p = head -> next;    while(p && j < i){        p = p -> next;        j ++;    }    if(p){        x = p -> data;        return 0;    }    return -1;}template<class T>int LinkList<T>::LocateElem(T x){    int num = 0;    ListNode<T>* p = head -> next;    while(p && p -> data != x){        num ++;        p = p -> next;    }    if(p)        return ++ num;    else        return -1;}template<class T>void LinkList<T>::InsertNode(int i, T x){    ListNode<T>* p = head,* s;    int j = 0;    while(p && j < i - 1){        p = p -> next;        j ++;    }    if(i < 1 || i > ListLength() + 1)        return ;    s = new ListNode<T>;    s -> data = x;    s -> next = p -> next;    p -> next = s;}template<class T>void LinkList<T>::DeleteNode(int i,T& x){    ListNode<T>* p = head,* u;    int j = 0;    while(p && j < i- 1){        p = p -> next;        j ++;    }    if(i < 1 || i > ListLength() + 1)        return;    u = new ListNode<T>;    u = p -> next;    p -> next = u -> next;    x = u -> data;    delete u;}template<class T>void LinkList<T>::PrintList(){    ListNode<T>* p = head -> next;    while(p){        cout<<p -> data<<" ";        p = p -> next;    }    cout<<endl;}int main(){    LinkList<char>L;    char ch;    int k;    L.CreateList();    L.PrintList();    if(L.GetElem(8,ch) == 0)        cout<<"这个位置的元素是:"<<ch<<endl;    else        cout<<"没有这个序号!"<<endl;    L.InsertNode(5,'t');    cout<<"在位置5插入t之后的内容如下:\n";    L.PrintList();    cout<<"删除位置5后的内容如下:\n";    L.DeleteNode(5,ch);    L.PrintList();    cout<<"被删除的元素是:"<<ch<<endl;    ch = 'm';    k = L.LocateElem(ch);    if(k != -1)        cout<<"元素"<<ch<<"所在位置为:"<<k<<endl;
0 0
原创粉丝点击