⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aja_list.c

📁 C++的电子教程
💻 C
字号:
//程序实例8_2
//图的邻接表表示
#include<stdio.h>
#include<stdlib.h>
#define Max 50

typedef struct e_node               //定义边结点的数据类型
{	int adjvex;
	int weight;
	struct e_node *next;
}E_node;

typedef struct v_node              //定义顶点结点的数据类型
{	int vertex;
	E_node *link;
}V_node;

V_node head[Max];                  //定义顶点结点的数组

//邻接表的建立
void adjl(V_node head[],int v[][2],int w[],int n,int e,int t)
{
	int i,k,m=0;
	E_node *p;

	for(i=1;i<=n;i++)       //顶点结点初始化
	{	head[i].link=NULL;	//////////////////////////////////
		head[i].vertex=i;   //顶点信息设为顶点编号
	}

	for(k=1;k<=e;k++)
	{
		p=(E_node *)malloc(sizeof(E_node));  //新结点存放w
		p->adjvex=v[m][1];    //终点为w的边结点链到第v个链表
		p->next=head[v[m][0]].link;
		head[v[m][0]].link=p;
		if(t==0)        //无向图
		{	
			p=(E_node *)malloc(sizeof(E_node));  //新结点存放v
			p->adjvex=v[m][0];  //终点为v的边结点链到第w个链表
			p->next=head[v[m][1]].link;
			head[v[m][1]].link=p;
		}
		if(t==2)        //带权有向图
			p->weight=w[m];   //赋权值

		m++;
	}
}

//输出邻接表
void Print(V_node head[],int n,int t)
{	int i;
	E_node *p;
	for(i=1;i<=n;i++)
	{	printf("\nhead[%d]",i);
		if(head[i].link)
		{	p=head[i].link;
			while(p)
			{	printf("->[%d]",p->adjvex);
			    if (t==2)      //带权有向图
					printf("[%d]",p->weight);  //输出权值
				p=p->next;
			}
		}
		printf("\n");
	}
	printf("\n");
}

//主函数
void main()
{
	int n,e,t;//无向图、有向图、带权有向图的t分别为0、1、2
	int d1[][2]={{1,2},{1,3},{1,5},{2,4},{2,6},{3,6},{5,6}};
	int d2[][2]={{1,2},{1,3},{2,4},{3,2},{4,6},{5,1},{6,3},{6,4},{6,5}};
	int d3[][2]={{1,2},{2,3},{2,5},{4,1},{4,3},{5,4}};
	int w[Max],w3[]={10,8,15,5,2,23};


	printf("\n图8.1.1无向图G1的邻接表:\n");
	n=6; e=7; t=0;
	adjl(head, d1, w, n, e, t);
	Print(head,n,t);

	printf("\n图8.1.2有向图G2的邻接表:\n");
	n=6; e=9; t=1;
	adjl(head,d2, w, n, e, t);
	Print(head,n,t);

	printf("\n图8.1.8带权有向图G3的邻接表:\n");
	n=5; e=6; t=2;
	adjl(head,d3, w3, n, e, t);
	Print(head,n,t);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -