建立图的邻接矩阵问题 5C

抄的一段代码,但是有问题,main函数调用CreateMGraph函数出现问题。不知道问题出在哪,诚求解答。图片说明图片说明图片说明

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
无向图以邻接矩阵存储,请算法描述深度优先遍历该图的非递归算法

无向图以邻接矩阵存储,请算法描述深度优先遍历该图的非递归算法。哪位大神可以帮忙写具体点用栈怎么实现?谢谢了!![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/1.gif)

这是一个C++的无向图邻接矩阵,深度优先和广度优先遍历,实在不知道哪里不对,求大神解答

``` #include<iostream> using namespace std; const int MaxSize=10;//图中的最多顶点个数 template <class T> classMGraph { public: MGraph(T a[],int n,int e);//构造函数,建立具有n个顶点e条边的图 ~MGraph(){} //析构函数为空 void DFSTraverse(int v); //深度优先遍历图 void BFSTraverse(int v); //广度优先遍历图 void Setvisited(); // private: T vertex[MaxSize]; //存放图中顶点的数组 int arc[MaxSize][MaxSize]; //存放图中边的数组 int vertexNum,arcNum; //图的顶点数和边数 int visited[MaxSize]; // }; template<class T> void MGraph<T>::Setvisited() { for(int i=0;i<vertexNum;i++) visited[i]=0; } template<class T> MGraph<T>::MGraph(T a[],int n,int e) { int i,j,k; vertexNum=n;arcNum=e; for(i=0;i<vertexNum;i++) vertex[i]=a[i]; for(i=0;i<vertexNum;i++) //初始化邻阶矩阵 for(j=0;j<vertexNum;j++) arc[i][j]=0; for(k=0;k<arcNum;k++) //依次输入每一条边 { cout<<"putin bianhao"; cin>>i>>j; //输入边依附的两个顶点的编号 arc[i][j]=1;arc[j][i]=1;//置有边标志 } } template<class T> void MGraph<T>::DFSTraverse(int v) { int j; cout<<vertex[v];visited[v]=1; for(j=0;j<vertexNum;j++) if(arc[v][j]==1&&visited[j]==0) DFSTraverse(j); } template<class T> void MGraph<T>::BFSTraverse(int v) { int j,front,rear; int Q[MaxSize]; front=rear=-1;//初始化队列,假设队列采用顺序存储且不会发溢出 cout<<vertex[v];visited[v]=1;Q[++rear]=v;//当访问顶点入队 while(front!=rear) //当队列非空时 { v=Q[++front]; for(j=0;j<vertexNum;j++) //将队头元素出队并送到v中 if(arc[v][j]==1&&visited[j]==0) { cout<<vertex[j];visited[j]=1;Q[++rear]=j; } } } int main() { int n,e; cout <<"putin dian:"; cin>>n; cout<<"putin edge:"; cin>>e; char a[MaxSize]; cin>>a; MGraph<char> m(a,n,e); m.Setvisited(); cout<<"DFST:"; m.DFSTraverse(1); cout<<endl; m.Setvisited(); cout<<"BFST:"; m.BFSTraverse(1); cout<<endl; return 0; } ```

给一个图G的邻接矩阵,请你判断是否连通。用语言表示出来?

给一个图G的邻接矩阵,请你判断是否连通。用语言表示。请问用深度优先遍历的话怎么描述出来呢?麻烦大佬了谢谢

数据结构 图 根据邻接矩阵求两点间的所有路径 用栈的方法程序运行时无反应

``` #define maxvex 10 #include <iostream> #include <stack> using namespace std; int visit[maxvex]; typedef char vertextype;//结点数据 typedef struct { vertextype vexs[maxvex];//顶点表 int arc[maxvex][maxvex];//邻接矩阵 int numnodes,numedges,direction;//顶点数,边数,方向 }graph; void creatematrix(graph *g)//邻接矩阵 { int i,j; vertextype e1,e2; cout<<"输入顶点和边数"<<endl; cin>>g->numnodes>>g->numedges; cout<<"是否为有向图?有向图输入1,无向图输入0"<<endl; cin>>g->direction; cout<<"输入各个顶点数据"<<endl; for(i=0;i<g->numnodes;i++) cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A for(i=0;i<g->numnodes;i++) { for(int j=0;j<g->numnodes;j++) g->arc[i][j]=0; }//邻接矩阵初始化 cout<<"请输入每条边的两个顶点结点"<<endl; for(int k=0;k<g->numedges;k++)//输入边数 { cin>>e1>>e2; for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点 { if(g->vexs[i]==e1) break; } for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点 { if(g->vexs[j]==e2) break; } g->arc[i][j]=1; if(g->direction==0) g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称 } cout<<"邻接矩阵建立完成"<<endl; cout<<"邻接矩阵如下"<<endl; for(i=0;i<g->numnodes;i++) { for(j=0;j<g->numnodes;j++) cout<<g->arc[i][j]; cout<<endl; } } void matrixoutput(graph g) { cout<<"邻接矩阵如下"<<endl; for(int i=0;i<g.numnodes;i++) { for(int j=0;j<g.numnodes;j++) cout<<g.arc[i][j]; cout<<endl; } } void DFS1(graph g,int i) { visit[i]=true; cout<<g.vexs[i]<<" ";//打印顶点 for(int j=0;j<g.numnodes;j++)//一个连通分量的遍历 if(g.arc[i][j]==1 && !visit[j]) DFS1(g,j); } //邻接矩阵的深度遍历 void DFS(graph g) { for(int i=0;i<g.numnodes;i++) visit[i]=0;//初始所有顶点状态都是未访问过状态 for(int i=0;i<g.numnodes;i++)//若是连通图,只会执行一次 if(!visit[i])//对未访问过的顶点调用DFS DFS1(g,i); } void output(stack<int> s)//打印栈内元素 { stack<int> out; int e; while(!s.empty()) { e=s.top(); s.pop(); out.push(e); } while(!out.empty()) { char b=char(out.top())+65; cout<<b<<" "; out.pop(); } cout<<endl; } void way(graph g,vertextype e1,vertextype e2) { int visit[g.numnodes]; for(int i=0;i<g.numnodes;i++) visit[i]=0; stack<int> s;//栈内为顶点数据的整型 int a=int(e1)-65;//起点 int b=int(e2)-65;//终点 s.push(a); while(s.top()!=b){ for(int i=0;i<g.numnodes;i++){ if(visit[i]=0 && g.arc[s.top()][i]==1){ s.push(i); } } } output(s); while(!s.empty()){ int temp1=s.top(); s.pop(); for(int i=0;i<g.numnodes;i++){ if(visit[i]=0 && g.arc[s.top()][i]==1){ s.push(i); } } if(s.top()==b) output(s); visit[temp1]=0; } } main() { graph g; vertextype e1,e2; creatematrix(&g); cout<<"对邻接矩阵进行深度优先遍历"<<endl; DFS(g); cout<<endl; cout<<"请输入起点和终点"<<endl; cin>>e1>>e2; way(g,e1,e2); system("pause"); } ``` ![图片说明](https://img-ask.csdn.net/upload/201712/07/1512653961_537149.jpg)

MatlAB中如何将CSV数据文件用邻接矩阵表示出来

MatlAB中如何将CSV数据文件用邻接矩阵表示出来,可以转化为稀疏矩阵。

数据结构 图 邻接矩阵的建立 运行到最后一步会自动退出

``` void creatematrix(graph *g)//邻接矩阵 { int x,t,i,j; vertextype e1,e2; cout<<"输入顶点和边数"<<endl; cin>>g->numnodes>>g->numedges; cout<<"输入各个顶点数据"<<endl; for(i=0;i<g->numnodes;i++) cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A for(i=0;i<g->numnodes;i++) { for(int j=0;i<g->numnodes;j++) g->arc[i][j]=0; }//邻接矩阵初始化 cout<<"请输入每条边的两个顶点结点"<<endl; for(int k=0;k<g->numedges;k++)//输入边数 { cin>>e1>>e2; for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点 { if(g->vexs[i]==e1) break; } for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点 { if(g->vexs[j]==e2) break; } g->arc[i][j]=1; g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称 } cout<<"邻接矩阵建立完成"<<endl; }![图片说明](https://img-ask.csdn.net/upload/201712/06/1512547025_862927.jpg) ``` 只能运行到如图部分,按回车之后程序会自动退出

c语言 把邻接矩阵的相关数据存入文件中

MGraph CreatMG(MGraph g) { int i,j,k,n; cout<<"输入顶点数和边数"; cin>>g.n>>g.e; for(i=0;i<g.n;i++) { cout<<"序号为"<<i<<"的值"; cin>>g.vexs[i].data; g.vexs[i].no=i; } for(i=0;i<g.n;i++) { for(j=0;j<g.n;j++) { g.edges[i][j]=0; } } for(k=0;k<g.e;k++) { cout<<"输入该边的始点与终点以及权值"; cin>>i>>j>>n; g.edges[i][j]=n; } return g; }这是邻接矩阵的建立

用邻接矩阵创建有向网,求最小生成树,最短路径(c语言)。

大神求解!!!用邻接矩阵法创建一个有向网,将有向边直接视为无向边后,得到对应的无向图,则利用Prim算法求取最小生成树MST;利用Dijkstra算法对无向图求取顶点V1对图中其余各点的最短路径。(c语言) ![图片说明](https://img-ask.csdn.net/upload/201911/30/1575078073_128301.jpg)

建立图的邻接表的问题,不知道问题出在哪,求解答

#define MaxVertexNum 20 /* 最大顶点数设为20 */ #define INFINITY 32767 /* ∞设为双字节无符号整数的最大值32767*/ typedef char VertexType; /* 顶点类型设为字符型 */ typedef int EdgeType; /* 边的权值设为整型 */ enum GraphType { DG, UG, DN, UN }; /* 有向图,无向图,有向网图,无向网图*/ typedef struct { VertexType Vertices[ MaxVertexNum ]; /* 顶点表 */ EdgeType Edges[ MaxVertexNum ][ MaxVertexNum ]; /* 邻接矩阵,即边表 */ int n, e; /* 顶点数n和边数e */ enum GraphType GType; /* 图的类型分4种:UG、DG、UN、DN */ } MGraph; /* MGragh是以邻接矩阵存储的图类型 */ void CreateMGraph ( MGraph *G ) { int i, j, k, w; G-> GType = UN; /* Undirected Network 无向网图 */ printf( "请输入顶点数和边数(输入格式为:顶点数, 边数):\n" ); scanf( "%d, %d",&(G->n), &(G->e) ); /* 输入顶点数和边数 */ printf("请输入顶点信息(输入格式为:顶点号<CR>):\n"); for ( i = 0; i < G->n; i++ ) scanf( "%c",&(G-> Vertices[i]) ); /* 输入顶点信息,建立顶点表 */ for ( i = 0; i < G->n; i++ ) for ( j = 0; j < G->n; j++ ) G->Edges[i][j] = INFINITY; /* 初始化邻接矩阵 */ printf( "请输入每条边对应的两个顶点的序号和权值,输入格式为:i, j, w:\n" ); for ( k = 0; k < G->e; k++ ) { scanf("%d,%d,%d ",&i, &j, &w); /* 输入e条边上的权,建立邻接矩阵 */ G->Edges[i][j] = w; G->Edges[j][i] = w; /* 因为无向网图的邻接矩阵是对称的 */ } }![图片说明](https://img-ask.csdn.net/upload/201611/20/1479642113_25182.png)

图的BFS遍历的输出问题

正确的输入输出: ``` 9 15 ABCDEFGHI 0 1 1 0 5 1 1 6 1 5 6 1 2 1 1 1 8 1 2 8 1 6 7 1 2 3 1 3 8 1 3 7 1 3 4 1 4 7 1 4 5 1 3 6 1 A B F C G I E D H ``` 输出: ![图片说明](https://img-ask.csdn.net/upload/202005/25/1590408177_256045.png) 正确的输出: 我的代码: 单步调试发现,输入没有问题:问题应该出在BFS的输出中, 前三个输出相同 A B F 第四个标准答案为 C 但在此时的 B 出队对应的第一个入队的元素为 号元素 G; 是我的代码有问题还是答案有问题? ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include<string.h> #define MAX_VERTEX 10 //无边界时的值; #define inf 65535 //表示两点之间没有边相连 //访问标识函数; int visit[MAX_VERTEX]; //标记顶点是否被访问 /**图的邻接矩阵的建立**/ //邻接矩阵数据结构定义 typedef struct Martrix_Graph { char vertex[MAX_VERTEX]; //存储顶点信息 int edge[MAX_VERTEX][MAX_VERTEX]; //存储边信息 int vertex_number, edge_number;//存储顶点数和边数 }Martrix_Graph; /**BFS会用到队列这个数据结构**/ /**循环队列**/ typedef struct { char data[MAX_VERTEX]; //存储信息; int front; //头指针 int rear; //尾指针,队列非空则指向队尾最后一个元素后一个位置 }SqQueue; /* TODO:以邻接矩阵为存储结构建立无向图 功能描述:创建以邻接矩阵为存储结构的无向图 参数描述:Martrix_Graph型指针G为主要操作参数 提示:在输入无向图顶点信息时提示printf("请输入无向图顶点信息(如ABCDEF....):\n"); 在输入无向图邻接矩阵相连的边信息时提示printf("请输入无向图邻接矩阵相连的边信息,相连标记为1\n"); */ void Create_non_direction_martrix_Graph(Martrix_Graph *G) { int i, k, j ,number; scanf_s("%d", &G->vertex_number); //输入顶点的数目,和边的总数; scanf_s("%d", &G->edge_number); getchar(); // 获取 '\n' ,防止其对之后的字符输入造成影响; printf("请输入无向图顶点信息(如ABCDEF....):\n"); for (i = 0; i < G->vertex_number; i++) scanf_s("%c", &G->vertex[i]); // 输入顶点的信息; // 初始化邻阶矩阵 /*for (i = 0; i < G->edge_number; i++) for (j = 0; j < G->edge_number; j++) G->edge[i][j] = 0; */ printf("请输入无向图邻接矩阵相连的边信息,相连标记为1\n"); for (k = 0; k < G->edge_number; k++) { getchar(); scanf_s("%d %d %d", &i, &j, &number); G->edge[i][j] = number; } } //队列初始化 void InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; } //入队 bool EnQueue(SqQueue *Q, char e) { //采用留一个空间的方式; //判断队列是否满 if ((Q->rear + 1) % MAX_VERTEX == Q->front) return false; Q->data[Q->rear] = e; //队尾移动; Q->rear = (Q->rear + 1) % MAX_VERTEX; return true; } //出队---删除队首元素,并赋给e void DeQueue(SqQueue *Q, char *e) //e 也为 char 型的指针; { *e = Q->data[Q->front]; //取出元素; //将对应的位置++; Q->front = (Q->front + 1) % MAX_VERTEX; } //队列判空 bool isEmptyQueue(SqQueue *Q) { return Q->front == Q->rear ? true : false; //返回 0 1; } /*找到顶点v的对应下标*/ int LocateVex(Martrix_Graph *G, char v) { int i; for (i = 0; i < G->vertex_number; i++) { if (G->vertex[i] == v) break; } return i; } /* TODO:对整个图进行广度优先遍历 功能描述:对整张无向图进行广度优先遍历 参数描述:Martrix_Graph型参数G 提示:遍历图的顶点时提示printf("此邻接矩阵无向图BFS的结果为:\n"); 队首顶点出队,并赋值给data时输出printf("%c ",data); */ void BFS_Travel(Martrix_Graph G) //为变量; { SqQueue queue; int i, j ,w; char data ,e; // 初始化; memset(visit, 0, MAX_VERTEX); InitQueue(&queue); // bfs 输出; for (i = 0; i < G.vertex_number; i++) { if (visit[i] == 0) { visit[i] = 1; data = G.vertex[i]; printf("%c ", data); //输出遍历; EnQueue(&queue, data); while ( !isEmptyQueue(&queue)) //当队列不为空时; { // 取出队首元素找到它的对应位置; DeQueue(&queue, &e); //通过e带出元素; w = LocateVex(&G, e); //取出与该元素相连接的元素; for (j = 0; j < G.vertex_number; j++) { //当未访问和有为该元素的连接元素时; if (visit[j] == 0 && G.edge[w][j] == 1) { visit[j] = 1; data = G.vertex[j]; printf("%c ", data); EnQueue(&queue, data); } } } } } } int main() { printf("创建邻接矩阵无向图并进行广度遍历\n"); printf("请输入构造的无向图的顶点数和边数:\n"); //输入顶点数和边数; Martrix_Graph G; //申请一个图的空间; Create_non_direction_martrix_Graph(&G); //创建图; BFS_Travel(G); return 0; } ```

无向图的存储结构,求大神求大神

Description 给出一个有n个顶点的无向图,顶点编号从0到n-1。给出每一条边,输出该图的邻接矩阵和邻接表。 Input 输入的第一行是顶点数n和边数 e 。 1 ≤ n ≤ 300 ,1 ≤ e ≤ 1000 接下来是 e 行,每行2个整数 i , j ( 0 ≤ i, j < n ) ,表示顶点 i 和 j 之间有一条边。 Output 输出该图的邻接矩阵。邻接表按顶点编号每行从小到大,每列也是从小到大。 然后输出一个空行。 接着输出该图的邻接表。 为了使得答案唯一,邻接表每行的第一个数字是顶点编号,然后按照顶点的下标编号从小到大输出各邻接顶点。 Sample Input 6 7 0 1 1 5 0 4 2 5 1 4 2 3 3 5 Sample Output 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 4 1 0 4 5 2 3 5 3 2 5 4 0 1 5 1 2 3

关于邻接表的建立与输出

``` #include<stdio.h> #include<malloc.h> #define max 10000 int edge[1000000][2]={0}; typedef struct _enode { //int dis; int vex; struct _enode* nextedge; }enode; typedef struct _vnode { int vex; enode* firstedge; }vnode; typedef struct _pic { int vex_num; int edge_num; vnode node[max]; }pic; void find_insert(enode* edge,enode* temp) { enode* p; p=edge; while(p->nextedge!=NULL) p=p->nextedge; p->nextedge=temp; } pic* create_pic() { int i=0,c1,c2; enode* node_temp; pic* picture; picture=(pic*)malloc(sizeof(pic)); picture->edge_num=5; picture->vex_num=3; for(i=1;i<=picture->vex_num;i++) //you are sb。I just say to you { picture->node[i].vex=i; picture->node[i].firstedge=NULL; c1=edge[i][0]; c2=edge[i][1]; node_temp=(enode*)malloc(sizeof(struct _enode)); node_temp->vex=c2; if(picture->node[c1].firstedge==NULL) { picture->node[c1].firstedge=node_temp; } else { find_insert(picture->node[c1].firstedge,node_temp); } } return picture; } int main(void) { int i=0; pic* picture; for(i=1;i<=5;i++) { scanf("%d",&edge[i][0]); scanf("%d",&edge[i][1]); } picture=create_pic(); for(i=1;i<=picture->vex_num;i++) { enode* p; p=(enode*)malloc(sizeof(enode)); if(picture->node[i].firstedge==NULL) printf("error"); else { p=picture->node[i].firstedge; printf("%d ",picture->node[i].vex); while(p!=NULL) { printf("%d ",p->vex); p=p->nextedge; } } printf("\n"); } } ``` 一个邻接表的建立与输出的程序,求大神看看为啥输入5个边的信息没有反应 ![图片说明](https://img-ask.csdn.net/upload/201703/08/1488960146_731655.png)

要求自定10个教学目标和局部关系,建立邻接矩阵,计算可达矩阵,进而确定教学目标的层级。(通过c语言实现)

我的代码不知道哪出了问题,希望大佬指正一下。 #include<stdio.h> #include<math.h> void main() { int i,j,n; int a[5][5],b[5][5],c[5][5]; int d[5]={0}; int k=0; printf("plz input A+E:\n"); for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&c[i][j]); b[i][j]=c[i][j]; a[i][j]=0; } } while(k==0) { for(i=0;i<5;i++) for(j=0;j<5;j++) { for(n=0;n<5;n++) a[i][j]+=b[i][n]*c[n][j]; if(a[i][j]!=0) a[i][j]=1; } for(i=0;i<5;i++) { for(j=0;j<5;j++) if(a[i][j]=c[i][j]) k=1; else { k=0; for(i=0;i<5;i++) for(j=0;j<5;j++) b[i][j]=a[i][j]; break; } if(k==0) break; } } printf("可达矩阵为:"); for(i=0;i<5;i++) { for(j=0;j<5;j++) { printf("%3d,a[i][j]="); if(j==4) printf("\n"); d[i]+=a[j][i]; } } printf("层次为:"); for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(d[j]==i) printf("%3d,j+1"); } } }

关于数据结构的邻接表的创建

在创建完表头之后,怎么把该顶点链接的顶点插到表后面?代表有些看不懂,求助。万分感谢。

无向图的可达矩阵是怎么写的啊?

无向图的可达矩阵是怎么写的啊?有向图的两结点可达就为1,不可达就为0,很好写。但是无向图如果没有孤立结点,岂不是整个可达矩阵内全为1?可达矩阵是不是这么回事啊?

数据结构图(用C语言)当中为什么邻接表用结构体变量报错,用邻接矩阵不报错?

我写的一个邻接表代码 ``` #include<stdio.h> #include<stdlib.h> #define MAXSIZE 10 struct ArcNode { int adjvex; ArcNode *next; }; struct VertexNode { int vertex; ArcNode *firstedge; }; int visited[MAXSIZE]; typedef struct Graph { VertexNode adjlist[MAXSIZE]; int vertexNum, arcNum; }ALGraph ; \\初始化邻接表 void InitALGraph(ALGraph g, int a[ ], int n, int e) { g.vertexNum=n; g.arcNum=e; int i,j; for (j=0; j<MAXSIZE; j++) g.adjlist[j].firstedge=NULL; for (i=0; i<g.vertexNum; i++) //输入顶点信息,初始化边表 { g.adjlist[i].vertex=a[i]; } int k; for (k=0; k<g.arcNum; k++) //输入边的信息存储在边表中 { int j; scanf("%d%d",&i,&j); ArcNode* s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=j; s->next=g.adjlist[i].firstedge; g.adjlist[i].firstedge=s; } } \\深度优先遍历 void DFSTraverse(ALGraph g , int v) { printf("%d\n",g.adjlist[v].vertex); visited[v]=1; ArcNode * p=g.adjlist[v].firstedge; int i; for(i=0;i<g.vertexNum;i++){ while(p){ if(p->adjvex==i&&visited[i]==0) DFSTraverse(g,i); else p=p->next; } } } int main(){ ALGraph g; int a[10]={1,2,3,4}; InitALGraph(g,a, 4, 4); DFSTraverse(g , 0); } ``` 编译没问题,运行说The variable 'g' is being used without being inititalized 但是这个邻接矩阵代码 ``` #include<stdio.h> #include<stdlib.h> #define MAX_VER_NUM 50 int visited[MAX_VER_NUM]={0}; typedef char VertexType; VertexType Q[MAX_VER_NUM]; typedef enum { DG,UDG }GraphType; typedef struct { VertexType vexs[MAX_VER_NUM]; //顶点向量 int arcs[MAX_VER_NUM][MAX_VER_NUM]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 GraphType type; //图的种类标志 }MGraph; //1. 根据名称得到指定顶点在顶点集合中的下标 //vex 顶点 //return 如果找到,则返回下标,否则,返回0 int getIndexOfVexs(char vex,MGraph *MG) { int i; for(i=1;i<=MG->vexnum;i++) { if(MG->vexs[i]==vex) { return i; } } return 0; } //2. 创建邻接矩阵 void create_MG(MGraph *MG) { int i,j,k; int v1,v2,type; char c1,c2; printf("Please input graph type DG(1) or UDG(0):"); scanf("%d",&type); if(type==1) { MG->type=DG; } else if(type==0) { MG->type=UDG; } else { printf("Please input correct graph type DG(1) or UDG(0)!"); return; } printf("Please input vexnum:"); scanf("%d",&MG->vexnum); printf("Please input arcnum:"); scanf("%d",&MG->arcnum); getchar(); for(i=1;i<=MG->vexnum;i++) { printf("Please input %dth vex(char):",i); scanf("%c",&MG->vexs[i]); getchar(); } //初始化邻接矩阵 for(i=1;i<=MG->vexnum;i++) { for (j=1;j<=MG->vexnum;j++) { MG->arcs[i][j]=0; } } //输入边的信息,建立邻接矩阵 for(k=1;k<=MG->arcnum;k++) { printf("Please input %dth arc v1(char) v2(char):",k); scanf("%c %c",&c1,&c2); v1=getIndexOfVexs(c1,MG); v2=getIndexOfVexs(c2,MG); if(MG->type==DG) { MG->arcs[v1][v2]=1; } else { MG->arcs[v1][v2]=MG->arcs[v2][v1]=1; } getchar(); } } //3. 打印邻接矩阵和顶点信息 void print_MG(MGraph MG) { int i,j; if(MG.type==DG) { printf("Graph type: Direct graph\n"); } else { printf("Graph type: Undirect graph\n"); } printf("Graph vertex number: %d\n",MG.vexnum); printf("Graph arc number: %d\n",MG.arcnum); printf("Vertex set:"); for(i=1;i<=MG.vexnum;i++) { printf("%c",MG.vexs[i]); } printf("\nAdjacency Matrix:\n"); for(i=1;i<=MG.vexnum;i++) { for(j=1;j<=MG.vexnum;j++) { printf("%d",MG.arcs[i][j]); } printf("\n"); } } //4. 从顶点V出发深度优先遍历图MG void DFSMG(MGraph MG, VertexType V) { printf("%c",V); int v,j; v=getIndexOfVexs(V,&MG); visited[v]=1; for (j=1; j<=MG.vexnum; j++) if (MG.arcs[v][j]==1 && visited[j]==0) DFSMG(MG, MG.vexs[j]); } //5. 从顶点V出发广度优先遍历图MG void BFSMG(MGraph MG, VertexType V) { int v,j; int front=0, rear=0; //假设采用顺序队列且不会发生溢出 printf("%c",V); v=getIndexOfVexs(V,&MG); visited[v]=1; Q[++rear]=V; while (front!=rear) { VertexType c=Q[++front]; v=getIndexOfVexs(c,&MG); for (j=1; j<=MG.vexnum; j++) if (MG.arcs[v][j]==1 && visited[j]==0 ) { printf("%c",MG.vexs[j]); visited[j]=1; Q[++rear]=MG.vexs[j]; } } } //主函数 int main(void) { MGraph MG; create_MG(&MG); print_MG(MG); //printf("深度优先遍历序列为:\n"); //DFSMG(MG,'A'); //visited[MAX_VER_NUM]={0}; printf("\n广度优先遍历序列为:\n"); BFSMG(MG,'A'); return 0; } ``` 上面的邻接矩阵代码用的也是结构体变量,为什么又可以执行,是因为邻接表图的结构体中有指针吗,但是以下代码 ``` #include<stdio.h> struct MyStruct{ int a; int *b; MyStruct *c; }; int main(){ MyStruct ms; ms.a=5; printf("%d\n",ms.a); return 0; } ``` 结构体里也有指针,为什么可以执行?

【数据结构】用邻接表存储图的简单问题

``` #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1 typedef char VertexData; //边表节点类型定义 typedef struct ArcNode{ int adj;//该弧指向顶点的位置 struct ArcNode *nextarc;//指向下一条弧的指针 }ArcNode; //表头节点类型定义 typedef struct VertexNode{ VertexData data; ArcNode *firstarc;//指向该顶点第一条弧的指针; int order; }VertexNode; typedef struct{ VertexNode vertex[MAX_VERTEX_NUM]; int vexnum,arcnum; }AdjList; int LocateVertex(AdjList *G,VertexData v) { int j=ERROR,k; for(k=0;k<G->vexnum;k++) { if(G->vertex[k].data==v) { j=G->vertex[k].order; break; } } return(j); } void CreateGraph(AdjList *G) { printf("请输入图的顶点数和弧数(最多不超过20):"); scanf("%d %d",&G->vexnum,&G->arcnum); printf("请输入顶点:"); int i,j,k; char v1,v2; for(i=0;i<G->vexnum;i++) { scanf("%c",&(G->vertex[i].data)); G->vertex[i].order=i+1; G->vertex[i].firstarc=NULL; } printf("请输入一条弧的两个顶点(例如AB):\n"); for(k=0;k<G->vexnum;k++) { scanf("%c %c",&v1,&v2); ArcNode *p,*q; p=(ArcNode*)malloc(sizeof(ArcNode)); q=(ArcNode*)malloc(sizeof(ArcNode)); i=LocateVertex(G,v1); j=LocateVertex(G,v2); p->adj=j; q->adj=i; p->nextarc=G->vertex[i].firstarc; q->nextarc=G->vertex[j].firstarc; G->vertex[i].firstarc=p; G->vertex[j].firstarc=q; fflush(stdin); } } void print(AdjList *G) { int i,j; for(i=0;i<G->vexnum;i++) { printf("%c ",G->vertex[i].data); ArcNode *p; p=G->vertex[i].firstarc; while(p!=NULL) { printf("%d ",p->adj); p=p->nextarc; } printf("\n"); } } void main() { AdjList G; CreateGraph(&G); print(&G); } ``` 用邻接表存储图,但是测试(将所建的邻接表打印在屏幕上)时出现以下非正常结果 求大佬指点迷津 ![图片说明](https://img-ask.csdn.net/upload/201812/25/1545744676_78069.jpg)

图的最短路径算法的实现

设计内容: 设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。 1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图 ; 2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍; 3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径 。 选做内容(对文件进行操作,相应信息变化后,再次进行景点信息查询和问路查询时应该有所体现) 1. 修改一个已有景点的相关信息; 2. 增加一个新景点及其相关信息; 3. 增加一条新的路径; 4. 删除一个景点及其相关信息; 5. 删除一条路径。 设计提示: 1. 校园道路是双向通行的,可设校园平面图是一个带权的无向图,用邻接矩阵表示此无向网。 typedef struct{ char name[100]; char info[10000]; }VertexType; //顶点结构 typedef struct{ VertexType vexs[10]; int arcs[100][100];//邻接矩阵 int vexnum,arcnum;//顶点个数,边的个数 }MGraph; //图结构 2. 将图的顶点信息和边的信息用数据文件graph.txt存储,数据文件格式可以设置如下形式: 图中顶点数 边的数目 景点名称 景点信息 始点 终点 路径长度 如可以在文件graph.txt中存储以下数据: 8 15 女生宿舍 有南北两栋,6层 南门 经青春大道通往学校北门 …… 正门 主楼 80 正门 图书馆 400 …… 程序运行的参考结果下图(仅供参考): 设计要求: (1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。 (2) 程序要添加适当的注释,程序的书写要采用缩进格式。 (3) 根据实验报告模板详细书写实验报告,在实验报告中给出校园平面图。 (4) 校园平面图中的校园景点信息保存在文件graph.txt中。

C++不带权无向网的邻接表的最小生成树的实现所用算法

写了一段不带权无向网邻接表的代码,用算法实现最小生成树,但是Kruskal和Prim两个算法得出的是不一样的,Kruskal是正确的,求解

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Intellij IDEA 实用插件安利

1. 前言从2020 年 JVM 生态报告解读 可以看出Intellij IDEA 目前已经稳坐 Java IDE 头把交椅。而且统计得出付费用户已经超过了八成(国外统计)。IDEA 的...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

魂迁光刻,梦绕芯片,中芯国际终获ASML大型光刻机

据羊城晚报报道,近日中芯国际从荷兰进口的一台大型光刻机,顺利通过深圳出口加工区场站两道闸口进入厂区,中芯国际发表公告称该光刻机并非此前盛传的EUV光刻机,主要用于企业复工复产后的生产线扩容。 我们知道EUV主要用于7nm及以下制程的芯片制造,光刻机作为集成电路制造中最关键的设备,对芯片制作工艺有着决定性的影响,被誉为“超精密制造技术皇冠上的明珠”,根据之前中芯国际的公报,目...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

百度工程师,获利10万,判刑3年!

所有一夜暴富的方法都写在刑法中,但总有人心存侥幸。这些年互联网犯罪高发,一些工程师高技术犯罪更是引发关注。这两天,一个百度运维工程师的案例传遍朋友圈。1...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

内容导航: 1、TIOBE排行榜 2、总榜(2020年6月份) 3、本月前三名 3.1、C 3.2、Java 3.3、Python 4、学习路线图 5、参考地址 1、TIOBE排行榜 TIOBE排行榜是根据全世界互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。

立即提问
相关内容推荐