转(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