图的邻接表存储(c语言实现)

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef int Datatype;
typedef struct Arcnode
{
	int adjvex ;
	struct Arcnode *next;
}Arconde;

typedef struct vernode
{
	Datatype vertex;
	Arcnode *firstedge;
}Vernode;

typedef struct Algraph
{
	Vernode adjlist[Maxsize];
	int vertexnum,arcnum;
	
}ALG;

typedef struct SeqQ
{
	int front,rear;
	Datatype data[Maxsize];
}SQ;



//2 完成图G的邻接表存储
void Iintgraph(ALG *G,int n,int e,Datatype a[])
{
	Arcnode *s;
	int i,j,k;
	G->vertexnum = n;
	G->arcnum = e;
	for(i=0;i<n;i++){
		G->adjlist[i].vertex = a[i];
		G->adjlist[i].firstedge = NULL;
	}
	for(k=0;k<e;k++){
		printf("请输入边依附的两个顶点:\n");
		scanf("%d,%d",&i,&j);
		s=(Arcnode *)malloc(sizeof(Arcnode));
		if(s==NULL){
			printf("内存盛情失败!\n");
			return ;
		}
		s->adjvex =j;
		s->next = G->adjlist[i].firstedge;
		G->adjlist[i].firstedge=s;
		
		//无向图的邻接表存储 
		s=(Arcnode *)malloc(sizeof(Arcnode));
		if(s==NULL){
			printf("内存盛情失败!\n");
			return ;
		}
		s->adjvex =i;
		s->next = G->adjlist[j].firstedge;
		G->adjlist[j].firstedge=s;
	}
}

//3输出邻接表信息
void Print(ALG *G){
	int i;
	Arcnode *p;
	for(i=0;i<G->vertexnum;i++){
		printf("顶点信息:%3d",G->adjlist[i].vertex);
		p=G->adjlist[i].firstedge;
		printf("邻接点");
		while(p!=NULL){
			printf("%3d",p->adjvex);
			p=p->next;
		}
		printf("\n");
	}
}  

//4完成深度广度等求解
int visited[Maxsize]={0};
void DFS(ALG *G,int v)
{
	int j;
	Arcnode *p;
	printf("%3d",G->adjlist[v].vertex);
	visited[v]=1;
	p=G->adjlist[v].firstedge;
	while(p!=NULL)
	{
		j=p->adjvex;
		if(p!=NULL && visited[j]==0)
			{
				DFS(G,j);
			}
		p=p->next;
	}

}

//广度优先遍历
void BFS(ALG *G,int v)
{
	SQ Q;
	Arcnode *p;
	int j;
	int visited[Maxsize]={0};
	Q.front=Q.rear =-1; //初始化队列,采用顺序表

	printf("%d",G->adjlist[v].vertex);
	visited[v]=1;

	//Q[++rear]=v;
	Q.rear=(Q.rear+1)%Maxsize;
	Q.data[Q.rear] = v;   //入队操作


	while(Q.front!=Q.rear)
	{
		//v==Q[++front];
		Q.front=(Q.front+1)%Maxsize;
		v=Q.data[Q.front];
		
		p=G->adjlist[v].firstedge;		//工作指针初始化
		while(p!=NULL)
		{
			j=p->adjvex;
			if(visited[j]==0){
				printf("%3d",G->adjlist[j].vertex);
				visited[j]=1;
			//	Q[++rear]=j;
				Q.rear=(Q.rear+1)%Maxsize;
				Q.data[Q.rear]=j;
			}
			p=p->next;
		}
	}
}




//主函数完成图的生命,顶点个数,边数的初始化
//顶点的初始化
int main()
{
	ALG G;
	int n,e,i;
	Datatype a[Maxsize];
	printf("请输入顶点的个数和边数:\n");
	scanf("%d,%d",&n,&e);
	if(n<0) 
		printf("顶点个数无效");
	else if(e<0 || e>n*(n-1)/2)
		printf("边数无效"); 
	else{
		printf("顶点初始化:\n");
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		Iintgraph(&G,n,e,a);
		printf("图G的邻接表存储如下:\n");
		Print(&G);
		printf("图G 的深度优先遍历:\n");
		DFS(&G,0);
		printf("\n");

		printf("图G 的广度优先遍历:\n");
		BFS(&G,0);
		printf("\n");
	} 
	
}

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值