图的邻接表存储结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《图的邻接表存储结构实验报告》1.需解决的的问题
利用邻接表存储结果,设计一种图。
2.数据结构的定义
typedef struct node
{//边表结点
int adj;//边表结点数据域
struct node *next;
}node;
typedef struct vnode
{//顶点表结点
char name[20];
node *fnext;
}vnode,AList[M];
typedef struct{
AList List;//邻接表
int v,e;//顶点树和边数
}*Graph;
3.程序的结构图
4.函数的功能
1)建立无向邻接表
Graph Create1( )//建立无向邻接表
{
Graph G;
int i,j,k;
node *s;
G=malloc(M*sizeof(vnode));
printf("输入图的顶点数和边数:");
scanf("%d%d",&G->v,&G->e);//读入顶点数和边数
for(i=0;i
{ printf("请输入图第%d个元素:",i+1);
scanf("%s",&G->List[i].name);//读入顶点信息
G->List[i].fnext=NULL;//边表置为空表
}
for(k=0;k
{ printf("请输入边的两顶点序号:(从0考试)");
scanf("%d%d",&i,&j);//读入边(Vi,Vj)的顶点对序号
s=(node *)malloc(sizeof(node));//生成边表结点
s->adj=j;
s->next=G->List[i].fnext;
G->List[i].fnext=s;//将新结点*s插入顶点Vi的边表头部
s=(node *)malloc(sizeof(node));
s->adj=i;//邻接点序号为i
s->next=G->List[j].fnext;
G->List[j].fnext=s;// 将新结点*s插入顶点Vj的边表头部}
return G;
}
2)建立有向邻接图
Graph Create2() //有向邻接图
{
Graph G;
int i,j,k;
node *q;
G=malloc(M*sizeof(vnode));
printf("请输入顶点数和弧数:");
scanf("%d%d",&G->v,&G->e);
for (i=0;i
scanf("%s",&G->List[i].name); //读入顶点信息
G->List[i].fnext=NULL;
}
for (k=0;k
{ printf("请输入两顶点的序号:(从0开始)");
scanf("%d%d",&i,&j);
q=(node *)malloc(sizeof(node)); //生成新边表结点s
q->adj=j; //邻接点序号为j
q->next=G->List[i].fnext;
G->List[i].fnext=q;
}
return G;
}
3)输出无向图的邻接表
void Print1(Graph G)//输出无向图的邻接表
{
int i;
node *p;
printf("\n\t\t\t邻接表\n");
for(i=0;i
{ p=G->List[i].fnext;
printf("\t\t\t%d | %3s",i,G->List[i].name);
while(p)
{printf("->%d",p->adj);
p=p->next;
}
printf("\n");
}
}
4)输出个元素的度数
void Du(Graph G)//输出各元素的度数
{
int i,j;
node *p;
printf("\n\t\t\t各点度数\n");
for(i=0;i
{ p=G->List[i].fnext;
printf("\t\t\t顶点%2s的度为:",G->List[i].name);
j=0;
while(p)
{ j++;
p=p->next;}
printf("%d\n",j);
}
}
5)返回图结点在的序号
int LocateVex(Graph G,char *u)
{//初始条件:图G存在,u和G中顶点有相同的特征
//操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回-1 int i;
for(i=0;i
if(strcmp(u,G->List[i].name)==0)
return i;
return -1;
}
6)返回序号为v的图结点的值
char *VertexGet(Graph G,int v)
{
if(v>=G->v||v<0)
exit(0);
return G->List[v].name;
}
7)返回图结点v的第一个邻接顶点的序号
int FirstAdjVex(Graph G,char *v)
{//初始条件:图G存在,v是G中的某个顶点
//操作结果:返回v中第一个邻接顶点的序号。若顶点在G中没有邻接顶点//则返回-1
node *p;
int v1;
v1=LocateVex(G,v);
p=G->List[v1].fnext;
if(p)
return p->adj;
else
return -1;
}
8)找到图结点v的第二个邻接顶点的序号
void NextAdjVex(Graph G,char *v,char *w)
{//初始条件:图G存在,v是G中某个顶点,w是v得邻接点
//操作结果:输出v的(相对于w的)下一个邻接点的序号
node *p;
int v1,w1;
v1=LocateVex(G,v);
w1=LocateVex(G,w);
p=G->List[v1].fnext;
while(p&&p->adj!=w1)
p=p->next;
if(!p||!p->next)
printf("没有第二个邻接点!\n");
else
printf("第二个邻接点序号是:%d\n",p->next->adj);