机房号 10-414
姓名:
日期: 2018/12/22
程序名: 无向图邻接表的构建
实验内容: (三)无向图邻接表的构建
一、目的和要求(需求分析):
1、掌握邻接表的存储结构以及邻接表的建立和操作。
2、 构造一个无向图的邻接表,要求从键盘输入图的顶点数和图的边数,并显示所构造的邻接表)
实验拓展:1. 构建有向图的邻接表
2. 判断边是否存在
3. 求顶点的度数
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
一、程序结构
1.头文件
#include<stdio.h>
#include<stdlib.h>
#define lk 20
2.数据结构的定义和符号说明
typedef struct arcnode
{
int adjvex; //下一条边的顶点编号
struct arcnode * nextarc; //指向下一条边的指针
}ArcNode;
typedef struct vexnode
{
int vertex; //顶点编号
ArcNode *firstarc; //指向第一条边的指针
}AdjList[lk];
typedef struct GRA
{
AdjList adjlist;
int vexnum,arcnum; //顶点和边的个数
}Graph;
二、函数的功能定义
1.创建邻接表
void CreateList(Graph *GA,int a,int b)
2.插入相关边
void Insert(Graph *GA)
3.输出邻接表
void PrintGraph(Graph *GA)
4.主函数与界面
int main()
{
构建无向图邻接表
输出邻接表
}
三、程序思路
建立无向图的邻接表,输出邻接表。对于图中的每个顶点vi,该方法把所有邻接于vi 的顶点vj链成一个单链表,这个单链表就称为顶点vi的邻接表。邻接表中每个表结点均有2个域,其一是邻接点域(adjvex),用以存放与vi相邻接的顶点vj的序号;其二是链域(next),用来将邻接表的所有表结点链在一起。 并且为每个顶点vi的邻接表设置一个具有2个域的表头结点:一个是顶点域(vertex),用来存放顶点vi的信息;另一个是指针域(first),用于存入指向vi的邻接表中第一个表结点的头指针。
三、调试和运行程序过程中产生的问题及采取的措施:
调试过程中还是出现了一些拼写错误,经检查后都能及时修正。有些是语法设计上的小错误,比如一些参变量的初始值设置错误,使得程序调试出错。分析后纠正了这些结果,并尽量改进了算法的性能,减小时间复杂度。
通过这次实验,对无向图的存储方法有了更深刻的印象。
四、源程序及注释:
#include<stdio.h>
#include<stdlib.h>
#define vnum 10
typedef struct arcnode
{
int adjvex; /*下一条边的顶点编号*/
struct arcnode * next; /*指向下一条边的指针*/
}ArcNode;
typedef struct vexnode
{
int vertex; /*顶点编号*/
ArcNode *first; /*指向第一条边的指针*/
}AdjList[vnum];
typedef struct gp
{
AdjList adjlist;
int vexnum,arcnum; /*顶点和边的个数*/
}Graph;
//--------------------------------创建邻接表-------------------------------
void CreateList(Graph *GA,int a,int b)
{
int i;
GA->vexnum=a;
GA->arcnum=b;
for(i=0;i<GA->vexnum;i++)
{
GA->adjlist[i].vertex=i; /*初始化顶点信息*/
GA->adjlist[i].first=NULL; /*初始化i的第一个邻接点为NULL*/
}
}
//--------------------------------插入相关边--------------------------------
void Insert(Graph *GA)
{
ArcNode *p;
int i,j,k;
for(k=0;k<GA->arcnum;k++)
{
printf("请输入第%d条边:",k+1);
scanf("%d %d",&i,&j);
p=(ArcNode *)malloc(sizeof(ArcNode));/*生成j的表结点*/
p->adjvex=j;
p->next=GA->adjlist[i].first; /*将结点j链接到i的单链表中*/
GA->adjlist[i].first=p;
p=(ArcNode *)malloc(sizeof(ArcNode));/*生成i的表结点*/
p->adjvex=i;
p->next=GA->adjlist[j].first; /*将结点i链接到j的单链表中*/
GA->adjlist[j].first=p;
}
}
//-------------------------------输出邻接表------------------------------
void PrintGraph(Graph *GA)
{
printf("所生成邻接表如下:\n");
int i;
for(i=0;i<GA->vexnum;i++)
{
printf("v%d:",i);
while(GA->adjlist[i].first!=0)
{
printf("-->%d",GA->adjlist[i].first->adjvex);
GA->adjlist[i].first=GA->adjlist[i].first->next;
}
printf("\n");
}
printf("-----------------------------------\n");
}
//----------------------------------主函数----------------------------------
int main()
{
int a,b,s,i=1;
Graph GA;
while(i)
{
printf("\n建立无向图--0\n输出邻接表--1\n");
printf("按0或者1进行下一步\n");
scanf("%d",&i);
switch(i)
{
case 0:printf("-----------------------------------\n");
printf("请输入无向图的顶点数和边数:");
scanf("%d %d",&a,&b);
CreateList(&GA,a,b);
Insert(&GA);
break;
case 1: PrintGraph(&GA);
break;
}
printf("\n0:结束\n1:继续\n");
scanf("%d",&i);
}
}
五、运行输出结果:
程序运行进行构建无向图的邻接表并输出: