转(C++链表)

  1 /*链表在C++语言中是比较常要的技术,比如在做游戏时可以记录人物行走路线,一些用数组难以实现的功能用链表可以轻松实现。那么在C++语言中是链表是怎么实现的呢。下面主要讲解一下。。
  2 
  3 链表实际上就像是自行车里的链条,一环接着一环。在链表里常用指向自身类得NEXT指针来和下一个链表节点做联系。而双向链表主要就是添加一个向上排序的节点。。我们只要理解单向链表,那么双向链表也就明白是怎么回事呢,请看简单的链表代码。。
  4 */
  5 #include "stdafx.h"
  6 #include <iostream>
  7 using namespace std;
  8 //C++简单链表演示
  9 struct Book
 10 {
 11 int num;
 12 int price;
 13 Book *next;
 14 };
 15 //显示链表
 16 void Show(Book *head)
 17 {
 18 while (head)
 19 {
 20 cout<<"编号为:"<<head->num<<",价格为:"<<head->price<<endl;
 21 head=head->next;
 22 }
 23 }
 24 int _tmain(int argc, _TCHAR* argv[])
 25 {
 26 Book *head=new Book;//头结点
 27 Book *p1=new Book;
 28 Book *p2=new Book;
 29 Book *p3=new Book;
 30 head->num=0;
 31 head->price=0;
 32 head->next=p1;
 33 p1->num=1;
 34 p1->price=10;
 35 p1->next=p2;
 36 p2->num=2;
 37 p2->price=20;
 38 p2->next=p3;
 39 p3->num=3;
 40 p3->price=30;
 41 p3->next=NULL;
 42 Show(head);
 43 system("pause");
 44 return 0;
 45 }
 46 
 47 /*以上代码只是一个简单的静态链表,目的是让大家能明白链表是个什么意思。真正在程序中我们一般是动态绑定节点的。下面用一个程序简单的演示动态创建链表。因为结构在C++中默认成员是public级别的。所以我们并不需要手动添加public:块。下面是用类
 48 */
 49  
 50 
 51 Book* CreateHead()
 52 {
 53 Book *head,*p1,*p2;//定义三个指向Book的类,返回值给head
 54 p1=new Book;
 55 head=p1;
 56 p2=p1;//将三个结点一起在椎中创建
 57 cout<<"请输入图书编号,以0结束"<<endl;
 58 cin>>p1->num;
 59 if (p1->num!=0)
 60 {
 61 cout<<"请输入图书价格"<<endl;
 62 cin>>p1->price;
 63 }
 64 else
 65 {
 66 delete p1;p2=NULL;return head;
 67 }
 68 while(p1->num!=0)
 69 {
 70 p2=p1;//这步很重要,意思为将P2设为当前结点,然后用p1继续创建,用培p2->next指向p1
 71 p1=new Book;
 72 cout<<"请输入图书编号,以0结束"<<endl;
 73 cin>>p1->num;
 74 if (p1->num!=0)
 75 {
 76 cout<<"请输入图书价格"<<endl;
 77 cin>>p1->price;
 78 }
 79 p2->next=p1;
 80 }
 81 delete p1;
 82 p2->next=NULL;
 83 return head;
 84 }
 85 
 86  
 87 
 88 /* 
 89 
 90 原理很简单.每次执行编号和价格的时候用本次指针的next成员指向新创建的成员,那么这两个节点就关联起来呢,请大家自行在编辑器里运行并试着自己写代码
 91 
 92  
 93 
 94 链表的删除
 95 
 96   删除原理如下:
 97       当一个链表中有1,2,3,4,5这5个节点,如果我们删除第2个,那么链表将会用1->next指针指向3就可以呢。代码如下
 98 
 99  
100 
101 */ 
102 
103 /删除链表某个结点
104 void Delete(Book *p,int num)
105 {
106 Book *temp;
107 if (p->num==num)
108 {
109 temp=p;
110 p=p->next;
111 ::p=p;
112 delete temp;
113 return;
114 }
115 while(p)
116 {
117 if(p->next==NULL)
118 {
119 cout<<"null"<<endl;
120 return;
121 }
122 if(p->next->num==num)
123 {
124 temp=p->next;
125 p->next=temp->next;
126 delete temp;
127 cout<<"ok"<<endl;
128 return;
129 }
130 p=p->next;
131 }
132 cout<<"null"<<endl;
133 }
134 
135  
136 
137 /* 
138 
139  
140 
141 链表的插入
142 
143   这里假设插入到链表的尾段(因为这样更容易让人理解链表插入的原理),代码如下
144 
145  
146 
147  
148 
149 完整可运行的程序如下
150 
151  
152 */
153  
154 
155 #include "stdafx.h"
156 #include <iostream>
157 using namespace std;
158 //C++动态链表的建立
159 class Book
160 {
161 public:
162 int num;
163 int price;
164 Book *next;
165 };
166 Book *p;
167 //创建头结点返回头结点地址给程序调用
168 Book* CreateHead()
169 {
170 Book *head,*p1,*p2;//定义三个指向Book的类,返回值给head
171 p1=new Book;
172 head=p1;
173 p2=p1;//将三个结点一起在椎中创建
174 cout<<"请输入图书编号,以0结束"<<endl;
175 cin>>p1->num;
176 if (p1->num!=0)
177 {
178 cout<<"请输入图书价格"<<endl;
179 cin>>p1->price;
180 }
181 else
182 {
183 delete p1;p2=NULL;return head;
184 }
185 while(p1->num!=0)
186 {
187 p2=p1;//这步很重要,意思为将P2设为当前结点,然后用p1继续创建,用培p2->next指向p1
188 p1=new Book;
189 cout<<"请输入图书编号,以0结束"<<endl;
190 cin>>p1->num;
191 if (p1->num!=0)
192 {
193 cout<<"请输入图书价格"<<endl;
194 cin>>p1->price;
195 }
196 p2->next=p1;
197 }
198 delete p1;
199 p2->next=NULL;
200 return head;
201 }
202 void Show(Book *head)
203 {
204 while(head!=NULL)
205 {
206 cout<<"图书编号为:"<<head->num<<",价格为:"<<head->price<<endl;
207 head=head->next;
208 }
209 }
210 
211 //删除链表某个结点
212 void Delete(Book *p,int num)
213 {
214 Book *temp;
215 if (p->num==num)
216 {
217 temp=p;
218 p=p->next;
219 ::p=p;
220 delete temp;
221 return;
222 }
223 while(p)
224 {
225 if(p->next==NULL)
226 {
227 cout<<"null"<<endl;
228 return;
229 }
230 if(p->next->num==num)
231 {
232 temp=p->next;
233 p->next=temp->next;
234 delete temp;
235 cout<<"ok"<<endl;
236 return;
237 }
238 p=p->next;
239 }
240 cout<<"null"<<endl;
241 }
242 
243 //链表的添加(这里假设直接添加到最尾段)
244 void Insert(Book *p,int num,int price)
245 {
246 Book *temp=new Book;//这个结点用于添加编号和价格
247 Book *tem=new Book;//这个结点用于存放尾结点地址
248 while(p)
249 {
250 tem=p;
251 p=p->next;
252 }
253 temp->num=num;
254 temp->price=price;
255 tem->next=temp;
256 temp->next=NULL;
257 
258 }
259 int _tmain(int argc, _TCHAR* argv[])
260 {
261 p=CreateHead();
262 Show(p);
263 cout<<endl;
264 cout<<"请输入要删除的编号"<<endl;
265 int num;
266 cin>>num;
267 Delete(p,num);
268 Show(p);
269 cout<<"请输入编号"<<endl;
270 cin>>num;
271 int price;
272 cout<<"请输入价格"<<endl;
273 cin>>price;
274 Insert(p,num,price);
275 Show(p);
276 system("pause");
277 return 0;
278 }
279 
280  
281 
282  
283 
284 //链表的添加(这里假设直接添加到最尾段)
285 void Insert(Book *p,int num,int price)
286 {
287 Book *temp=new Book;//这个结点用于添加编号和价格
288 Book *tem=new Book;//这个结点用于存放尾结点地址
289 while(p)
290 {
291 tem=p;
292 p=p->next;
293 }
294 temp->num=num;
295 temp->price=price;
296 tem->next=temp;
297 temp->next=NULL;
298 
299 }
300 
301  
302 
303  
304   

 

posted @ 2013-05-17 23:00  未知、未来CC  阅读(207)  评论(0编辑  收藏  举报