鏈表在C++語言中是比較常要的技術,比如在做游戲時可以記錄人物行走路線,一些用數組難以實現的功能用鏈表可以輕松實現。那么在C++語言中是鏈表是怎么實現的呢。下面主要講解一下。。
鏈表實際上就像是自行車里的鏈條,一環接着一環。在鏈表里常用指向自身類得NEXT指針來和下一個鏈表節點做聯系。而雙向鏈表主要就是添加一個向上排序的節點。。我們只要理解單向鏈表,那么雙向鏈表也就明白是怎么回事呢,請看簡單的鏈表代碼。。
#include
"
stdafx.h
"
#include <iostream>
using namespace std;
// C++簡單鏈表演示
struct Book
{
int num;
int price;
Book *next;
};
// 顯示鏈表
void Show(Book *head)
{
while (head)
{
cout<< " 編號為: "<<head->num<< " ,價格為: "<<head->price<<endl;
head=head->next;
}
}
int _tmain( int argc, _TCHAR* argv[])
{
Book *head= new Book; // 頭結點
Book *p1= new Book;
Book *p2= new Book;
Book *p3= new Book;
head->num= 0;
head->price= 0;
head->next=p1;
p1->num= 1;
p1->price= 10;
p1->next=p2;
p2->num= 2;
p2->price= 20;
p2->next=p3;
p3->num= 3;
p3->price= 30;
p3->next=NULL;
Show(head);
system( " pause ");
return 0;
}
#include <iostream>
using namespace std;
// C++簡單鏈表演示
struct Book
{
int num;
int price;
Book *next;
};
// 顯示鏈表
void Show(Book *head)
{
while (head)
{
cout<< " 編號為: "<<head->num<< " ,價格為: "<<head->price<<endl;
head=head->next;
}
}
int _tmain( int argc, _TCHAR* argv[])
{
Book *head= new Book; // 頭結點
Book *p1= new Book;
Book *p2= new Book;
Book *p3= new Book;
head->num= 0;
head->price= 0;
head->next=p1;
p1->num= 1;
p1->price= 10;
p1->next=p2;
p2->num= 2;
p2->price= 20;
p2->next=p3;
p3->num= 3;
p3->price= 30;
p3->next=NULL;
Show(head);
system( " pause ");
return 0;
}
以上代碼只是一個簡單的靜態鏈表,目的是讓大家能明白鏈表是個什么意思。真正在程序中我們一般是動態綁定節點的。下面用一個程序簡單的演示動態創建鏈表。因為結構在C++中默認成員是public級別的。所以我們並不需要手動添加public:塊。下面是用類
Book* CreateHead()
{
Book *head,*p1,*p2; // 定義三個指向Book的類,返回值給head
p1= new Book;
head=p1;
p2=p1; // 將三個結點一起在椎中創建
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL; return head;
}
while(p1->num!= 0)
{
p2=p1; // 這步很重要,意思為將P2設為當前結點,然后用p1繼續創建,用培p2->next指向p1
p1= new Book;
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
{
Book *head,*p1,*p2; // 定義三個指向Book的類,返回值給head
p1= new Book;
head=p1;
p2=p1; // 將三個結點一起在椎中創建
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL; return head;
}
while(p1->num!= 0)
{
p2=p1; // 這步很重要,意思為將P2設為當前結點,然后用p1繼續創建,用培p2->next指向p1
p1= new Book;
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
原理很簡單.每次執行編號和價格的時候用本次指針的next成員指向新創建的成員,那么這兩個節點就關聯起來呢,請大家自行在編輯器里運行並試着自己寫代碼
鏈表的刪除
刪除原理如下:
當一個鏈表中有1,2,3,4,5這5個節點,如果我們刪除第2個,那么鏈表將會用1->next指針指向3就可以呢。代碼如下
/刪除鏈表某個結點
void Delete(Book *p, int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<< " null "<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<< " ok "<<endl;
return;
}
p=p->next;
}
cout<< " null "<<endl;
}
void Delete(Book *p, int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<< " null "<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<< " ok "<<endl;
return;
}
p=p->next;
}
cout<< " null "<<endl;
}
鏈表的插入
這里假設插入到鏈表的尾段(因為這樣更容易讓人理解鏈表插入的原理),代碼如下
完整可運行的程序如下
#include
"
stdafx.h
"
#include <iostream>
using namespace std;
// C++動態鏈表的建立
class Book
{
public:
int num;
int price;
Book *next;
};
Book *p;
// 創建頭結點返回頭結點地址給程序調用
Book* CreateHead()
{
Book *head,*p1,*p2; // 定義三個指向Book的類,返回值給head
p1= new Book;
head=p1;
p2=p1; // 將三個結點一起在椎中創建
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL; return head;
}
while(p1->num!= 0)
{
p2=p1; // 這步很重要,意思為將P2設為當前結點,然后用p1繼續創建,用培p2->next指向p1
p1= new Book;
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void Show(Book *head)
{
while(head!=NULL)
{
cout<< " 圖書編號為: "<<head->num<< " ,價格為: "<<head->price<<endl;
head=head->next;
}
}
// 刪除鏈表某個結點
void Delete(Book *p, int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<< " null "<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<< " ok "<<endl;
return;
}
p=p->next;
}
cout<< " null "<<endl;
}
// 鏈表的添加(這里假設直接添加到最尾段)
void Insert(Book *p, int num, int price)
{
Book *temp= new Book; // 這個結點用於添加編號和價格
Book *tem= new Book; // 這個結點用於存放尾結點地址
while(p)
{
tem=p;
p=p->next;
}
temp->num=num;
temp->price=price;
tem->next=temp;
temp->next=NULL;
}
int _tmain( int argc, _TCHAR* argv[])
{
p=CreateHead();
Show(p);
cout<<endl;
cout<< " 請輸入要刪除的編號 "<<endl;
int num;
cin>>num;
Delete(p,num);
Show(p);
cout<< " 請輸入編號 "<<endl;
cin>>num;
int price;
cout<< " 請輸入價格 "<<endl;
cin>>price;
Insert(p,num,price);
Show(p);
system( " pause ");
return 0;
}
#include <iostream>
using namespace std;
// C++動態鏈表的建立
class Book
{
public:
int num;
int price;
Book *next;
};
Book *p;
// 創建頭結點返回頭結點地址給程序調用
Book* CreateHead()
{
Book *head,*p1,*p2; // 定義三個指向Book的類,返回值給head
p1= new Book;
head=p1;
p2=p1; // 將三個結點一起在椎中創建
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL; return head;
}
while(p1->num!= 0)
{
p2=p1; // 這步很重要,意思為將P2設為當前結點,然后用p1繼續創建,用培p2->next指向p1
p1= new Book;
cout<< " 請輸入圖書編號,以0結束 "<<endl;
cin>>p1->num;
if (p1->num!= 0)
{
cout<< " 請輸入圖書價格 "<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void Show(Book *head)
{
while(head!=NULL)
{
cout<< " 圖書編號為: "<<head->num<< " ,價格為: "<<head->price<<endl;
head=head->next;
}
}
// 刪除鏈表某個結點
void Delete(Book *p, int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<< " null "<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<< " ok "<<endl;
return;
}
p=p->next;
}
cout<< " null "<<endl;
}
// 鏈表的添加(這里假設直接添加到最尾段)
void Insert(Book *p, int num, int price)
{
Book *temp= new Book; // 這個結點用於添加編號和價格
Book *tem= new Book; // 這個結點用於存放尾結點地址
while(p)
{
tem=p;
p=p->next;
}
temp->num=num;
temp->price=price;
tem->next=temp;
temp->next=NULL;
}
int _tmain( int argc, _TCHAR* argv[])
{
p=CreateHead();
Show(p);
cout<<endl;
cout<< " 請輸入要刪除的編號 "<<endl;
int num;
cin>>num;
Delete(p,num);
Show(p);
cout<< " 請輸入編號 "<<endl;
cin>>num;
int price;
cout<< " 請輸入價格 "<<endl;
cin>>price;
Insert(p,num,price);
Show(p);
system( " pause ");
return 0;
}
//
鏈表的添加(這里假設直接添加到最尾段)
void Insert(Book *p, int num, int price)
{
Book *temp= new Book; // 這個結點用於添加編號和價格
Book *tem= new Book; // 這個結點用於存放尾結點地址
while(p)
{
tem=p;
p=p->next;
}
temp->num=num;
temp->price=price;
tem->next=temp;
temp->next=NULL;
}
void Insert(Book *p, int num, int price)
{
Book *temp= new Book; // 這個結點用於添加編號和價格
Book *tem= new Book; // 這個結點用於存放尾結點地址
while(p)
{
tem=p;
p=p->next;
}
temp->num=num;
temp->price=price;
tem->next=temp;
temp->next=NULL;
}