邻接表的有向网(C语言代码)

#include <stdio.h>
#include <stdlib.h>
#define MVNum 100       //最大顶点数
//边表结构体
typedef struct ArcNode {                		//表结点 
    int adjvex;                                    //邻接点的位置 
    struct ArcNode* nextarc;      //指向下一个表结点的指针 
    int info;//权值
}ArcNode;
//顶点结构体,其中 ArcNode* firstarc是指向边表结构体的指针
typedef struct VNode {
    char data;                    	            //顶点信息 
    ArcNode* firstarc;         //指向第一个表结点的指针 
}VNode, AdjList[MVNum];                 //AdjList表示邻接表类型 
//初始化顶点数,边数,以及指向顶点结构体
typedef struct {
    AdjList vertices;              //头结点数组
    int vexnum, arcnum;     //图的当前顶点数和边数 
}ALGraph;

void CreatMGraph(ALGraph* G);		/* 创建图 */
void printGraph(ALGraph G);			/*输出图 */

int main()
{
    ALGraph G;
    CreatMGraph(&G);
    printGraph(G);
    return 0;
}
void CreatMGraph(ALGraph* G)
{
    int i, j, k,w;
    ArcNode* s;
    printf("请输入顶点总数+边数\n");
    scanf("%d%d", &G->vexnum, &G->arcnum); 	//输入总顶点数,总边数 
    getchar();//吸收scanf残留的换行符
    printf("请输入顶点数的顶点有哪些\n");
    for (i = 0; i < G->vexnum; i++) 
    {   			                         //输入各点,构造表头节点表 
        scanf("%c", &G->vertices[i].data);  //输入顶点值 
    }
    for (i = 0; i < G->vexnum; i++) 
    {
        G->vertices[i].firstarc = NULL;   	//初始化表头节点的指针域为NULL 
    }
    for (k = 0; k < G->arcnum; k++) 
    {   
        printf("请输入边数(vi,vj)以及权值 info,一共有%d条边数\n", G->arcnum);  //输入各边,构造邻接表  
        scanf("%d%d%d ", &i, &j, &w);    			     //输入一条边的两个节点 
        s = (ArcNode*)malloc(sizeof(ArcNode));   // 生成一个新节点 
        s->adjvex = j;
        s->info = w;
        s->nextarc = G->vertices[i].firstarc;  //头插法建立新节点 
        G->vertices[i].firstarc = s;
    }
}
void printGraph(ALGraph G)
{
    int i, j;
    ArcNode* p;
    for (i = 0; i < G.vexnum; i++) 
    {
        printf("%c:", G.vertices[i].data);//打印顶点
        for (p = G.vertices[i].firstarc; p; p = p->nextarc)//打印顶点对应的边表结点
        {
            printf(" %d", p->info);
        }
        printf("\n");
    }
}

 终端输入内容:

请输入顶点总数+边数
6 10
请输入顶点数的顶点有哪些
012345
请输入边数(vi,vj)以及权值 info,一共有10条边数
0 1 5
请输入边数(vi,vj)以及权值 info,一共有10条边数
0 3 7
请输入边数(vi,vj)以及权值 info,一共有10条边数
1 2 4
请输入边数(vi,vj)以及权值 info,一共有10条边数
2 0 8
请输入边数(vi,vj)以及权值 info,一共有10条边数
2 5 9
请输入边数(vi,vj)以及权值 info,一共有10条边数
3 2 5
请输入边数(vi,vj)以及权值 info,一共有10条边数
3 5 6
请输入边数(vi,vj)以及权值 info,一共有10条边数
4 3 5
请输入边数(vi,vj)以及权值 info,一共有10条边数
5 4 1
请输入边数(vi,vj)以及权值 info,一共有10条边数
5 0 3
0: 7 5
1: 4
2: 9 8
3: 6 5
4: 5
5: 3 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值