1. 程式人生 > >【資料結構】圖的構建(鄰接表法)

【資料結構】圖的構建(鄰接表法)

#include<iostream>
#include<string>
#include<queue>
using namespace std;
#define ERROR 1
#define MAX_VERTEX_NUM 100
typedef struct ArcNode{   //表(邊)節點,儲存邊資訊的結構體
	int adjvex;       //儲存與該邊相連的另一個節點的索引
	struct ArcNode *nextarc; //儲存與表頭節點相連的其他表節點的指標
	string info;             //儲存邊的資訊,例如權值
}ArcNode;

typedef struct VNode{<span style="white-space:pre">	</span>//儲存頭節點資訊的結構體
	char date;              //儲存頭節點包含的資料,例如頭節點的名字
	ArcNode * firstarc;      //指向連結串列的指標
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct{
	AdjList vertices;<span style="white-space:pre">	</span>//儲存頭節點的陣列<span style="white-space:pre">	</span> 
	int vexnum,arcnum;        //當前圖的vexnum頂點數和arcnum弧數
	int kind;<span style="white-space:pre">		</span>//圖的種類,
}ALGraph;

int LocateVex(ALGraph &G,char &v1)   //查詢節點V1在圖G的儲存節點陣列中的索引位置
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		if(G.vertices[i].date==v1) //如果陣列中有這個節點,返回該節點在陣列中的索引
			return i;
	}
	if(i>=G.vexnum)
		return ERROR;
	else 
		return 0;
}
//建立圖
void CreateDG(ALGraph &G)
{
	ArcNode *p,*q;
	char v1,v2;
	char v;
	int i,j,k,n;
	cout<<"請輸入圖的頂點數和弧數:"<<endl;
	cin>>G.vexnum; //輸入圖的頂點數量
	cin>>G.arcnum; //輸入圖的弧(邊)的數量
	cout<<"請輸入頂點:"<<endl;
	
	for(i=0;i<G.vexnum;i++) //建立頭結點
	{
		cin>>v;   //輸入頂點名字
		G.vertices[i].date=v;
		G.vertices[i].firstarc=NULL;
	}
	cout<<"請輸入弧尾和弧頭:";
	for(k=0;k<G.arcnum;k++) //建立邊,並連線頭結點
	{
		cin>>v1;  //v1為弧尾
		cin>>v2;   //v2為弧頭
		i=LocateVex(G,v1);j=LocateVex(G,v2);
		
		if(G.vertices[i].firstarc==NULL)  //如果連結串列為空新建一個表節點,讓頭節點的指標指向該表節點
		{
			p=(ArcNode *)new ArcNode;
			G.vertices[i].firstarc=p;
			q=G.vertices[i].firstarc;
		}
		else        //連結串列的插入
		{
			q=G.vertices[i].firstarc;//獲取頭結點的表頭指標
			for(n=0;n<G.arcnum;n++,q=q->nextarc)//將q指標移動至連結串列的尾巴處
			{
				if(!q->nextarc)
					break;
			}
			p=(ArcNode *)new ArcNode;
			q->nextarc=p; //將該邊(弧)加入到連結串列中
			q=q->nextarc;
		}
		q->adjvex=j;  //記錄弧頭的索引
		q->nextarc=NULL;	
	}
	cout<<"圖構建成功!";
}