(一)鄰接表圖文解析
鄰接表的結構比較複雜,包括頂點的存儲結構和邊的存儲結構;
頂點結點包括數據域和指針域,邊結點包括數據域、指針域和邊結點所指向的頂點位置;
其中頂點結點由一維數組儲存,每個頂點結點又以鏈棧的結構連接着邊結點;
圖的形式與鄰接表的形式:
(二)鄰接表代碼解析
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