图的邻接矩阵表示及其建立(无向图)

#include <stdio.h>

#include <stdlib.h>

typedef char VertexType;                //顶点类型应由用户定义

typedef int EdgeType;                   //边上的权值类型应由用户定义

#define MAXVEX  100             //最大顶点数,应由用户定义

#define INFINITY    65535       //用65535来代表无穷大

#define DEBUG

typedef struct

{

VertexType vexs[MAXVEX];            //顶点表

EdgeType   arc[MAXVEX][MAXVEX];         //邻接矩阵,可看作边

int numVertexes, numEdges;      //图中当前的顶点数和边数

}Graph;

//定位

int locates(Graph *g, char ch)

{

int i = 0;

for(i = 0; i < g->numVertexes; i++)

{

if(g->vexs[i] == ch)

{

break;

}

}

if(i >= g->numVertexes)

{

return -1;

}

return i;

}

//建立一个无向网图的邻接矩阵表示

void CreateGraph(Graph *g)

{

int i, j, k, w;

printf("输入顶点数和边数:\n");

scanf("%d %d", &(g->numVertexes), &(g->numEdges));

#ifdef DEBUG

printf("%d %d\n", g->numVertexes, g->numEdges);

#endif

for(i = 0; i < g->numVertexes; i++)

{

g->vexs[i] = getchar();

while(g->vexs[i] == '\n')

{

g->vexs[i] = getchar();

}

}

#ifdef DEBUG

for(i = 0; i < g->numVertexes; i++)

{

printf("%c ", g->vexs[i]);

}

printf("\n");

#endif

for(i = 0; i < g->numEdges; i++)

{

for(j = 0; j < g->numEdges; j++)

{

g->arc[i][j] = INFINITY; //邻接矩阵初始化

}

}

for(k = 0; k < g->numEdges; k++)

{

char p, q;

printf("输入边(vi,vj)上的顶点i,顶点j和权值:\n");

p = getchar();

while(p == '\n')

{

p = getchar();

}

q = getchar();

while(q == '\n')

{

q = getchar();

}

scanf("%d", &w);

int m = -1;

int n = -1;

m = locates(g, p);

n = locates(g, q);

if(n == -1 || m == -1)

{

fprintf(stderr, "there is no this vertex.\n");

return;

}

//getchar();

g->arc[m][n] = w;

g->arc[n][m] = g->arc[m][n];  //因为是无向图,矩阵对称

}

}

//打印图

void printGraph(Graph g)

{

int i, j;

for(i = 0; i < g.numVertexes; i++)

{

for(j = 0; j < g.numVertexes; j++)

{

printf("%d  ", g.arc[i][j]);

}

printf("\n");

}

}

int main(int argc, char **argv)

{

Graph g;

//邻接矩阵创建图

CreateGraph(&g);

printGraph(g);

return 0;

}

图的建立——邻接矩阵表示(C语言+VC6.0平台)的更多相关文章

  1. 图的建立——邻接表表示(C语言+VC6.0平台)

    图是一种重要而且相对复杂的数据结构,在实际编程中非常有用.邻接表是图的主要表示形式之一,是一种链接表表示方法. #include<stdio.h> #include<stdlib.h ...

  2. 常用排序算法之——快速排序(C语言+VC6.0平台)

    经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...

  3. 常用排序算法之——选择排序(C语言+VC6.0平台)

    选择排序是另一种经典排序算法,核心思想是:在一趟找最小(大)数的过程中,先假设待排数据中的第一个数据即为最小(大)数据,然后循环将其他数据与该数据比较,每次比较时若小于该数据则让新数据成为最小(大)数 ...

  4. 解决&quot;VC6.0的ClassView里不能显示类或成员变量&quot;问题

    VC6.0是微软1998年公布的,是一款非常经典的编辑器.然而它有几个非经常见的bug,比方, .cpp文件打不开,智能提示出现异常.这里介绍"VC6.0的ClassView里不能显示类或成 ...

  5. 基于visual Studio2013解决算法导论之054图的邻接矩阵表示

     题目 图的邻接矩阵表示 解决代码及点评 // 图的邻接矩阵表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <l ...

  6. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

  7. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  8. VC6.0建立控制台程序实现PDA应用

    作者:iamlaosong 由于须要,又写起了文本界面的程序,以便PDA通过telnet连上运行. 假设是Linuxserver的话.这是非常easy的事,但是用户server是windows ser ...

  9. 图->存储结构->邻接多重表

    文字描述 邻接多重表是无向图的另一种链式存储结构. 虽然邻接表是无向图的一种很有效的存储结构,在邻接表中容易求得顶点和边的各种信息. 但是,在邻接表中每一条边(vi,vj)有两个结点,分别在第i个和第 ...

随机推荐

  1. COJ 0343 WZJ的公司(二)

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=313 试题描述: WZJ的公司放假了!为了保证假期期间公司的安全,WZJ决定 ...

  2. 线段树解Insertion Sort Advanced Analysis

    题目出处 题意描述: 这个题目提问的是,在插入排序的序列给定的情况下,求最少需要移动的次数. 序列的长度n <=10^5 序列中的元素a[i] <=10^6 一组数据中case数t < ...

  3. java笔记12之面向对象初始

    1 概述 类:是一组相关的属性和行为的集合.是一个抽象的概念.     对象:是该类事物的具体表现形式.具体存在的个体. (1)面向对象思想     面向对象是基于面向过程的编程思想.         ...

  4. Ensures there will be no 'console is undefined' errors

    很早之前项目中遇到过这种bug, 当时没有多留意,只是暂时把笔记留了下来,今天整理笔记的时候,看到了,故先整理在此,具体用法下次遇到再好好理解理解.如果有筒子遇到过,麻烦留言说一下,先谢谢啦. //E ...

  5. NIO Socket非阻塞模式

    NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...

  6. [Angular 2] Using a Reducer to Change an Object's Property Inside an Array

    Reducers are also often used for changing a single property inside of other reducers. This lesson sh ...

  7. [Angular 2] Handling Clicks and Intervals Together with Merge

    Observable.merge allows you take two different source streams and use either one of them to make cha ...

  8. IPC进程间通信 - AIDL+Binder

      原理 http://www.linuxidc.com/Linux/2012-07/66195.htm   服务端,客户端处在用户空间,而binder驱动处在内核空间. 服务器端.一个Binder服 ...

  9. memcache和memcached

    一:Memcached.memcached.memcache. 其中首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储数据的“数据库” ...

  10. openvpn server部署笔记

    openvpn server 部署 1.准备 安装依赖 yum -y install gcc gcc-c++ openssl-devel openssl pam-devel 2.安装 lzo cd / ...