先贴上今天的代码—图中的邻接表
#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),比邻接矩阵快缺点
① 求入度时,要先求其反转线性表
② 插入删除要先修改相关链接,麻烦费事
.