【資料結構】圖的構建(鄰接表法)
阿新 • • 發佈:2019-01-28
#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<<"圖構建成功!"; }