C++实现LinkL

Posted on 2019-03-29 23:06  ANONY_MOUSER  阅读(276)  评论(0编辑  收藏  举报
  1 //
  2 // Created by langzi on 19-3-28.
  3 //
  4 
  5 #include <iostream>
  6 using namespace std;
  7 
  8 typedef int DataType;
  9 #define Node ElemType
 10 #define ERROR NULL;
 11 
 12 
 13 class Node{
 14 public:
 15     int data;
 16     Node *next;
 17 };
 18 
 19 //构建节点
 20 
 21 
 22 class LinkList{
 23 public:
 24     LinkList();
 25     ~LinkList();
 26     void create_linklist(int n);
 27     void traval_list();
 28     int get_length();
 29     bool is_empty();
 30     ElemType *find(DataType dataType);//查找节点
 31     void insert_end(DataType data);
 32     void insert_index(DataType data,int n);
 33     void del_end();
 34     void del_all();
 35     void del_data(DataType data);
 36     void del_head();
 37 
 38 
 39 
 40 
 41 
 42 private:
 43     ElemType *head;
 44 
 45 };
 46 
 47 //构建一个链表
 48 
 49 LinkList::LinkList() {
 50     head=new ElemType;
 51     head->data=0;
 52     head->next=NULL;
 53 }
 54 
 55 
 56 //销毁链表
 57 LinkList::~LinkList() {
 58     delete(head);
 59 }
 60 
 61 //创建一个链表
 62 
 63 void LinkList::create_linklist(int n) {
 64     ElemType *pnew ,*ptemp;
 65     ptemp =head;
 66     if (n<0){
 67         cout<<"你输入的节点有误"<<endl;
 68 
 69 
 70     }
 71     for (int i = 0; i <n ; ++i) {
 72         pnew =new ElemType;
 73         cin>>pnew->data;
 74         pnew->next=NULL;
 75         ptemp->next=pnew;
 76         ptemp=pnew;
 77     }
 78 }
 79 
 80 //遍历一个链表
 81 
 82 void LinkList::traval_list() {
 83     if (head==NULL||head->next==NULL){
 84         cout<<"空的链表"<<endl;
 85 
 86     }
 87     ElemType *p=head;
 88     while (p->next!=NULL){
 89         p=p->next;
 90         cout<<p->data<<" ";
 91 
 92     }
 93 
 94 }
 95 //获取链表的单位长度
 96 int  LinkList::get_length() {
 97     int count=0;
 98     ElemType *ptemp =head;
 99     if (ptemp->next==NULL){
100         return 0;
101 
102     }
103     else{
104         while (ptemp->next!=NULL){
105             count++;
106             ptemp=ptemp->next;
107         }
108     }
109     return count;
110 }
111 //判断单链表是否为空
112 
113 bool LinkList::is_empty(){
114     if(head->next==NULL){
115         return true;
116     } else
117         return false;
118 
119 }
120 //查找节点
121 ElemType *LinkList::find(DataType data) {
122     ElemType *ptemp=head;
123     if (head==NULL){
124         cout<<"kong";
125     }
126     while (ptemp->next!=NULL){
127 
128         if(ptemp->data==data){
129             return ptemp;
130         }
131 
132         ptemp=ptemp->next;
133 
134     }
135     if(ptemp->data==data){
136         return ptemp;
137     }
138     return NULL;//未找到
139 
140 }
141 //尾部插入指定的元素 插入都要定义新节点
142 void LinkList::insert_end(DataType data) {
143     ElemType *newNode =new ElemType;
144     //新节点定义完成
145     newNode->next=NULL;
146     newNode->data=data;
147 
148     ElemType *temp=head;
149     if (head==NULL){
150         head=newNode;
151     }
152 
153 
154     while (temp->next!=NULL){
155         temp=temp->next;
156 
157     }
158     temp->next=newNode;
159 }
160 //制定位置插入制定元素
161 void LinkList::insert_index(DataType data, int n) {
162     if(n<1||n>get_length()){
163         cout<<"值是错误的";
164     } else{
165         ElemType *ptemp= new ElemType;
166         ptemp->data=data;
167         ElemType *p=head;
168         int i=1;
169         //遍历到指定的位置
170         while (i<n){
171             p=p->next;
172             i++;
173         }
174         ptemp->next=p->next;
175         p->next=ptemp;
176 
177     }
178 }
179 //尾部删除元素
180 void LinkList::del_end() {
181     ElemType *p =head;
182     //判断单链表是否为空
183     ElemType *ptemp=NULL;//占位节点,将ptemp指向p的前一个节点
184 
185     if(p->next==NULL){
186         cout<<"链表为空";
187 
188     } else
189     while (p->next!=NULL){
190         ptemp=p;
191         p=p->next;
192     }
193     delete(p);
194     p=NULL;
195     ptemp->next=NULL;
196 }
197 //删除所有数据
198 void LinkList::del_all() {
199     ElemType *p=head->next;
200     ElemType *temp =new ElemType;
201     if (temp->next=NULL){
202         cout<<"已经为空";
203 
204     } else{
205         while (p!=NULL){
206             temp=p;
207             p=p->next;
208             head->next=p;
209             //temp->next=NULL;
210             delete(temp);
211 
212 
213         }
214         head->next=NULL;
215     }
216 }
217 //删除指定的元素
218 void LinkList::del_data(DataType data) {
219     ElemType *p =head;
220     ElemType *temp =find(data);
221     while (p->next!=temp){
222         p=p->next;
223     }
224     p->next=temp->next;
225     delete(temp);
226     temp=NULL;
227 
228 }
229 //删除头部节点
230 
231 void LinkList::del_head() {
232     ElemType *p=head;
233     if(p==NULL||p->next==NULL){
234         cout<<"该链表为空"<<endl;
235 
236     } else{
237         ElemType *ptemp=NULL;//创建一个站位节点
238         p=p->next;
239         ptemp=p->next;
240         delete(p);
241         p=NULL;
242         head->next=ptemp;
243     }
244 }
245 
246 
247 
248 
249 
250 int main(){
251     LinkList linkList;
252     int num;
253     cin>>num;
254 
255     linkList.create_linklist(num);
256     //测试遍历
257     //linkList.traval_list();
258     //测试长度
259     //int length=linkList.get_length();
260     //cout<<length<<endl;
261     //测试查找节点
262     //cout<<(linkList.find(4)->data);
263 
264     //尾部插入指定的元素
265     //linkList.insert_end(8);
266     //linkList.traval_list();
267 
268     //制定位置插入测试 可以在头部
269     //linkList.insert_index(5,1);
270     //linkList.traval_list();
271 
272     //在尾部删除元素
273     //linkList.del_end();
274     //linkList.traval_list();
275 
276     //删除全部的元素
277     //linkList.del_all();
278     //linkList.traval_list();
279 
280 
281     //删除头部节点
282     linkList.del_head();
283     linkList.traval_list();
284 
285 
286 
287 
288 
289 }