您现在的位置是:主页 > news > 小学校园文化建设网站/简述如何优化网站的方法
小学校园文化建设网站/简述如何优化网站的方法
admin2025/5/2 23:34:42【news】
简介小学校园文化建设网站,简述如何优化网站的方法,mip 网站,微讯信息群号1000000我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处 临接表虽然很优秀,但是也有一些缺点1.比如对有向图,有时候需要再建立一个逆临接表所以思考一个问题:有没有可能把邻接表和逆邻接表结合起来呢…
小学校园文化建设网站,简述如何优化网站的方法,mip 网站,微讯信息群号1000000我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处 临接表虽然很优秀,但是也有一些缺点1.比如对有向图,有时候需要再建立一个逆临接表所以思考一个问题:有没有可能把邻接表和逆邻接表结合起来呢…
我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处
临接表虽然很优秀,但是也有一些缺点
1.比如对有向图,有时候需要再建立一个逆临接表
所以思考一个问题:有没有可能把邻接表和逆邻接表结合起来呢?
是可以的,方法就是十字链表
为此重新定义顶点表结点结构:
重新定义边表结点结构:
十字链表的好处就是把邻接表和逆邻接表整合到了一起,这样就又容易找到以Vi为尾的弧,又容易找到以Vi为头的弧,因而容易求得顶点的出度和入度
十字链表的构建过程转化为 C 语言代码为:
#define MAX_VERTEX_NUM 20
#define InfoType int//图中弧包含信息的数据类型
#define VertexType int
typedef struct ArcBox{int tailvex,headvex;//弧尾、弧头对应顶点在数组中的位置下标struct ArcBox *hlik,*tlink;//分别指向弧头相同和弧尾相同的下一个弧InfoType *info;//存储弧相关信息的指针
}ArcBox;
typedef struct VexNode{VertexType data;//顶点的数据域ArcBox *firstin,*firstout;//指向以该顶点为弧头和弧尾的链表首个结点
}VexNode;
typedef struct {VexNode xlist[MAX_VERTEX_NUM];//存储顶点的一维数组int vexnum,arcnum;//记录图的顶点数和弧数
}OLGraph;
int LocateVex(OLGraph * G,VertexType v){int i=0;//遍历一维数组,找到变量vfor (; i<G->vexnum; i++) {if (G->xlist[i].data==v) {break;}}//如果找不到,输出提示语句,返回 -1if (i>G->vexnum) {printf("no such vertex.\n");return -1;}return i;
}
//构建十字链表函数
void CreateDG(OLGraph *G){//输入有向图的顶点数和弧数scanf("%d,%d",&(G->vexnum),&(G->arcnum));//使用一维数组存储顶点数据,初始化指针域为NULLfor (int i=0; i<G->vexnum; i++) {scanf("%d",&(G->xlist[i].data));G->xlist[i].firstin=NULL;G->xlist[i].firstout=NULL;}//构建十字链表for (int k=0;k<G->arcnum; k++) {int v1,v2;scanf("%d,%d",&v1,&v2);//确定v1、v2在数组中的位置下标int i=LocateVex(G, v1);int j=LocateVex(G, v2);//建立弧的结点ArcBox * p=(ArcBox*)malloc(sizeof(ArcBox));p->tailvex=i;p->headvex=j;//采用头插法插入新的p结点p->hlik=G->xlist[j].firstin;p->tlink=G->xlist[i].firstout;G->xlist[j].firstin=G->xlist[i].firstout=p;}
}