• 线性表运算--链式存储结构模板类实现


    采用C++模板类实现

      1 #ifndef _List_H_
      2 #define _List_H_
      3 #include <iostream>
      4 #include "stdlib.h"
      5 template <class T>
      6 class CNode
      7 {
      8 public:
      9     T data;
     10     CNode<T> *next;
     11 };
     12 template <class T>
     13 class CLink
     14 {
     15 public:
     16     CLink();
     17     CLink(const CNode<T> &init_data);            
     18     ~CLink();
     19     void InsertHead(const T &data);              //从头插入节点
     20     bool Insert(const int pos,const T &data );   //在pos位置之前插入data;
     21     bool Delete(const int pos);                  //删除第Pos个元素
     22     int  Get_Length()const;                      //获得链表长度
     23     bool Find_Data(const T& data)const;          //返回链表中是否存在data.
     24     bool IsEmpty() const;                        //判断链表是否为空
     25     bool SetAt(const int pos,const T& data);     //将位置pos的值设为data
     26     void Remove();                               //清空链表
     27     void Print()const;                           //打印链表中的内容
     28 protected:
     29     CNode<T> *head;
     30     int Count;                                   //记录链表中元素个数
     31 
     32 };
     33 
     34 
     35 template <class T>
     36 CLink<T>::CLink()
     37 {
     38     head = new CNode<T>;
     39     head->next=NULL;
     40     Count = 0;
     41 }
     42 template <class T>
     43 CLink<T>::~CLink()
     44 {
     45         if(head->next!=NULL)
     46         {
     47              CNode<T>* p = head;
     48              CNode<T>* q;
     49          while (p->next!=NULL)
     50          {
     51             q = p->next;
     52             p->next = q->next;
     53             delete q;
     54         }
     55     delete head;
     56 }
     57 template <class T>
     58 CLink<T>::CLink(const CNode<T> &initdata)
     59 {
     60     head = new CNode<T>;
     61     head->next = NULL;
     62     head->data = initdata;
     63     Count = 0;
     64 }
     65 template <class T>
     66 void CLink<T>::InsertHead(const T& data)
     67 {
     68     CNode<T> *newnode = new CNode<T>;
     69     newnode->data = data;
     70     newnode->next = head->next;
     71     head->next = newnode;
     72     ++Count;
     73 }
     74 template <class T>
     75 void CLink<T>::Print()const
     76 {
     77     CNode<T>* p = new CNode<T>;
     78     p = head;
     79     while(p->next)
     80     {
     81         p = p->next;
     82         std::cout<<p->data<<" ";    
     83     }
     84 }
     85 template <class T>
     86 bool CLink<T>::Insert(const int pos,const T& data)
     87 {
     88     int i=1;
     89     if (pos>Count+1||pos<1)
     90     {
     91         std::cout<<"插入位置不存在"<<std::endl;
     92         return false;
     93     }
     94     else
     95     {
     96         CNode<T>* newNode = new CNode<T>;
     97         CNode<T>* p = head->next;
     98         newNode->data = data;
     99         while(i<=Count&&i!=pos-1)
    100         {
    101             i++;
    102             p = p->next;
    103         }
    104         newNode->next = p->next;
    105         p->next = newNode;
    106         ++Count;
    107         return true;
    108     }
    109 }
    110 template <class T>
    111 bool CLink<T>::Delete(const int pos)
    112 {
    113     int i = 0;              //应该从0开始,注意删除首元节点
    114     if (pos<1||pos>Count)
    115     {
    116         std::cout<<"删除元素不存在"<<std::endl;
    117         return false;
    118     }
    119     else
    120     {
    121         CNode<T>* p = head;
    122         CNode<T>* q;
    123         while(i<=Count-1&&i!=pos-1)
    124         {
    125             i++;
    126             p = p->next;
    127         }
    128         q = p->next;
    129         p->next = q->next;
    130         delete q;
    131         --Count;
    132         return true;
    133     }
    134 }
    135 template<class T>
    136 bool CLink<T>::Find_Data(const T& data)const
    137 {
    138     if(!Count||!(head->next))
    139     {
    140         return false;
    141     }
    142     else
    143     {
    144         CNode<T>* p =head->next;
    145         while (p->data !=data&&p->next!=NULL)
    146         {
    147             p = p->next;
    148         }
    149         if(!p->next)
    150         {
    151             std::cout<<"链表中不存在数据data"<<std::endl;
    152             return false;
    153         }
    154         else
    155         {
    156             std::cout<<"链表中存在数据data"<<std::endl;
    157             return true;
    158         }
    159     }
    160 }
    161 template <class T>
    162 bool CLink<T>::IsEmpty() const
    163 {
    164     if(!head||0==Count)
    165     {
    166         return true;
    167     }
    168     else
    169     {
    170         return false;
    171     }
    172 }
    173 template <class T>
    174 bool CLink<T>::SetAt(const int pos,const T& data)
    175 {
    176     int i = 0;
    177     if(!head||pos<1||pos>Count)
    178     {
    179         return false;
    180     }
    181     else
    182     {
    183         CNode<T>* p = head;
    184         while(i<=Count&&i!=pos)
    185         {
    186             p = p->next;
    187             i++;
    188         }
    189         p->data = data;
    190         return true;
    191     }
    192 
    193 }
    194 template <class T>
    195 void CLink<T>::Remove()
    196 {
    197     if(!head->next)
    198     {
    199         std::cout<<"链表为空"<<std::endl;
    200     }
    201     else
    202     {
    203         CNode<T>* p = head;
    204         CNode<T>* q;
    205         while (p->next!=NULL)
    206         {
    207             q = p->next;
    208             p->next = q->next;
    209             delete q;
    210         }
    211         std::cout<<"链表清除成功"<<std::endl;
    212     }
    213 }
    214 template <class T>
    215 int CLink<T>::Get_Length()const
    216 {
    217    return Count;
    218 }
    219 
    220 #endif//_List_H_
    书到用时方恨少,是非经过不知难。 博观而约取,厚积而薄发。@karllen 每天进步一点点。
  • 相关阅读:
    POJ-2955 Brackets(括号匹配问题)
    NYOJ
    石子合并问题
    hdu 4915 括号匹配+巧模拟
    hdu 4920
    hdu 4911 求逆序对数+树状数组
    hdu 4923 单调栈
    hdu 4930 斗地主恶心模拟
    hdu 4927 组合+公式
    hdu 4925 黑白格
  • 原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3734359.html
Copyright © 2020-2023  润新知