图的生成—数据结构(c语言)

#include <stdio.h>
#include <stdlib.h>

#define INFINTTY 32767
#define MAX_VERTEX_NUM 100
#define N 100
typedef enum {DG,DN,UDG,UDN}GraphKind;

typedef struct ArcCell{
    int  adj;
    struct ArcCell *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vis[MAX_VERTEX_NUM];
typedef struct{
    int  vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum, arcnum;
}MGraph;
typedef struct Node{
    int data;
    struct Node *next;
}Qnode, *QueuePtr;
typedef struct Queue{
    Qnode *front;
    Qnode *rear;
}LinkQueue;
void InitQueue(LinkQueue *Q)
{
	Q->front=Q->rear=(Qnode*)malloc(sizeof(Qnode));
	if(!Q->front)
		exit(0);
	Q->front->next=NULL;
}
void PushQueue(LinkQueue *q, int  e)
{
	Qnode* p = (Qnode*)malloc(sizeof(Qnode));
	if (!p)
	{
		exit(0);
	}
	p->data = e;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
}
void DetQueue(LinkQueue *q, int  *e)
{
	if (q->front == q->rear)
	{
		exit(0);
	}
	Qnode *p = q->front->next;
	e = p->data;
	q->front->next = p->next;
	if (q->rear == p)
	{
		q->rear = q->front;
	}
	free(p);
}
int QueueEmpty(LinkQueue *q)
{
	if (q->front == q->rear)
		return 0;
	else
		return 1;
}
void BFSTraverse(MGraph *G)
{
	int k, i, m = 8;
	LinkQueue Q;
	InitQueue(&Q);
	for ( i = 0; i < G->vexnum; i++)
	{
		vis[i] = 0;
	}
	for ( i = 0; i < G->vexnum; i++)
	{
		if (!vis[i])
		{
			vis[i] = 1;
            if(G->vexs[i] != m)
                printf("%d ", G->vexs[i]);
			PushQueue(&Q, i);
		}
		while (QueueEmpty(&Q))
		{
			DetQueue(&Q, k);
			int j;
			for (j = 0; j < G->vexnum; j++)
			{
				if (G->arcs[i][j].adj == 1 && !vis[j])
				{
					vis[j] = 1;
					if(G->vexs[j] != m)
                        printf("%d ", G->vexs[j]);
					PushQueue(&Q, j);
				}
			}
		}
	}
	printf("%d", m);
}
int LocateVertex(MGraph *G,int v)
{
	int j=0;
	int k;
	for(k=0;k<G->vexnum;k++)
	{
		if(G->vexs[k]==v)
		{
			j=k;
			break;
		}
	}
	return j;
}
void CreateUND(MGraph *G)
{
    int j, i, k;
    scanf("%d %d",&G->vexnum, &G->arcnum);
    for(i = 0; i < G->vexnum; i++)
    {
        scanf("%d", &G->vexs[i]);
    }
    for(i = 0; i < G->vexnum; i++)
    {
        for(j = 0; j < G->vexnum; j++)
        {
            G->arcs[i][j].adj = 0;
        }
    }
    for(k = 0; k < G->arcnum; k++)
    {
        int v1 , v2;
        scanf("%d %d",&v1, &v2);
        i = LocateVertex(G,v1);
        j = LocateVertex(G,v2);
        G->arcs[i][j].adj = 1;
        G->arcs[j][i].adj = G->arcs[i][j].adj;
    }
}
void CreateDG(MGraph *G)
{
    int j, i, k;
    scanf("%d %d",&G->vexnum, &G->arcnum);
    for(i = 0; i < G->vexnum; i++)
    {
        scanf("%d", &G->vexs[i]);
    }
    for(i = 0; i < G->vexnum; i++)
    {
        for(j = 0; j < G->vexnum; j++)
        {
            G->arcs[i][j].adj = 0;
        }
    }
    for(k = 0; k < G->arcnum; k++)
    {
        int v1 , v2;
        scanf("%d %d",&v1, &v2);
        i = LocateVertex(G,v1);
        j = LocateVertex(G,v2);
        G->arcs[i][j].adj = 1;
    }
}
void put(MGraph *G)
{
    int i, j;
    for(i = 0; i < G->vexnum; i++)
    {
        for(j = 0; j < G->vexnum; j++)
        {
            printf("%d",G->arcs[i][j].adj);
        }
        printf("\n");
    }
}
void DFS(MGraph *G, int i)
{
    int j;
    vis[i] = 1;
    printf("%d ", G->vexs[i]);
    for(j = 0; j < G->vexnum; j++)
    {
        if(G->arcs[i][j].adj == 1 && vis[j] == 0)
        {
            DFS(G,j);
        }
    }
}
void DFSTraverse(MGraph *G)
{
    int i;
    for(i = 0; i < G->vexnum; i++)
    {
        vis[i] == 0;
    }
    for(i = 0; i < G->vexnum; i++)
    {
        if(vis[i] == 0)
        {
            DFS(G,i);
        }
    }
}
void Cout(MGraph G)
{
	printf("The degree of each vertex: ");
	int i,j,s;
	for(i=0;i<G.vexnum;i++){
        s=0;
		for(j=0;j<G.vexnum;j++)
        {
			if(G.arcs[i][j].adj == 1)
                s++;
        }
        printf("%d: %d",G.vexs[i],s);
        if(i != G.vexnum-1)
            printf(", ");
	}
}
int main()
{
    MGraph G;
    int n;
    scanf("%d", &n);
    switch(n)
    {
        case 1: CreateDG(&G);printf("DG has been created successfully.\n");break;
        case 2: CreateDG(&G);printf("DN has been created successfully.\n");break;
        case 3: CreateUND(&G);printf("UDG has been created successfully.\n");break;
        case 4: CreateUND(&G);printf("UDN has been created successfully.\n");break;
    }
    printf("DFS traverse: ");
    DFSTraverse(&G);
    printf("\n");
    printf("BFS traverse: ");
    BFSTraverse(&G);
    printf("\n");
    Cout(G);
    return 0;
}

【输入形式】输入第一行为图的类型(1:DG;2:DN;3:UDG;4:UDN)、顶点数和边/弧数,以空格隔开 输入第二行为图中的顶点信息 输入第三 ~ 第(3+边/弧数-1)为图中边/弧的信息 【输出形式】输出第一行为图创建成功提示 输出第二行为深度优先遍历结果 输出第三行为广度优先遍历结果 输出第四行为每个结点的度的信息。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星纪@大梁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值