邻接矩阵and邻接表

邻接矩阵和邻接表运用的思想是一致的

     结构体中的定义大概分为三类  值   顶点个数  弧个数

      其中顶点和弧在程序中只进行循环时的一个标量操作    值顾名思义表示彼此直接的关系

        而邻接表定义结构体较为麻烦  主要在于在头结点上要定义链接后面表示关系结点的头结点


邻接矩阵和邻接表创建主要 有三步:

  1.初始化 :将其值域赋为初始值  链表则赋为NULL;

  2.找到链接的点 在顶点中的下标  及程序中的locatevertex函数;

  3.改变原有的初始化  及赋值或插入链接


邻接矩阵:

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 20
#define INTMAX 32767
typedef struct Node
{
	int arcs[MAXVEX][MAXVEX];
	char vex[MAXVEX];
	int vexnum;  //顶点个数
	int arxnum;  //边数或弧数
}AdjMatrix;


int locatevertex(AdjMatrix *G,char x)
{	
	int i;
	for(i=1;i<=G->vexnum;i++)
	{
		if(G->vex[i]==x)
			return i;
	}
	return 0;
}

void creat(AdjMatrix *G)
{
	int i,j,k,weight;
	char vex1,vex2;
	printf("请输入无向网的顶点数和边数:\n");
	scanf("%d%d",&G->vexnum,&G->arxnum);
	for(i=1;i<=G->vexnum;i++)
		for(j=1;j<=G->vexnum;j++)
			G->arcs[i][j]=INTMAX;
	printf("请输入无向网中%d个顶点:",G->arxnum);
	for(i=1;i<=G->vexnum;i++)
	{
		printf("NO.%d个顶点:顶点\n",i);
		flushall();
		scanf("%c",&G->vex[i]);
	}

	printf("请输入无向网中的边");
	for(k=1;k<=G->arxnum;k++)
	{
		printf("\nNO.%d条边:\n",k);
		flushall();
		vex1=getchar();
		i=locatevertex(G,vex1);
	//	flushall();
		vex2=getchar();
		j=locatevertex(G,vex2);
		printf("权值");
		scanf("%d",&weight);
		G->arcs[i][j]=weight;
		G->arcs[j][i]=weight;

	}
}

void print(AdjMatrix *G)
{
	int i,j;
	for(i=1;i<=G->vexnum;i++)
	{
		flushall();
		printf("%7c",G->vex[i]);
	}
	printf("\n");
	
	for(i=1;i<=G->vexnum;i++)
	{
		for(j=1;j<=G->vexnum;j++)
			printf("%7d",G->arcs[i][j]);
		printf("\n");	
	}
	
	
}

int main(void)
{
	AdjMatrix *G;
	G=(AdjMatrix *)malloc(sizeof(AdjMatrix));
	creat(G);
	print(G);
	return 0;
}


注:如若双向则进行两变改变操作

       在写邻接表时注意链表的开辟空间问题   及指针移动问题



邻接表:

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 20
typedef struct ArcNode
{
	int adjvex;		//连接的节点值的下标
//	int weight;		//权值
	struct ArcNode *next;

}ArcNode;

typedef struct VertexNode
{
	char vexdata;   //顶点
	ArcNode *first; //连接在顶点上第一个节点
}VertexNode;

typedef struct 
{
	VertexNode vertex[MAXVEX];
	int vexnum;   //顶点数
	int arcnum;   //弧个数
}AdjList;


int locatevertex(AdjList *G,char x)
{	
	int i;
	for(i=1;i<=G->vexnum;i++)
	{
		if(G->vertex[i].vexdata==x)
			return i;
	}
	return 0;
}

void InSert(ArcNode **first,int i)
{
	ArcNode *a,*s;
	a=(ArcNode *)malloc(sizeof(ArcNode));
	a->adjvex=i;
	s=*first;
	while(s->next!=NULL)
		s=s->next;
	s->next=a;
	a->next=NULL;
}

void CreatUDG (AdjList *G)
{
	int i,j,k;
	char v1,v2;
	printf("请输入顶点数和弧个数\n");
	scanf("%d%d",&G->vexnum,&G->arcnum);

	printf("请输入顶点\n");
	flushall();
	for(k=1;k<=G->vexnum;k++)
	{
		scanf("%c",&G->vertex[k].vexdata);
		G->vertex[k].first = (ArcNode *)malloc(sizeof(ArcNode));
		G->vertex[k].first->next=NULL;
	}
	printf("请输入弧关系\n");
	for(k=1;k<=G->arcnum;k++)
	{
		printf("NO:%d//%d:",k,G->arcnum);
		flushall();
		scanf("%c%c",&v1,&v2);
		i=locatevertex(G,v1);
		j=locatevertex(G,v2);
		InSert(&G->vertex[i].first,j);
		InSert(&G->vertex[j].first,i);
	}

}

print(AdjList *G)
{
	int i;
	ArcNode *s;
	for(i=1;i<=G->vexnum;i++)
	{
		flushall();
		printf("%4c",G->vertex[i].vexdata);
		s=G->vertex[i].first->next;
		while(s!=NULL)
		{
			printf("%4d",s->adjvex);
			s=s->next;
		}
		printf("\n");
	}
}


int main(void)
{
	AdjList *G;
	G=(AdjList *)malloc(sizeof(AdjList));
	CreatUDG(G);
	print(G);
	return 0;
}


发布了31 篇原创文章 · 获赞 9 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章