有向图 十字链表的创建 - C语言

在这里插入图片描述
代码还是要求严格的输入操作,没有判错能力。见谅!
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 20

void Interrupt(void)//创建一个中断函数 
{
	while(1)//用于检测换行符,使函数脱离scanf的连续输出 
		if(getchar()=='\n')
			break;
} 

typedef struct ArcBox
{
	int tailvex,headvex;//该弧的尾和头顶点的位置 
	struct ArcBox *hlink,*tlink;//分别为弧头相同和弧尾相同的弧的链域 
	int weight;//权值 
}ArcBox;
typedef struct VexNode
{
	char data;//弧的名称 
	ArcBox *firstin,*firstout;//分别指向该顶点第一条入弧和出弧 
}VexNode;
typedef struct
{
	VexNode xlist[MAX_VERTEX_NUM];//表头向量 
	int vexnum,arcnum;//有向图的当前顶点数和弧数 
}OLGraph;

void CreateGraph(OLGraph &G)//图的创建 
{
	int i;//记录次数 
	printf("请输入顶点数和边数: ");
	scanf("%d %d",&G.vexnum,&G.arcnum);//顶点数和边数的赋值 
	Interrupt();//该函数用于检测并吸收换行符 
	for(i=0;i<G.vexnum;i++)//图的初始化,放在给定顶点之后可省去步骤 
	{
		G.xlist[i].firstin = NULL; 
		G.xlist[i].firstout = NULL;
	}
	printf("请输入顶点名称(连续输入):");
	for(i=0;i<G.vexnum;i++)//利用循环输入图中顶点名称 
		scanf("%c",&G.xlist[i].data);//第i个顶点的命名 
	Interrupt();//该函数用于检测并吸收换行符
	char b,c;//顶点变量 
	int w,j,k,l;//w为权值变量,j和k是用来记录次数的 
	ArcBox *p1,*p2;//创建两个野结点 
	for(i=0;i<G.arcnum;i++)//利用循环输入所有边的两个顶点和权值 
	{
		printf("请输入边的两个顶点和权值w:");
		scanf("%c %c %d",&b,&c,&w);//输入 
		Interrupt();//该函数用于检测并吸收换行符
		for(j=0;j<G.vexnum;j++)//该操作为书上的函数LocateVex操作 
		{
			if(G.xlist[j].data == b)//找到输入的顶点b的位置 
			break;
		}
		for(k=0;k<G.vexnum;k++)
		{
			if(G.xlist[k].data == c)//找到输入的顶点c的位置 
			break;
		}
		//出弧操作 
		p1 = (ArcBox*)malloc(sizeof(ArcBox));//申请空间 
		p1->hlink = p1->tlink = NULL;//初始化 
		p1->headvex = j;
		p1->tailvex = k;//尾位置和头位置的赋值 
		p1->weight = w;//权值赋值
		p1->hlink = G.xlist[j].firstout;//类似于头插法 
		G.xlist[j].firstout = p1;	//并使头结点永远放在第一位 
		//入弧操作
		if(G.xlist[k].firstin == NULL) 
			G.xlist[k].firstin = p1;
		else
		{
			p2 = G.xlist[k].firstin;
			while(p2->tlink != NULL)
				p2 = p2->tlink;
			p2->tlink = p1;
		}
	}
}

void InputGraph(OLGraph G)//十字链表的输出 
{
	int i,j;//记录次数 
	ArcBox *p;//用于遍历链表 
	printf("十字链表为:\n");
	//为了能验证创建的图是否正确,分别输出顶点的入弧和出弧 
	//出弧 
	for(i=0;i<G.vexnum;i++)//利用循环输出 
	{
		printf("%c",G.xlist[i].data);
		p = G.xlist[i].firstout;
		while(p)//当p为空时,结束循环 
		{
			printf(" -[%d]-> %d-%d",p->weight,p->headvex,p->tailvex);
			p = p->hlink;//p指向p的下一个结点 
		}	
		printf("\n");
	}
	//入弧 
	for(i=0;i<G.vexnum;i++)//利用循环输出 
	{
		printf("%c",G.xlist[i].data);
		p = G.xlist[i].firstin;
		while(p)//当p为空时,结束循环 
		{
			printf(" <-[%d]- %d-%d",p->weight,p->headvex,p->tailvex);
			p = p->tlink;//p指向p的下一个结点 
		}	
		printf("\n");
	}
}

int main()
{
	OLGraph G;
	CreateGraph(G);//图的创建 
	InputGraph(G);//图的输出 
	return 0;
} 

代码结果演示:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值