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

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

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于邻接表的建立与输出

``` #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)

用数组表示法(邻接矩阵)和邻接表两种存储结构分别表示下面的无向图。

用数组表示法(邻接矩阵)和邻接表两种存储结构分别表示下面的无向图。![图片说明](https://img-ask.csdn.net/upload/201904/10/1554855949_147929.png)

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

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

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

#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)

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

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

C语言数据结构 有向图

对任意一个有向图完成如下操作: 建立邻接链表 计算任意顶点的出度和入度 根据邻接表建立逆邻接表 遍历并输出经过的边。

C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现?

C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现?

求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出

要求用数据结构 代码后面要有注释 底下的要求一个也不能漏 图的DFS遍历 要求: 1) 先任意创建一个图; 2) 图的DFS的递归和非递归算法的实现 3) 要求用邻接矩阵、邻接表两种结构存储实现

数据结构图(用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; } ``` 结构体里也有指针,为什么可以执行?

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

``` 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++数据结构有向网相关问题

基于图的深度优先和广度优先搜索算法,分别设计算法判别以邻接表方式存储的有向图中是否存在有点Vi到Vj的路径

无向图以邻接矩阵存储,请算法描述深度优先遍历该图的非递归算法

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

7-2 jmu-ds-顺序表的基本操作(15 分)

实现顺序表的基本运算:初始化、插入、删除、求表的长度、判空、释放。 (1)从键盘输入数据到数组; (2)用数组的数据创建顺序表; (3)输出顺序表L; (4)输出顺序表L的长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入‘f’元素; (9)输出顺序表L; (10)删除L的第3个元素; (11)输出顺序表L; (12)释放顺序表L。 package sss; import java.util.*; import java.util.Scanner; import java.util.ArrayList; public class Qllll { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a=in.nextInt(); String string=""; while(in.hasNextLine()){ String s=in.nextLine(); if(s.equals("\n")){ in.close(); break; }else{ string=string+s; } } ArrayList list =new ArrayList(); char[] ar = string.toCharArray(); char []sc=new char[a]; int n=0; for(int i=0;i<a;i++) { sc[i]=ar[n]; n=n+2; } System.out.println(ar); for(int i=0;i<a;i++) { list.add(sc[i]); } for(Object obj : list) { System.out.print(obj); } System.out.println(); System.out.println(list.size()); if(list.isEmpty()); else{ System.out.println("no"); } System.out.println(list.get(2)); System.out.println(list.indexOf('a')+1); list.add(3,'f'); for(Object obj : list) { System.out.print(obj); } System.out.println(); list.remove(2); for(Object obj : list) { System.out.print(obj); } } }输入字符窜的时候输入换行不能结束输入为什么

图的广度优先遍历问题求教

该程序运用邻接矩阵创建图,运行后没有出现图的广度优先遍历的结果的打印。。。请大神帮忙看看我写的广度优先遍历算法哪里出现了问题,万分感激! #include "stdafx.h" #include <iostream.h> #include <conio.h> #include <stdio.h> #include <queue> using namespace std; void EnQueue_Sq( queue<int> &Q , int v ) { Q.push( v ); } int DeQueue_SQ( queue<int> &Q ) { int i = Q.front(); Q.pop(); return i; } //1、邻接矩阵 #define VexType char #define EdgeType int #define INFINITY INT_MAX // 最大值∞ #define Max_Vertex_Num 10 // 最大顶点个数 bool visited[ Max_Vertex_Num ];//辅助数组--遍历使用 struct MGraph{ VexType vexs[ Max_Vertex_Num ]; //顶点数组 EdgeType edges[ Max_Vertex_Num ][ Max_Vertex_Num ];//邻接矩阵 int vexnum; //当前顶点数 int edgenum; //当前边数 //GraphKind kind;//图的种类标志,本练习假定图为无向带权图(即 无向网) }; void DSF_MG( const MGraph &G , int v ); void BFS_MG( const MGraph &G , int v ); /////////////////////////////算法实现///////////////////////////////////// //一、邻接矩阵操作的实现 //1、 创建图 void CreateGraph_MG( MGraph &G )//构造一个具有n个顶点,e条边的无向网(注意:输入必须准确,算法中没有判断非法输入!) { cout<<"请分别输入顶点数目和边的数目:"; cin>>G.vexnum>>G.edgenum; int n = G.vexnum; int e = G.edgenum; int i , j; for (i = 0 ; i < n ; i ++ ) { cout<<"请输入第"<<i<<"个顶点的信息:"; cin>>G.vexs[ i ]; } //初始化邻接矩阵 for ( i = 0 ; i < n ; i ++ ) for ( j = 0 ; j < n ; j ++ ) { G.edges[i][j] = INFINITY; } for ( i = 0 ; i < e ; i ++ ) { int beginNode , endNode; cout<<"请输入第"<<i<<"条边的第一个顶点的编号(从0开始):"; cin>>beginNode; cout<<"请输入第"<<i<<"条边的第二个顶点的编号(从0开始):"; cin>>endNode; cout<<"请输入第"<<i<<"条边的权值(注意为非0值):"; cin>>G.edges[beginNode][endNode]; G.edges[endNode][beginNode] = G.edges[beginNode][endNode]; } //输出图的信息 cout<<"输入完毕!"<<endl; cout<<"顶点数组:["; for (i = 0 ; i < n ; i ++ ) { cout<<G.vexs[ i ]<<" "; } cout<<"]"<<endl; cout<<"邻接矩阵:"<<endl; for ( i = 0 ; i < n ; i ++ ) { for ( j = 0 ; j < n ; j ++ ) { if( G.edges[ i ][ j ] != INFINITY ) printf( "%5d" , G.edges[i][j] ); else printf( "%5c" , '-'); //cout<<G.edges[i][j]<<" "; } //cout<<endl; printf( "\n" ); } } //2、求邻接结点及其度 void Dsp_ArjNodes_MG( const MGraph &G , int v )//输出第v个顶点的所有邻接点信息以及该结点的度(注意i不在取值范围内应提示错误信息) { if(v>=G.vexnum) cout<<"ERROR"<<endl; int count = 0; for(int i=0;i<G.vexnum;i++) { if(G.edges[v-1][i]!=INFINITY){ cout<<"临界结点有"<<i<<endl; count++; } } cout<<"该点的度为"<<count<<endl; } //3、找邻接点 int FirstAdjVex( const MGraph &G , int v )//找到顶点v(v为顶点的index)的第一个邻接点并返回该邻接点的index,如果不存在邻接点,则返回-1 { int j,p=-1,found=1; for(j=0;((j<G.vexnum)&&(found==1));j++) if(G.edges[v][j]!=INFINITY) { p=j; found=0; } return p; } //4、找下一个邻接点 int NextAdjVex( const MGraph &G , int v , int w )//v是G的某个顶点,w是v的一个邻接点,返回v(相对于w)的下一个邻接点(邻接点的index),如果w已经是最后一个邻接点,则返回-1 { int j,p=-1,found=1; for(j=w+1;((j<G.vexnum)&&(found==1));j++) if(G.edges[v][j]!=INFINITY) { p=j; found=0; } return p; } //5、广度优先遍历(主调)--例子 void BFSTraverse_MG( const MGraph &G )//广度优先遍历图 { int v; for (v=0; v<G.vexnum; ++v) visited[v] = false; //初始化访问标志 //开始遍历过程: for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) BFS_MG( G , v ); } //6、以v为起点广度优先遍历(核心函数) void BFS_MG( const MGraph &G , int v )//以v为起点进行广度优先遍历 { queue<int> Q;//定义完队列Q(不需要执行InitQueue_SQ) EnQueue_Sq(Q, v); // v入队列 visited[v] = true; cout<<G.vexs[v]<<" "; while(!Q.empty ()) { int s = DeQueue_SQ( Q );// 队头元素出队 for(int w=FirstAdjVex(G,s);w!=INFINITY;w=NextAdjVex(G,s,w)) if ( !visited[w] ) { visited[w]=true; cout<<G.vexs[w]<<" "; EnQueue_Sq(Q, w); // 访问的顶点w入队列 } // if }//while } void main() { MGraph MG; CreateGraph_MG( MG ); // 打印顶点a的所有邻接点 Dsp_ArjNodes_MG( MG ,3); cout<<"输出广度优先遍历结果:"<<endl; BFSTraverse_MG( MG ); getch(); }

C语言问题(数据结构)

``` #include "stdio.h" typedef struct ArcNode{ /*单链表中的结点的类型*/ int adjvex; /*该边指向的顶点在顺序表中的位置*/ struct ArcNode *next; /*下一条边*/ }ArcNode; typedef struct VNode{ /*顶点类型*/ int data; /*顶点中的数据信息*/ ArcNode *firstarc; /*指向单链表,即指向第一条边*/ }VNode; int visited[5]={0,0,0,0,0}; CreatGraph(int n , VNode G[] ){ int i,e; ArcNode *p , *q; printf("Input the information of the vertex\n"); for(i=0;i<n;i++){ scanf("%d",&G[i]); G[i].firstarc = NULL; /*初始化第一条边为空*/ } for(i=0;i<n;i++){ printf("Creat the edges for the %dth vertex\n",i) ; scanf("%d",&e); while(e!=-1){ p = (ArcNode *)malloc(sizeof(ArcNode)); /*创建一条边*/ p->next = NULL; p->adjvex = e; if(G[i].firstarc == NULL) G[i].firstarc = p; /*i结点的第一条边*/ else q->next = p; /*下一条边*/ q = p; scanf("%d",&e); } } } ``` 这是邻接表的部分代码。为什么创建边时p要malloc(对应 p = (ArcNode *)malloc(sizeof(ArcNode)); ),而q直接用就行?

数据结构问题:一棵普通的树转化成二叉树,为什么输出的时候无法输出呢(是我转化没有成功吗)?

``` /* 树转换为二叉树 题目说明:建立一棵树,将其转化为二叉树,并给出该二叉树的先序遍历序列。 要求:树为任意输入,以孩子链表法存储,转换所得二叉树以二叉链表为存储结构。 */ #include <stdio.h> #include <stdlib.h> #define MAX_TREE_SIZE 100 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int TElemType; typedef int Status; #define OK 1 void visit(TElemType e) { printf("%d", e); } typedef struct CTNode { //孩子结点 int child; struct CTNode *next; }*ChildPtr; typedef struct { TElemType data;//结点值 ChildPtr firstchild; //孩子链表头指针 //可增设一个双亲的域,能方便地找到其双亲。int Parent; }CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; //建立顺序表头结构 int n, r; //结点数和根的位置 }CTree; typedef struct BTNode { int data; CTBox list[MAX_TREE_SIZE]; struct BTNode *lchild; struct BTNode *rchild;//兄弟结点 }BTNode; typedef struct { CTBox list[MAX_TREE_SIZE];//邻接表表头 int n;//结点个数 }Tree;//定义树 //--------------树的孩子链表存储表示------------------- Status CreateTree(CTree &T) { //构建一棵树 int i; printf("请输入结点数及根结点的位置下标:\n"); scanf("%d %d",&T.n, &T.r); printf("请输入各节点的值\n"); for(i = 0; i < T.n; ++i) { scanf("%d",&T.nodes[i].data); T.nodes[i].firstchild = NULL; } printf("创建每个结点的孩子结点...\n"); system("pause"); for(i =0; i < T.n; ++i) { printf("请输入位置为%d的结点的孩子个数(>=0)(有孩子则输入孩子们的位置,无则输入0):\n",i); int nChild=0; scanf("%d",&nChild); ChildPtr p=NULL; //p指向插入孩子位置的前一个位置 ChildPtr q=NULL; //q用于提示即将插入的新b孩子链表结点 for(int j = 0; j < nChild; ++j) { q= (ChildPtr)malloc(sizeof(struct CTNode));//为孩子的位置开辟一个空间 if(!q) exit(OVERFLOW); scanf("%d",&(q->child)); //将孩子链表结点置入位置值 q->next = NULL; if(j == 0)//将孩子链表头结点指向孩子链表第一个结点 { T.nodes[i].firstchild = q; } else { p->next = q; } p = q; } } return OK; } Status PrintChild(const ChildPtr &C) {//打印出结点的孩子 if(C) { ChildPtr p; p = C; while(p) { printf("[%d| ] ->",p->child); p = p->next; } printf("^"); //return TRUE; } else { printf("^"); //return FALSE; } } void PrintChildTree(const CTree &T)//输出树的结点及他们的孩子 { printf("\n位置%d为树的根%d\n\n", T.r, T.nodes[T.r].data); for(int i = 0; i < T.n; ++i) { printf("位置%d,结点值[%d| ] ->", i, T.nodes[i].data); PrintChild(T.nodes[i].firstchild); printf("\n"); } printf("---建立树成功----"); } //--------------树转化为二叉树-------------- ? void treeToBtree(Tree *t,BTNode *bt,int i) {//树转二叉树 if(t != NULL) { CTBox *p = &(t->list[i]); bt->list[i]= t->list[i];//二叉树的头结点等于树的头结点 ChildPtr b = p->firstchild;//该结点的孩子结点 BTNode *q = bt->lchild;//二叉树的左孩子结点 while(b)//把该层的树全部转为二叉树 { treeToBtree(t,q,b->child);//若该结点以及该结点的子孙结点转为二叉树 b = b->next;//指向树结点下一个孩子结点 q = q->rchild;//指向二叉树的右孩子结点 } } } void PrintAsTree(BTNode *T,int i) //显示转化结果 { int cnt; if (T!=NULL) { printf("转化后的二叉树:"); for (cnt=1; cnt<i; cnt++) //visit(T->data); printf("\n"); printf("位置%d,结点值[%d| ] ->", cnt, T->data); PrintAsTree(T->lchild, i+1); //遍历左孩子 PrintAsTree(T->rchild, i); //遍历右孩子 } } //---------------二叉树的先序遍历---------------- void PreOrder(BTNode *T) { if(T==NULL) return; else { printf("二叉树的先序遍历结果为:"); printf("%d--",T->data); PreOrder(T->lchild); PreOrder(T->rchild); } } int main() { CTree T; Tree *Y; BTNode *bt; ChildPtr C; int i; i=T.n; CreateTree(T); PrintChildTree(T);//输出普通树的结点值 PrintChild(C); //输出各结点的孩子结点值 treeToBtree(Y,bt,i);//树转化为二叉树 PrintAsTree(bt,i);//输出转化后的二叉树 PreOrder(bt); //输出二叉树的先序遍历序列 return 0; } ```

有向图,证明顶点数和完成时间

给出一个已经以邻接矩阵形式存储的有向图G =(V,E),证明是否存在具有入度n - 1的顶点,并且可以在O(n)时间内完成出度0,其中n是V中的顶点数。

求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?

程序是数据结构的图的存储和遍历实验,功能是输入一个无向图并将其转换成邻接矩阵,然后把邻接矩阵变成邻接表,最后深度优先遍历该邻接表生成树(VS2017): ``` #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #include<iostream> using namespace std; typedef int InfoType; #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info; //顶点其他信息 } VertexType; //顶点类型 typedef struct //图的定义 { char vexnum[MAXV]; int edges[MAXV][MAXV]; //邻接矩阵 int n, e; //顶点数,边数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph, *PGragh; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //边的节点结构类型 { int adjvex; //该边的终点位置 struct ANode *nextarc = NULL; //指向下一条边的指针 InfoType *info; //该边的相关信息,这里用于存放权值 } ArcNode; typedef int Vertex; typedef struct Vnode //邻接表头节点的类型 { Vertex data; //顶点信息 ArcNode *firstarc; //指向第一条边 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n, e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 void MatToList(MGraph *g, ALGraph *G) //将邻接矩阵g转换成邻接表G { int i, j; ArcNode *p; //G = (ALGraph *)malloc(sizeof(ALGraph)); for (i = 0; i<g->n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc = NULL; for (i = 0; i<g->n; i++) //检查邻接矩阵中每个元素 for (j = g->n - 1; j >= 0; j--) if (g->edges[i][j] != 0) //存在一条边 { p = (ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex = j; p->nextarc = G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc = p; } G->n = g->n; G->e = g->e; //return G; } void DispMat(MGraph *g) //输出邻接矩阵g { int i, j; for (i = 0; i<g->n; i++) { for (j = 0; j<g->n; j++) printf("%3d", g->edges[i][j]); printf("\n"); } } void DispAdj(ALGraph G) //输出邻接表G { int i; ArcNode *p; for (i = 0; i<G.n; i++) { p = G.adjlist[i].firstarc; printf("%3d: ",i); //cout << i << ":"; while (p != NULL) { //printf("%3d",p->adjvex); cout << p->adjvex << " "; p = p->nextarc; } printf("\n"); } } static int get_position(MGraph g, char ch) { int i; for (i = 0; i<g.n; i++) if (g.vexnum[i] == ch) return i; return -1; } //读取一个输入字符 static char read_char() { char ch; do { ch = getchar(); } while (!isLetter(ch)); return ch; } // 创建无向图 MGraph* create_graph() { char c1, c2; int vex, edge; int i, p1, p2; MGraph* pG; // 输入顶点数和边数 printf("输入顶点数和边数:"); scanf_s("%d%d", &vex, &edge); if (vex < 1 || edge < 1 || (edge >(vex * (vex - 1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG = (MGraph*)malloc(sizeof(MGraph))) == NULL) return NULL; memset(pG, 0, sizeof(MGraph)); // 初始化顶点数和边数 pG->n = vex; pG->e = edge; // 初始化"顶点" printf("输入各顶点名称:\n"); for (i = 0; i < pG->n; i++) { printf("vertex(%d): ", i); pG->vexnum[i] = read_char(); } // 初始化"边" for (i = 0; i < pG->e; i++) { // 读取边的起始顶点和结束顶点 printf("edge(%d):", i); c1 = read_char(); c2 = read_char(); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); if (p1 == -1 || p2 == -1) { printf("input error: invalid edge!\n"); free(pG); return NULL; } pG->edges[p1][p2] = 1; pG->edges[p2][p1] = 1; } return pG; } // 打印矩阵队列图 void print_graph(MGraph G) { int i, j; printf("Martix Graph:\n"); for (i = 0; i < G.n; i++) { for (j = 0; j < G.n; j++) printf("%d ", G.edges[i][j]); printf("\n"); } } //创建一个树的左子女,右兄弟结构 typedef struct node { int data; node *firstChild = NULL; node *nextSibling = NULL; }TreeNode, *BinTree; int visited[MAXV]; void Dfs(ALGraph G, int i, BinTree &T) { visited[i] = 1; bool first = true;//表示是否为当前节点第一个孩子 TreeNode *locat = new TreeNode;//同样是定位作用 while (G.adjlist[i].firstarc != NULL)//从此节点出发,访问邻接节点。 { if (visited[G.adjlist[i].firstarc->adjvex] == 0) { visited[G.adjlist[i].firstarc->adjvex] = 1; TreeNode *t = new TreeNode;//建立一颗小树 t->data = G.adjlist[i].firstarc->adjvex; if (first)//是当前节点第一个孩子 { T->nextSibling = t;//建立右孩子 first = false;//表示不是传进来的第一个孩子,则是孩子们的兄弟 } else { locat->nextSibling = t; } locat = t; Dfs(G, G.adjlist[i].firstarc->adjvex, t);//继续对小树找兄弟 } G.adjlist[i].firstarc = G.adjlist[i].firstarc->nextarc; } } void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } //建立图深度优先搜索森林 void DFSForest(ALGraph G, BinTree &T) { DFS_Traverse(G, T); } void Display(BinTree T) { if (T) { cout << T->data << ' '; Display(T->firstChild); Display(T->nextSibling); } } //以下主函数用作调试 int main() { //int i, j; MGraph* g, g1; ALGraph G; BinTree T; g = create_graph(); printf("\n"); printf(" 无向图G的邻接矩阵:\n"); DispMat(g); //G = (ALGraph *)malloc(sizeof(ALGraph)); //M = (ALGraph *)malloc(sizeof(ALGraph)); printf(" 图G的邻接矩阵转换成邻接表,顶点名称用编号表示:\n"); MatToList(g, &G); DispAdj(G); DFSForest(G, T); Display(T); system("pause"); } ``` 运行程序,输入顶点和边的信息,能够输出邻接矩阵和邻接表,但到了生成森林那一步就报异常: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292200_474721.png)![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292211_609361.png) 和同学研究了一下发现问题可能是出在执行到函数 ``` void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } ``` 的最后一个for中的Dfs(G,i,locat);这一句时出了问题,若在该处设置断点再重新运行程序并输入测试数据:![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292585_791337.png) 然后按F11逐行运行,就跳到了函数Dfs()那里: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292683_31577.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292709_126937.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292848_579112.png) 这时候按“继续”继续运行,到第二次循环时异常就出现了,请教大佬我应该如何修改这个程序,谢谢

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

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

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

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

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

学历低,无法胜任工作,大佬告诉你应该怎么做

微信上收到一位读者小涛的留言,大致的意思是自己只有高中学历,经过培训后找到了一份工作,但很难胜任,考虑要不要辞职找一份他能力可以胜任的实习工作。下面是他留言的一部分内容: 二哥,我是 2016 年高中毕业的,考上了大学但没去成,主要是因为当时家里经济条件不太允许。 打工了三年后想学一门技术,就去培训了。培训的学校比较垃圾,现在非常后悔没去正规一点的机构培训。 去年 11 月份来北京找到了一份工...

JVM内存结构和Java内存模型别再傻傻分不清了

JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。 JVM内存结构 JVM构成 说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下

和黑客斗争的 6 天!

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

Google 与微软的浏览器之争

浏览器再现“神仙打架”。整理 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从 IE 到 Chrome,再从 Chrome 到 Edge,微软与...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

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

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

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

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

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

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

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

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

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

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

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

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

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

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

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

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

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

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

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

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

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

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

面试:第十六章:Java中级开发(16k)

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

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

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

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

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

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

立即提问
相关内容推荐