《数据结构与算法》实验三报告//无向图邻接表的构建

机房号 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);
	}
}

五、运行输出结果:

程序运行进行构建无向图的邻接表并输出:

在这里插入图片描述

六、心得与体会:

发布了35 篇原创文章 · 获赞 1 · 访问量 1860

猜你喜欢

转载自blog.csdn.net/qq_40672635/article/details/90049961