今天是數據結構的鄰接表

先貼上今天的代碼—圖中的鄰接表

#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])。
最後聊一下 鄰接矩陣和鄰接表的優缺點

鄰接矩陣

  1. 優點:
    ① 實現方便
    ② 計算度數方便
    ③ 插入刪除操作簡單

  2. 缺點
    ① 易造成浪費存儲空間
    ② 時間複雜度爲O(n2)

鄰接表

  1. 優點
    ① 節省空間
    ② 時間複雜度爲O(n+e),比鄰接矩陣快

  2. 缺點
    ① 求入度時,要先求其反轉線性表
    ② 插入刪除要先修改相關鏈接,麻煩費事

.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章