首页 > 编程知识 正文

邻接表写出广度优先遍历图解,图的逆邻接表

时间:2023-05-03 17:15:17 阅读:135419 作者:2

邻接表是图的一种顺序存储与链式存储的结合的存储方式。他包括两种结点结构,顶点表和边表。

顶点表的节点结构由顶点字段和指向第一条相邻边的指针字段组成。 653http://www.Sina.com/)边表节点由邻接点区域和指向下一个邻接边的指针区域构成。

即,以下结构的嵌套* ** # definemax 100 typedefcharvertextype; typedef struct node{/*定义边表的节点*/int adjvex; //相邻接点区域struct node *next; //指向下一个相邻点字段的指针字段(}EdgeNode; typedef struct vexnode{/*顶点表节点*/VertexType data; //顶点域edge node *第一边缘; //指向第一个边缘节点的(}VHeadeNode; typedef struct { vheadenodeadjlist [ max ]; /*相邻头节点数组*/int n,e; //顶点数、边数}AdjList;建议多读几遍熟悉逻辑

接下来,创建图旁边的表。

根据参数或要求选择是制作有向图还是制作有向图。 voidgreateagraph(adjlist*g,int flag )根据标志的值0,1选择有向图形还是无向图。输入图形的边和顶点数信息: printf ) (请输入图形的顶点数) scanf('%d ',g-n ); printf ('请输入图中的边数:'); scanf('%d ',g-e ); getchar (; //吃此换行符以避免影响下一个字符的输入printf ()顶: %d,边: %d )、g-n、g-e ); for(I=0; ig-n; I ) printf('%c ',g-adjlist[i].data; //检查顶点输出} AdjList类型:就是图的邻接表类型

代码中有printf的详细注释。 'n请输入边缘信息。 输入格式为序列号1、序列号2 (序列号为0、1、2……((n ) ) ) ) )。) ) ) ) ) ) )。 int x,y; //关系节点数EdgeNode *p; for(I=0; ig-e; I ) {printf ('请输入第%d条的边),I ); scanf('%d,%d )、x和y ); //输入第一条边并将编号为x的节点添加到相邻表中p=(edgenode* ) malloc ) sizeof ) edgenode ); p-adjvex=y; p-next=g-adjlist[x].firstedge; //插头法g-adjlist[x].firstedge=p; if(flag==0) (/无有向图对称p=(edgenode* ) malloc ) sizeof ) edgenode ); p-adjvex=x; //y的相邻点(相邻编号) p-next=g-adjlist[y].firstedge; //无向图的边相等,编号为y的节点也被添加到邻接表中的g-adjlist[y].firstedge=p; } http://www.Sina.com/void display (adj list * g ) {int i; EdgeNode *p; printf(((n======输出邻接表========((n ) ); for(I=0; ig-n; I () printf(-(%c ),I,g-adjlist[i].data ); p=g-adjlist[i].firstedge; while(p!=NULL ()/p不为空时printf ),p-adjvex ); p=p-next; }printf((n ); }与相邻矩阵相比,使用相邻表可以节省空间。

代码说明和演示的结果:

# include stdio.h # include stdlib.h/*进一步,从容纳一个顶点的排列开始,其中又有少量的数和边的数*/*排列容纳顶点信息。 后面链表的节点*//*链表的节点又是一种结构类型,包含指向一个点和下一个点的点*的typedef struct node{/*边缘表的节点*/int adjvex //相邻接点区域struct node *next; //指向下一个相邻点字段的指针字段(}EdgeNode; typedef struct vexnode{/*顶点表节点*/VertexType data; //顶点域edge node *第一边缘; //指向第一个边缘节点的(}VHeadeNode; typedef struct { vheadenodeadjlist [ max ]; /*相邻头节点数组*/int n,e; //顶点数、边数}AdjList; //根据图的邻接表类型voidgreateagraph(adjlist*g,int flag ) flag的值0.1选择有向图还是无向图; if(flag==0) printf ((===================) ) () ) (创建无向图) }printf ('请输入图中的顶点数:'); scanf('%d ',g-n ); printf ('请输入图中的边数:'); scanf('%d ',g-e ); getchar (; //输入printf (顶: %d,边: %d )、g-n、g-e ),以此换行符影响下一个字符; /*要在其上绘制的顶点信息*/printf((n请输入绘图的每个顶点信息(n ) ); for(I=0; ig-n; I ) ) {printf (第%d个顶点信息: ),i 1 ); scanf('%c )、) g-adjlist[i].data; //为图中每个节点的顶点域分配getchar (); g-adjlist[i].firstedge=NULL; //首先点的边缘标题指针全部为空(for ) I=0; ig-n; I ) printf('%c ',g-adjlist[i].data; //检查顶点输出}/*关于要在其中绘制出图的边表的信息*/printf(n (请输入n条边的信息。 输入格式为编号1、编号2 (编号0、1、2……) (n ) ); int x,y; //关系节点数EdgeNode *p; for(I=0; ig-e; I ) {printf ('请输入第%d条的边),I ); scanf('%d,%d )、x和y ); //输入第一条边并将编号为x的节点添加到相邻表中p=(edgenode* ) malloc ) sizeof ) edgenode ); p-adjvex=y; p-next=g-adjlist[x].firstedge; //插头法g-adjlist[x].firstedge=p; if(flag==0) (p=) edgenode * (malloc ) sizeof ) edge node ); p-adjvex=x; //y的相邻点(相邻编号) p-next=g-adjlist[y].firstedge; //无向图的边相等,编号为y的节点也被添加到邻接表中的g-adjlist[y].firstedge=p; } } }/*输出邻接表的函数(/voiddisplay ) adjlist*g ) {int i; EdgeNode *p; printf(((n======输出邻接表========((n ) ); for(I=0; ig-n; I () printf(-(%c ),I,g-adjlist[i].data ); p=g-adjlist[i].firstedge; while(p!=NULL () printf('--[%d] )、p-adjvex ); p=p-next; }printf((n ); }} int main () {AdjList G; greateagraph(g,0 ); //有向图DisPlay(G的建立(g ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。