数据结构实验八第一题(李云清)

#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
*/

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值