#include

#include

#include

#define MAX 100

typedef char DataType;

typedef int VectorRelationType;

typedef char VectorType;

typedef struct arcell

{

VectorRelationType adj;

//DataType * data;

}arcell, adjmatrix[MAX][MAX];

//邻接矩阵定义

typedef struct

{

VectorType vexs[MAX];

//顶点向量

adjmatrix

arcs; //邻接矩阵

int vexnum,

arcnum; //图的当前顶点数和边数

// GraphType kind;

}MGraph;

typedef struct ArcNode

{

int

adjvex; //邻接点在头结点数组中的位置(下标)

struct ArcNode * nextarc;

//指向下一个表结点

DataType * date;

}ArcNode;

//顶点结点

typedef struct VNode

{

VectorType vexdata;

ArcNode * firstarc;

}VNode, Adjlist[MAX];

//邻接表类型定义

typedef struct

{

Adjlist vexs;

int vexnum, arcnum;

//GraphType gtype;

}ALGraph;

//打印邻接表

void TraverseG(ALGraph G)

{

ArcNode * p;

int i;

printf("图的邻接表如下:\n");

for(i = 0; i

< G.vexnum; i++)

{

printf("%c ->", G.vexs[i].vexdata);

p = G.vexs[i].firstarc;

while(p)

{

printf("%d ->", p->adjvex);

p = p->nextarc;

}

printf("NULL\n");

}

}

//确定v在邻接矩阵中位置

int Locatevex(ALGraph * G, VectorType v)

{

int i;

for(i = 0; i

< G->vexnum; i++)

if(G->vexs[i].vexdata == v)

return (i);

return -1;

}

int locatevexM(MGraph * G, VectorType v)

{

int i;

for(i = 0; i

< G->vexnum; i++)

if(G->vexs[i] == v)

return (i);

return -1;

}

//建立邻接矩阵

void CreateMGraph(MGraph * G)

{

int i, j, k, w;

VectorType u, v;

printf("创建有向图的邻接矩阵\n");

printf("请输入当前的顶点数和弧数(vex

arc): \n");

fflush(stdin); //清空输入缓冲区,确保不影响后面的数据读取

scanf("%d %d",

&G->vexnum,

&G->arcnum);

for(i = 0; i

< G->vexnum; i++)

{

printf("请输入第%d个顶点(vertex): \n", i+1);

fflush(stdin);

scanf("%c", &G->vexs[i]);

}

for(i = 0; i

< G->vexnum; i++)

{

for(j = 0; j < G->vexnum; j++)

{

G->arcs[i][j].adj = 0;

}

}

for(k = 0; k

< G->arcnum; k++)

{

printf("请输入顶点和权值

fflush(stdin);

scanf("%c %c %d", &u, &v,

&w);

i = locatevexM(G, u);

j = locatevexM(G, v);

G->arcs[i][j].adj = w;

}

}

void CreateALGraph(ALGraph * G)

{

int i, j, k;

ArcNode * s;

char u, v;

printf("请输入当前顶点数和弧数(vex

arc):\n");

fflush(stdin);

scanf("%d %d",

&G->vexnum,

&G->arcnum);

printf("首先输入顶点:\n");

for(i = 0; i

< G->vexnum; i++)

{

printf("请输入顶点%d,回车输入下一个顶点\n", i);

fflush(stdin);

scanf("%c",

&(G->vexs[i].vexdata));

G->vexs[i].firstarc = NULL;

}

printf("接下来输入弧:\n");

for(k = 0; k

< G->arcnum; k++)

{

printf("请输入弧%d, 回车输入下一条弧\n", k);

fflush(stdin);

scanf("%c %c", &u, &v);

i = Locatevex(G, u);

j = Locatevex(G, v);

s = (ArcNode *)malloc(sizeof(ArcNode));

s->adjvex = j;

s->nextarc = G->vexs[i].firstarc;

G->vexs[i].firstarc = s;

}

}

void Print_MGraph(MGraph * G)

{

int i, j;

printf("\n");

printf("邻接矩阵输入如下: \n");

printf("[]");

for(i = 0; i

< G->vexnum; i++)

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

printf("\n");

for(i = 0; i

< G->vexnum; i++)

{

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

for(j = 0; j < G->vexnum; j++)

printf("%d ", G->arcs[i][j].adj);

printf("\n");

}

}

//邻接表转换为邻接矩阵

void list_to_mat(ALGraph * AG, MGraph * MG)

{

int i, j;

ArcNode * p;

MG->vexnum =

AG->vexnum;

for(i = 0; i

< AG->vexnum; i++)

{

for(j = 0; j < AG->vexnum; j++)

{

MG->arcs[i][j].adj = 0;

}

}

for(i = 0; i

< AG->vexnum; i++)

{

MG->vexs[i] =

AG->vexs[i].vexdata;

}

printf("图的顶点向量如下:\n");

for(i = 0; i

< AG->vexnum; i++)

{

printf("%d %c\n", i, MG->vexs[i]);

}

for(i = 0; i

< AG->vexnum; i++)

{

p = AG->vexs[i].firstarc;

while(p != NULL)

{

MG->arcs[i][p->adjvex].adj = 1;

p = p->nextarc;

}

}

}

void main()

{

MGraph MG;

ALGraph AG;

CreateALGraph(&AG);

TraverseG(AG);

list_to_mat(&AG, &MG);

Print_MGraph(&MG);

CreateMGraph(&MG);

Print_MGraph(&MG);

}

c语言邻接表的构建_c语言数据结构--图的邻接矩阵和邻接表操作的基本操作相关推荐

  1. 实现图的邻接矩阵和邻接表存储

    /** *    实验题目: *        实现图的邻接矩阵和邻接表存储 *    实验目的: *        领会图的两种主要存储结构和图基本运算算法设计 *    实验内容: *       ...

  2. 实现图的邻接矩阵和邻接表的存储

    十五,实现图的邻接矩阵和邻接表的存储 #include<stdio.h> #include<stdlib.h> #define max 100 #define INF 3276 ...

  3. c语言邻接表的构建_C++实现有向图邻接表的构建

    本文实例为大家分享了C++实现有向图邻接表的构建代码,供大家参考,具体内容如下 数据结构里面的一道基础题,分享下自己的写法,验证可跑. #include #include const int MAX ...

  4. 不同表结构数据迁移_C语言:数据结构-广义表的存储结构

    广义表相对于线性表﹑数组﹑串等线性结构是较为复杂的结构,其元素可以具有不同的结构(可以是原子,也可以是列表),通常采用链式结构存储广义表. (1)表头.表尾链式存储 链式结构中用结点储存列表中的数据元 ...

  5. c语言机票座位预定系统_C语言实现飞机订票系统

    问题描述与题目要求 问题描述: 假定某民航有M个航次的班机,每个航次都只到达一个地方.试为该机场售票处设计一个自动订票和退票系统,要求系统具有以下功能: (1) 订票:若该航次余票大于等于乘客订票数, ...

  6. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt

    第1章_C语言概述(vc环境如何运行c语言程序)[精选] C语言程序设计 授课对象:电子商务06 时间安排: 理论课(1-9周): 星期一 5-6节 9407D 星期三 5-6节 9410D 实验课( ...

  7. c语言string函数的用法_C语言基础| 指针和函数

    点击蓝字关注我们 指针和函数 栈帧:当函数被调用时,系统会在stack空间上申请一块内存,用来给函数提供空间,存储形参和局部变量(定义在函数内部的变量). 当函数调用结束时,这块内存空间会被自动释放( ...

  8. c程序设计语言 qsort,【程序设计基础_C语言】北理工的恶龙(附qsort范例)

    [程序设计基础_C语言]北理工的恶龙(附qsort实例) 北理工的恶龙(附qsort实例) 背景:最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集 ...

  9. c语言最小点对问题_C语言教程(一):程序开发理论基础!

    前言: 1.本系列教程适用于刚开始学习 C 语言的同学,或者初级开发者,或者想系统详细了解 C 语言的小伙伴. 2.本系列教程会从C语言基础到 C 语言高级语法,包含 C 语言所有系列. C语言简介 ...

最新文章

  1. SAP WM LT15不能取消二步法确认场景中只做过第一步确认的TO单
  2. ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
  3. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...
  4. Python-100例(7-8) 复制列表 打印乘法口诀
  5. 创建用户故事地图的步骤
  6. [读书笔记] - 《深度探索C++对象模型》第2章 构造函数语意学
  7. kafka jar包_和同事交流不会kafka怎么行,API奉上,不是大神也能编
  8. 2015.12.21 内存管理(memory management)
  9. C# 正则表达式 匹配IP地址
  10. 201571030139/201571030134 小学生四则运算软件结对编程
  11. GIMP基本功能和教程!
  12. 设置导航标题颜色以及导航条背景色
  13. 一个Android开发6年程序员的年终面试总结,2021无畏艰难险阻,迎风潇洒前行
  14. 一键加速GitHub、Pypi、DockerHub访问
  15. Redis 之 SessionCallback RedisCallback 使用
  16. Unity 游戏脚本
  17. 33-Figma-数据采集器使用方式-后裔采集器
  18. tkinter可视化天气查询
  19. 如何正确使用步道乐跑
  20. 【CodeForces】CF13C Sequence(配数学证明)

热门文章

  1. 你有遇到过MySQL因大小写敏感导致的问题吗
  2. tomcat的启动和窗体隐藏
  3. android studio 设置 ndk 路径
  4. implementation ‘com.zxy.android:recovery:
  5. nginx.pid failed (2: The system cannot find the file specified
  6. windows msys编译64位x264和ffmpeg
  7. 使用python中的socket实现服务器和客户端,并完成图片的传输
  8. python 安装opencv linux opencv 查看版本
  9. RedHat6.5网卡问题总结
  10. 前端到后端的整体流程介绍