#include<stdio.h>
#include<stdlib.h>
#define M 20
typedef char DataType;
typedef struct node{
int adjvex;
struct node * next;
}EdgeNode;
typedef struct vnode{
DataType vertex;
EdgeNode *FirstEdge;
}VertexNode;
typedef struct{
VertexNode adjlist[M];
int n,e;
}LinkedGraph;
void creat(LinkedGraph *g,char *filename,int c){
int i,j,k;
EdgeNode *s;
FILE *fp;
fp=fopen(filename,"r");
if(fp){
fscanf(fp,"%d %d",&g->n,&g->e);
for(i=0;i<g->n;i++){
fscanf(fp,"%ls",&g->adjlist[i].vertex);
g->adjlist[i].FirstEdge=NULL;
}
for(k=0;k<g->e;k++){
fscanf(fp,"%d %d",&i,&j);
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=g->adjlist[i].FirstEdge;
g->adjlist[i].FirstEdge=s;
if(c==0){
fscanf(fp,"%d %d",&i,&j);
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=i;
s->next=g->adjlist[j].FirstEdge;
g->adjlist[j].FirstEdge=s;
}
}
fclose(fp);
}else{
g->n=0;
}
}
//
void print(LinkedGraph g){
EdgeNode *p; // 定义一个指向EdgeNode的指针p,用于遍历邻接表
int i; // 定义一个循环变量i
// 遍历图中的每一个顶点
for (i=0; i<g.n; i++){
printf("Vertex %d: %c\n", i, g.adjlist[i].vertex); // 打印当前顶点的编号和名称
// 遍历当前顶点的所有邻接边
p = g.adjlist[i].FirstEdge; // 将p指向当前顶点的第一个邻接边
while (p){ // 当p不为空时,表示还有邻接边未遍历
printf("-->%d\n", p->adjvex); // 打印邻接边的目标顶点编号
p = p->next; // 移动到下一个邻接边
}
}
}
//
void degree(LinkedGraph g){
EdgeNode *p; // 定义一个指向EdgeNode的指针p,用于遍历邻接表
int count; // 定义一个计数器,用于记录当前顶点的度
int i; // 定义一个循环变量i
// 遍历图中的每一个顶点
for (i=0;i<g.n;i++)
{
count=0; // 初始化计数器为0
// 遍历当前顶点的所有邻接边
p=g.adjlist[i].FirstEdge; // 将p指向当前顶点的第一个邻接边
while (p) // 当p不为空时,表示还有邻接边未遍历
{
count++; // 计数器加1
p=p->next; // 移动到下一个邻接边
}
// 打印当前顶点的编号和它的度
printf("D(%d)=%d\n",i,count);
}
}
int main(){
LinkedGraph g;
creat(&g,"g11.txt",0);
printf("\n The graph is:\n");
print(g);
degree(g);
return 0;
}
/*
A 连接到 B 和 C
B 连接到 A 和 D
C 连接到 A 和 D
D 连接到 B 和 C
顶点数量: 4
边数量: 6
顶点数据: A B C D
边信息:
A -> B
A -> C
B -> A
B -> D
C -> A
C -> D
D -> B
D -> C
*/
数据结构实验八第一题(李云清)
最新推荐文章于 2024-07-15 17:15:24 发布