c语言无向图邻接表

 参考:datastructs_and_algorithm/list_udg.c at master · wangkuiwu/datastructs_and_algorithm (github.com)

 参考:c语言实现无向图的邻接表储存_LiQiyao的博客-CSDN博客

#include<stdio.h>

#include<stdlib.h>

/* 最大顶点数 */
#define MAX_VERTEX_NUM 100

#define isLetter(a)  ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z')))



// 邻接表中链表中的结点

typedef struct ArcNode{

	int adjvex; //边所指向的另一个顶点的下标

	struct ArcNode *nextarc;  //指向表头结点的下一条边

}ArcNode;



// 邻接表中表的顶点

typedef struct VNode{

	char vertex; //顶点值

	ArcNode *firstarc; //指向第一条依附该顶点的边

}VNode, AdjList[MAX_VERTEX_NUM];



// 邻接表

typedef struct{

	AdjList adjlist; //顶点数组

	int vexnum; //无向图的顶点数
	int arcnum; //无向图的边数

}ALGraph;




/*
 * 读取一个输入字符
 */
static char read_char()
{
    char ch;

    do {
        ch = getchar();
    } while(!isLetter(ch));

    return ch;
}



/*
 * 返回顶点u在邻接表存储的无向图G中的位置(下标)
 * 如不存在则返回-1
 */
int LocateVex(ALGraph *G, char u)
{
    int i;

    for(i=0; i < G->vexnum; i++)
    {
        if( G->adjlist[i].vertex == u)
        {
            return i;
        }
    }

    return -1;
}



void CreateALGraph(ALGraph *G)
{
    ArcNode *p, *q;
    int i, j, k, x;

    char v1, v2;

    //输入顶点数与边数
    printf("输入无向图的顶点个数和边的数目(以空格隔开):");
    scanf("%d %d", &G->vexnum, &G->arcnum);

    printf("\n输入各个顶点值:\n");
    for(x = 0; x < G->vexnum; x++)
    {
        printf("顶点(%d): ", x);

        // 输入表头数组数据域的值
        G->adjlist[x].vertex = read_char();

        // 表头数组链域置空
        G->adjlist[x].firstarc = NULL;
    }

    k = 0;

    // 输入图中每一条边
    while( k < G->arcnum )
    {
        // 输入有边连接的顶点对
        printf("\n输入有边连接的顶点对\n");
        printf("边(%d): ", k+1);
        printf("输入边的顶点1:");

        v1 = read_char();

        printf("边(%d): ", k+1);
        printf("输入边的顶点2:");

        v2 = read_char();

        i = LocateVex(G, v1);
        j = LocateVex(G, v2);

        if( ( i == -1 ) || ( j == -1 ) )
        {
            printf("该边不存在,请重新输入\n");
        }
        else
        {
            // 边计数
            k++;

            // 申请空间,生成表结点
            p = (ArcNode *)malloc(sizeof(ArcNode));

            p->adjvex = j;

            // p指针指向当前顶点指向的结点
            p->nextarc = G->adjlist[i].firstarc;

            // 结点 j 插入第 i 个链表
            G->adjlist[i].firstarc = p;

            q = (ArcNode *)malloc(sizeof(ArcNode));

            q->adjvex = i;

            q->nextarc = G->adjlist[j].firstarc;

            // 结点 i 插入第 j 个链表
            G->adjlist[j].firstarc = q;

        }
    }
}



/*
 * 打印邻接表
 */
void PrintUDG(ALGraph G)
{
    int i;
    ArcNode *p;

    printf("\n打印无向图邻接表:\n");

	for(i = 0; i < G.vexnum; i++)
    {
		printf("%d(%c): ",i, G.adjlist[i].vertex);

		p = G.adjlist[i].firstarc;

		while( p != NULL)
        {
			printf("->%d(%c) ", p->adjvex, G.adjlist[p->adjvex].vertex);
			p = p->nextarc;
		}

		printf("\n");
    }
}



int main()
{
    ALGraph G;
	CreateALGraph(&G);
	PrintUDG(G);

    return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值