數據結構_圖—鄰接表(C語言)

(一)鄰接表圖文解析

鄰接表的結構比較複雜,包括頂點的存儲結構和邊的存儲結構;
頂點結點包括數據域和指針域,邊結點包括數據域、指針域和邊結點所指向的頂點位置;
其中頂點結點由一維數組儲存,每個頂點結點又以鏈棧的結構連接着邊結點;

在這裏插入圖片描述
圖的形式與鄰接表的形式:
在這裏插入圖片描述

(二)鄰接表代碼解析

2.1 鄰接表的存儲結構

typedef struct	EdgeNode	//邊結點
{
	int adjvex;				//鄰接點
	OtherInfo info;			//數據域,邊的權值
	struct EdgeNode *next;	//指針域,指向下一條邊	
}EdgeNode;

typedef struct				//頂點結點
{
	VerTexType data;		//數據域,頂點結點的數據
	EdgeNode *firstedge;	//指針域,指向對應的邊
}VextexNode,AdjList[MAXVEX];

typedef struct			
{
	AdjList adjList;		//存放頂點結點的數組
	int numNodes,numEdges;	//頂點數和邊數
}ALGraph;

2.2 鄰接表的創建

void  CreateALGraph(ALGraph &G)
{
	int i,j,k;
	OtherInfo w;
	printf("請輸入頂點數和邊數:");
	scanf("%d %d",&G.numNodes,&G.numEdges);

	for(i=0;i<G.numNodes;i++)//頂點結點
	{
		fflush(stdin);
		printf("請輸入第%d個頂點數據:",i+1);
		scanf("%c",&G.adjList[i].data);//輸入頂點結點數據
		G.adjList[i].firstedge=NULL;//初始化邊結點的指針爲空
	}
	
	for(k=0;k<G.numEdges;k++)//邊結點
	{
		printf("請輸入邊(vi,vj)上的頂點序號及權值:");
		scanf("%d %d %d",&i,&j,&w);
		EdgeNode *p1,*p2;//創建兩個新的邊結點

		p1=(EdgeNode *)malloc(sizeof(EdgeNode));//爲邊結點分配空間
		p1->adjvex=j;				//新邊結點所指向頂點的數組位置
		p1->next=G.adjList[i-1].firstedge;	//新邊結點p1插入頂點結點後
		G.adjList[i-1].firstedge=p1;		//新邊結點p1插入頂點結點後
		p1->info=w;//邊結點的權值
		
		//因爲爲無向圖,所以同時需要在相應頂點上接入相同權值的邊結點
		p2=(EdgeNode *)malloc(sizeof(EdgeNode));
		p2->adjvex=i;
		p2->next=G.adjList[j-1].firstedge;
		G.adjList[j-1].firstedge=p2;
		p2->info=w;
	}
}

2.3 鄰接表的遍歷

void TravelALGraph(ALGraph G)
{
	int i;
	EdgeNode *p;
	for(i=0;i<G.numNodes;i++)
	{
		p=G.adjList[i].firstedge;
		while(p)
		{
			printf("第%d個頂點(邊的權值:%d)-->第%d個頂點\n",i+1,p->info,p->adjvex);
			p=p->next;		
		}
		if(!p)
			printf("\n");
	}
}

2.4 鄰接表的查找

(三)源代碼及測試

3.1 源代碼

#include<stdio.h>
#include<malloc.h>

#define MAXVEX 100		

typedef int OtherInfo;	
typedef char VerTexType;	

typedef struct	EdgeNode	
{
	int adjvex;			
	OtherInfo info;			
	struct EdgeNode *next;	
}EdgeNode;

typedef struct			
{
	VerTexType data;		
	EdgeNode *firstedge;	
}VextexNode,AdjList[MAXVEX];

typedef struct			
{
	AdjList adjList;		
	int numNodes,numEdges;
}ALGraph;

void  CreateALGraph(ALGraph &G)
{
	int i,j,k;

	OtherInfo w;

	printf("請輸入頂點數和邊數:");
	scanf("%d %d",&G.numNodes,&G.numEdges);

	for(i=0;i<G.numNodes;i++)
	{
		fflush(stdin);
		printf("請輸入第%d個頂點數據:",i+1);
		scanf("%c",&G.adjList[i].data);
		G.adjList[i].firstedge=NULL;
	}
	
	for(k=0;k<G.numEdges;k++)
	{
		printf("請輸入邊(vi,vj)上的頂點序號及權值:");
		scanf("%d %d %d",&i,&j,&w);
		EdgeNode *p1,*p2;

		p1=(EdgeNode *)malloc(sizeof(EdgeNode));
		p1->adjvex=j;				
		p1->next=G.adjList[i-1].firstedge;
		G.adjList[i-1].firstedge=p1;
		p1->info=w;

		p2=(EdgeNode *)malloc(sizeof(EdgeNode));
		p2->adjvex=i;
		p2->next=G.adjList[j-1].firstedge;
		G.adjList[j-1].firstedge=p2;
		p2->info=w;
	}
}
void TravelALGraph(ALGraph G)
{
	int i;
	EdgeNode *p;
	for(i=0;i<G.numNodes;i++)
	{
		p=G.adjList[i].firstedge;
		while(p)
		{
			printf("第%d個頂點(邊的權值:%d)-->第%d個頂點\n",i+1,p->info,p->adjvex);
			p=p->next;		
		}
		if(!p)
			printf("\n");
	}
}
void LocateALGraph(ALGraph G)
{
	int i,j;
	EdgeNode *p;
	printf("請輸入頂點序號:");
	scanf("%d",&i);
	printf("該頂點信息爲:%c\n",G.adjList[i-1].data);

	printf("請輸入需要查找的邊的兩個頂點:");
	scanf("%d %d",&i,&j);
	p=G.adjList[i-1].firstedge;//從位置爲i-1的頂點出發
	while(p)//遍歷該頂點的所有邊
	{
		if(p->adjvex==j)//查找到連接着頂點位置爲j的邊
		{
			printf("該邊的權值爲:%d\n",p->info);
			break;
		}
		else
			p=p->next;
	}
}
int main()
{
	ALGraph G;	
	CreateALGraph(G);
	TravelALGraph(G);
	LocateALGraph(G);
	return 0;
}

3.2 測試結果

測試環境 : Windows 10
編譯軟件 : Visual C++ 6.0

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章