鄰接矩陣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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章