リニア・テーブル演算--チェーン・ストレージ構造テンプレート・クラスの実装

27460 ワード

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_