【数据结构】用邻接表存储图的简单问题
#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);
}

用邻接表存储图,但是测试(将所建的邻接表打印在屏幕上)时出现以下非正常结果
求大佬指点迷津
图片说明

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号
假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 急急急紧急急急急急急急急急急急急急急急急急急急急急急
数据结构邻接表图的遍历运行时出错
#include "stdio.h" #include "stdlib.h" #include"string.h" #define MAX_VERTEX_NUM 20 #define MAXNAME 10 #define MAXQSIZE 100 typedef char VertexType[MAXNAME]; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; }ALGraph; typedef enum{ FALSE, TRUE }Boolean; Boolean visited[MAX_VERTEX_NUM]; void CreateGraph(ALGraph *G) { int i=0; char ch; ArcNode *p, *q; printf("请输入顶点数和边数(用空格隔开):\n"); scanf("%d %d",&G->vexnum,&G->arcnum); printf("请输入图的顶点:\n"); for(i=0;i<G->vexnum;i++) { scanf("%c", &G->vertices[i].data); G->vertices[i].firstarc=NULL; } for( i=0; i<G->vexnum; i++ ) { //存储图的边信息 printf("请输入顶点 %c 的邻接顶点:\n",G->vertices[i].data ); scanf("%c", &ch); while( '\n' != ch ) { p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = ch; q->nextarc = p; q = p; q->nextarc = NULL; scanf("%c", &ch); } } } int FirstAdjVex(ALGraph *G,int v) { if(G->vertices[v].firstarc) return G->vertices[v].firstarc->adjvex; else return -1; } int NextAdjVex(ALGraph *G,int v,int w) { ArcNode *p=G->vertices[v].firstarc; while(p->adjvex!=w) p=p->nextarc; if(p->nextarc) return p->nextarc->adjvex; else return -1; } void DFS(ALGraph *G,int v) { int w; visited[v]=TRUE; printf("%c",G->vertices[v].data); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!visited[w]) DFS(G,w); } void DFSGrahp(ALGraph *G) { int v; for(v=0;v<G->vexnum;v++) visited[v]=FALSE; for(v=0;v<G->vexnum;v++) if(!visited[v]) DFS(G,v); printf("\n"); } struct QNode { int data; struct QNode *next; }; typedef struct { QNode *front; QNode *rear; }LinkQueue; int QueueEmpty(LinkQueue Q) { if(Q.front->next==NULL) return 1; else return 0; } void EnQueue(LinkQueue Q, int k) { QNode * p=(QNode *)malloc(sizeof(QNode)); if(!p) exit(0); p->data=k; p->next=NULL; Q.rear->next=p; Q.rear=p; } void DeQueue(LinkQueue &Q,int &e) { QNode * p; if(Q.front==Q.rear) return ; p=Q.front->next; e=p->data; } void BFSGrahp(ALGraph *G) { int v,u,w; LinkQueue Q; for(v=0;v<G->vexnum;v++) visited[v]=FALSE; for(v=0;v<G->vexnum;v++) if(!visited[v]) { visited[v]=TRUE; printf("%c",G->vertices[v].data); EnQueue(Q,v); while(!QueueEmpty(Q)) { DeQueue(Q,u); for(w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w)) if(!visited[w]) { visited[w]=TRUE; printf("%c",G->vertices[w].data); EnQueue(Q,w); } } } } void print(ALGraph *G) { int v; for(v=0;v<G->vexnum;v++) { printf("%c ",G->vertices[v].data); } } void menu() { int num; ALGraph *G=(ALGraph*)malloc(sizeof(ALGraph)); while(1) { printf("\t\t\t 图的遍历\n\n"); printf("\t\t\t1 图的建立\n"); printf("\t\t\t2 深度优先遍历图\n"); printf("\t\t\t3 广度优先遍历图\n"); printf("\t\t\t4 显示顶点\n"); printf("\t\t\t5 结束:\n\n"); printf("\t\t 请选择1-5: "); scanf("%d",&num); switch(num) { case 1: CreateGraph(G); break; case 2: DFSGrahp(G); break; case 3: BFSGrahp(G); break; case 4: print(G); break; case 5: exit(0); default: printf("请输入1-5之间的数字"); } } } void main() { menu(); }![图片说明](https://img-ask.csdn.net/upload/201706/07/1496827842_356020.png)
数据结构图的深度优先搜索
用邻接表存储的无向图有n个顶点,e条边,进行深度优先搜索,时间复杂度为什么是O(n+e),而不是O(n+2e)呢。
数据结构图(用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; } ``` 结构体里也有指针,为什么可以执行?
无向图以邻接矩阵存储,请算法描述深度优先遍历该图的非递归算法
无向图以邻接矩阵存储,请算法描述深度优先遍历该图的非递归算法。哪位大神可以帮忙写具体点用栈怎么实现?谢谢了!![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/1.gif)
求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出
要求用数据结构 代码后面要有注释 底下的要求一个也不能漏 图的DFS遍历 要求: 1) 先任意创建一个图; 2) 图的DFS的递归和非递归算法的实现 3) 要求用邻接矩阵、邻接表两种结构存储实现
建立图的邻接表的问题,不知道问题出在哪,求解答
#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)
邻接表求起点与终点所有路径算法求优化
楼主写了一个求起点到终点的所有路径的算法,数据用邻接表链式结构,当节点数达到100多个时运行就很慢了,求一个更好的算法。 算法如下: ``` import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Stack; public class PathSearch { private GraphEntry[] graph; //邻接表 private int beginVertex; //起点站编号 private int endVertex; //终点站编号 List<ArrayList<Integer>> allPath = new ArrayList<ArrayList<Integer>>(); public PathSearch(GraphEntry[] graph,int beginVertex,int endVertex){ this.beginVertex=beginVertex; this.endVertex=endVertex; this.graph=graph; } public void makePathPrompt() { Stack<GraphEntry> stack = new Stack<GraphEntry>(); stack.push(graph[beginVertex]);//将起点入栈 graph[beginVertex].setFlag(true);//将起点标记为已搜索 ArrayList<Integer> path = new ArrayList<Integer>();//暂时存储搜索中的路径 path.add(beginVertex);//加入起点 Hashtable<Integer, List<Integer>> hasSearchTable = new Hashtable<Integer, List<Integer>>();//记录本节点已经遍历过的节点 hasSearchTable.put(beginVertex, new ArrayList<Integer>()); while(!stack.isEmpty()) { for(int i=0;i<stack.peek().size();i++) { int id = stack.peek().getItem(i);//当前节点的相邻节点ID GraphEntry ge = stack.peek();//当前节点 boolean isPop=false; //如果当前节点的相邻节点未被搜索过,且未从当前节点搜索过该相邻节点,则入栈 if(!graph[id].isFlag() && !hasSearchTable.get(ge.getId()).contains(id)) { stack.push(graph[id]); graph[id].setFlag(true); path.add(id); hasSearchTable.get(ge.getId()).add(id); if(!hasSearchTable.containsKey(id)) { hasSearchTable.put(id, new ArrayList<Integer>()); } //如果当前节点的相邻节点为终点,表示找到一条路径,并让当前节点出栈 if(id==endVertex) { allPath.add((ArrayList<Integer>) path.clone()); ge = stack.pop(); // hasSearchTable.get(ge.getId()).clear(); ge.setFlag(false); path.remove((Integer)ge.getId()); } break; } //如果当前节点没有未搜索过的相邻节点,则出栈 else if(i==stack.peek().size()-1 && graph[id].isFlag()) { isPop=true; ge = stack.pop(); ge.setFlag(false); hasSearchTable.get(ge.getId()).clear(); path.remove((Integer)ge.getId()); if(stack.isEmpty()) break; } else if(i==stack.peek().size()-1 && !isPop) { ge = stack.pop(); ge.setFlag(false); hasSearchTable.get(ge.getId()).clear(); path.remove((Integer)ge.getId()); if(stack.isEmpty()) break; } } } } public List<ArrayList<Integer>> getAllPath() { return allPath; } } ``` GraphEntry类如下: ``` import java.util.ArrayList; //邻接表类, 用于表示地铁线路图的数据结构。 class GraphEntry { private ArrayList<Integer> list; //相邻节点的ID private boolean flag;//是否被搜索标记 private int id;//当前节点ID public GraphEntry(){ list = new ArrayList<Integer>(); } public void insertItem(int id){ list.add(id); } public int getItem(int index){ return list.get(index); } public int size(){ return list.size(); } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getId() { return id; } public void setId(int id) { this.id = id; } } ``` 测试类如下: ``` import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import java.util.List; public class Main { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 Hashtable<Integer, List<Integer>> hashTable = new Hashtable<Integer, List<Integer>>(); hashTable.put(0, Arrays.asList(new Integer[]{1,12,13})); hashTable.put(1, Arrays.asList(new Integer[]{0,2,7,8})); hashTable.put(2, Arrays.asList(new Integer[]{1,3,8,14})); hashTable.put(3, Arrays.asList(new Integer[]{2,4,14,21})); hashTable.put(4, Arrays.asList(new Integer[]{3,15,21})); hashTable.put(5, Arrays.asList(new Integer[]{6,14,20})); hashTable.put(6, Arrays.asList(new Integer[]{5,7,13,14})); hashTable.put(7, Arrays.asList(new Integer[]{1,6,13,14})); hashTable.put(8, Arrays.asList(new Integer[]{1,2,9,17})); hashTable.put(9, Arrays.asList(new Integer[]{8,10,18,21})); hashTable.put(10, Arrays.asList(new Integer[]{9,18,19})); hashTable.put(11, Arrays.asList(new Integer[]{12,17})); hashTable.put(12, Arrays.asList(new Integer[]{0,11,17})); hashTable.put(13, Arrays.asList(new Integer[]{0,6,7,20})); hashTable.put(14, Arrays.asList(new Integer[]{2,3,5,6,7,15})); hashTable.put(15, Arrays.asList(new Integer[]{4,14,16})); hashTable.put(16, Arrays.asList(new Integer[]{15})); hashTable.put(17, Arrays.asList(new Integer[]{8,11,12,18})); hashTable.put(18, Arrays.asList(new Integer[]{9,10,17})); hashTable.put(19, Arrays.asList(new Integer[]{10,21})); hashTable.put(20, Arrays.asList(new Integer[]{5,13})); hashTable.put(21, Arrays.asList(new Integer[]{3,4,9,19})); GraphEntry [] graph=new GraphEntry[hashTable.size()]; for(Integer key : hashTable.keySet()) { GraphEntry ge = new GraphEntry(); ge.setId(key); for(Integer id:hashTable.get(key)) { ge.insertItem(id); } graph[key]=ge; } PathSearch ps = new PathSearch(graph, 10, 6); ps.makePathPrompt(); List<ArrayList<Integer>> allPath = ps.getAllPath(); int a=allPath.get(0).get(0); } } ```
小弟求大神解答:图论中的多边图是如何存储的?
现在在做社交网络影响力传播这块,遇到一个算法需要用C++实现,但涉及到了多边图(多重图), 我知道简单图一般用邻接矩阵或邻接表来存储,但是多边图(多重图)用什么数据结构来储存呢, 最好用c++帮我实现以下或者把关键代码发一下,谢谢了!
c++数据结构有向网相关问题
基于图的深度优先和广度优先搜索算法,分别设计算法判别以邻接表方式存储的有向图中是否存在有点Vi到Vj的路径
数据结构程序设计上机题
实验八 图 实验目的: 1. 掌握图的逻辑结构和存储结构; 2.掌握最小生成树算法,灵活应用图解决实际问题; 实验内容: 1. 利用邻接矩阵结构创建图并实现最小生成树算法。 实现要求: 1)正确定义图的邻接矩阵存储结构; 2)设计函数实现图的创建和打印输出; 3)设计函数实现Prim算法求最小生成树,要求打印输出Prim算法每一步的执行结果; 4)在主程序中调用函数实现图的创建、打印输出及求解最小生成树; 5)为方便程序调试,建议用函数实现将图写入文件及从文件读入图。
数据结构_考试题_求大神相助
![](https://img-ask.csdn.net/upload/201501/21/1421830891_832514.png) 图片说明](https://img-ask.csdn.net/upload/201501/21/1421830891_832514.png) A B c d E f g 试画出上图无向图的邻接表存储结构,并给出以定点A为出发点的深度优先遍历序列和广度优先遍历序列
跪求有向无环图所有可能的拓扑排序结果。感谢。
谢谢大家回答,LZ只会写一种排序,我设计的存储结构是邻接链表
有关的拓扑排序问题·
1.建立邻接表存储的图; 2.进行拓扑排序; 3.输出拓扑排序序列。 求完整过程
图的最短路径算法的实现
设计内容: 设计校园平面图,所含景点不少于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中。
如何求平面无向图的单眼回路(环路)
如下图 0-----1----2----3 \ | | / \ | | / \ | | / 4-----5 它的输出是3个回路(环路),分别是0-1-4;1-2-4-5和2-3-5 像0-1-2-5-4这种包含其他环的回路是不需要的 这个该怎样进行程序设计呢,求教! PS:对图数据的存储结构没有要求,可以邻接表,邻接矩阵,也可以是{(0,1),(0,4),(1,2),(1,4)……}这样支路端点的数组
数据结构问题:一棵普通的树转化成二叉树,为什么输出的时候无法输出呢(是我转化没有成功吗)?
``` /* 树转换为二叉树 题目说明:建立一棵树,将其转化为二叉树,并给出该二叉树的先序遍历序列。 要求:树为任意输入,以孩子链表法存储,转换所得二叉树以二叉链表为存储结构。 */ #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; } ```
用代码敲一下这个程序!!!!
用邻接矩阵存储一个有向图,写一算法计算出度为0的顶点个数,请各位大牛解答,急死了
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允许使用这...
相关热词 c# 为空 判断 委托 c#记事本颜色 c# 系统默认声音 js中调用c#方法参数 c#引入dll文件报错 c#根据名称实例化 c#从邮件服务器获取邮件 c# 保存文件夹 c#代码打包引用 c# 压缩效率
立即提问

相似问题

1
这个图的问题,使用邻接表的方法,怎么使用数据结构解决?
0
各位大神能看一下我这个邻接表的深度优先遍历错在哪了吗,为什么运行不出来?
1
自己初始化邻接表数据有问题 (注视是瞎写的)如果还有其他问题也请帮忙改一下
0
求帮助!C语言 图 邻接表文件怎么读取
1
数据结构采用邻接表算法实现KAMI问题,怎么实现的,采用的C语言
1
用C语言解决下面一个邻接表方面的算法的问题怎么实现的
3
C++ vector存邻接矩阵结构体
0
这个旅行商的问题困扰了很久了,用邻接表怎么实现的?采用C语言
0
用邻接表实现距离数组的存储的计算,用C语言的程序编写的方法如何解决
1
用数组表示法(邻接矩阵)和邻接表两种存储结构分别表示下面的无向图。
2
数据结构图(用C语言)当中为什么邻接表用结构体变量报错,用邻接矩阵不报错?
1
请教数据结构#邻接链表表示图?
1
数据结构问题:一棵普通的树转化成二叉树,为什么输出的时候无法输出呢(是我转化没有成功吗)?
1
有向图任意两顶点之间存在的双边,则删除shuang bi an
1
邻接表双向BFS算法数组越界问题
1
编程实现有向图的深度和广度优先遍历
0
用邻接矩阵创建有向网,求最小生成树,最短路径(c语言)。
0
CCPC2019-秦皇岛F HDU-6736为什么这个题目把前向星换成邻接表就能AC啊?
0
在Windows7 64位+VS2015上运行求解AOE网关键路径的算法,邻接表表示的AOE网提示网中有回路,邻接矩阵表示的AOE网显示正确的信息?使用的算法是一样的,两种方法的相关类的接口函数也一致,为什么会出现这种问题?
0
利用普利姆算法和克鲁斯卡尔算法实现最小生成树问题C语言或者C++语言实现