先貼上今天的代碼—圖中的鄰接表
#include<iostream>
using namespace std;
class list
{
public:
int val;
class list *next;
};
class list head[6];
int main()
{
list *ptr,*newcode;
int data[14][2]={{1,2},{2,1},{1,5},{5,1},
{2,3},{3,2},{2,4},{4,2},
{3,4},{4,3},{3,5},{5,3},
{4,5},{5,4}
};
cout<<"圖a的鄰接表內容:"<<endl;
for(int i=1;i<6;i++){
head[i].val=i;
head[i].next=NULL;
cout<<"頂點:"<<i<<"=>";
ptr=&(head[i]);
for(int j=0;j<14;j++){
if(data[j][0]==i)
{
newcode = new list;
newcode->val=data[j][1];
//聲明新節點,就假如拿i=1,j=0舉例,此時data[j][0]=1,=i,所以把
//data[j][1]中的2放入新節點的下一個節點,在exe中顯示就是
//“頂點:1->2”
newcode->next=NULL;
while(ptr!=NULL) //while加下面兩句話刪了也沒太大影響。。。
ptr=ptr->next;
ptr=newcode ;//加入新節點
//while加下面兩句話刪了也沒太大影響。。。
cout<<"["<<newcode->val<<"] ";
}
}
cout<<endl;//這步必不可少
}
return 0;
}
於我一個外行而言,今天第一次接觸class的語法,只能先告訴自己,這class都是一些固定的套路語法,寫完類之後,就可以在主函數聲明ptr和newcode了,同樣,我們設data數組如上,便於直接的觀察。
我們安排了5行用於表出,每一行都是head【i】=i,輸出是這樣的:
接下來進入鄰接表算法:
for(int j=0;j<14;j++){
if(data[j][0]==i)
{
newcode = new list;
newcode->val=data[j][1];
//聲明新節點,就假如拿i=1,j=0舉例,此時data[j][0]=1,=i,所以把
//data[j][1]中的2放入新節點的下一個節點,在exe中顯示就是
//“頂點:1->2”
newcode->next=NULL;
while(ptr!=NULL)
ptr=ptr->next;
ptr=newcode ;//加入新節點
//while加下面兩句話刪了也沒太大影響。。。
cout<<”[“<val<<”] “;
}
我們從data數組開始讀數字,第一個是(1,2)因爲data【0】【0】=1,所以把新節點存入2,以此類推;此外,while循環真想不到是幹嘛的,第二處不懂的還有 ptr=&(head [i])。
最後聊一下 鄰接矩陣和鄰接表的優缺點
鄰接矩陣
優點:
① 實現方便
② 計算度數方便
③ 插入刪除操作簡單缺點
① 易造成浪費存儲空間
② 時間複雜度爲O(n2)
鄰接表
優點
① 節省空間
② 時間複雜度爲O(n+e),比鄰接矩陣快缺點
① 求入度時,要先求其反轉線性表
② 插入刪除要先修改相關鏈接,麻煩費事
.