今天是数据结构的邻接表

先贴上今天的代码—图中的邻接表

#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. 缺点
    ① 求入度时,要先求其反转线性表
    ② 插入删除要先修改相关链接,麻烦费事

.

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