十字链表
一 解决问题始终立足于核心定义:单链表 邻接表 逆邻接表
离散化思想,单步运行
1 第一基本的模型:单链表。
2 第二基本的模型:邻接表。
3 第三基本的模型:逆邻接表
4 三个基本模型之间的关系:
(1) 单链表是邻接表的局部
(2) 邻接表和逆邻接表之间具有对称关系
3 映射的思想
(1) 对象和关系。(现实映射)
(2) 圆圈和直线。(拓扑映射)
(3) 关系,直线,指针三者是一一对应的关系。
4 论什么是关系?
对象A 对象B 关系C 关系D
(1) 关系是对象。
(2) 关系是对象的一部分,是存储于对象之中的索引号。
二 什么是逆邻接表?
图的邻接表,反映的是节点的出度邻接情况;图的逆邻接表,反映的是节点的入度邻接情况。
三
1 邻接表 逆邻接表存储的是一点的信息
十字链表和邻接多重表存储的是两点的信息。
2 int LocalVex(int data,Graph* G){
for(inti=0;i<G->vexnums;i++){
if(G->List[i].data==data)
return i;
}
return -1;
}
voidcreate(Graph* G)
{
intx,y;
printf("请输入顶点的个数的边的数量:");
scanf("%d%d",&G->vexnums,&G->arcnums);
for(inti = 0;i<G->vexnums;i++)
{
printf("输入顶点,建立顶点表:");
//建立顶点表
scanf("%d",&G->List[i].data);
//初始化in和out指针
G->List[i].firIn=G->List.firOut=NULL;
}
intx,y;
for(inti=0;i<G->arcnums;i++)
{
printf("读入(vi-vj):");
scanf("%d%d",&x,&y);
ArcBox *A = (ArcBox)malloc(sizeof(ArcBox));
int k,j;
j = LocalVex(y,G);//j是弧头的位置 1 2
k= LocalVex(x,G);//k是弧尾的位置 0 0
A->headVex= j; //2
A->tailVex = k; //0
A->hLink = G->List[j].firIn; //2 NULL
A->tLink = G->List[k].firOut; // A
G->List[j].firIn = A;
G->List[k].firOut= A; //这里还是在选择头插法构造链表
//十字链表本质上是两个邻接表构成,这两个邻接表的形成互不干扰
}
}