數據結構的C實現_圖_鄰接表表示

//圖,用鄰接表表示
//編譯環境:Visual Studio 2008,win 32 console application
//ALGragh.c

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define MAX_VERTEX_NUM  10
#define QM 10 //隊列的最大元素個數
int visited[MAX_VERTEX_NUM];
typedef char VertexType;
typedef int InfoType;

//弧節點(邊節點)結構
typedef struct _ArcNode
{
int adjvex;//該弧所指向的頂點的位置
struct _ArcNode *nextarc;//指向下一條弧的指針
InfoType info;//信息,本例中爲弧的權重
}ArcNode;

//頂點表節點結構
typedef struct _VNode
{
int data;
ArcNode *firstarc;//邊表的頭指針
}VNode;

//圖的結構
typedef struct
{
VNode vertex[MAX_VERTEX_NUM];//表頭向量
int vexnum,arcnum;//當前的頂點數和弧數
}AdjList;
////////////////////定義隊列/////////////////////////
typedef struct
{
VertexType *base;
VertexType front,rear;
}SQueue;

////////////////////////////////////////////////////////////函數聲明/////////////////////////////
int CreateGragh(AdjList *G);
int LocateVex(AdjList *G,VertexType v);
void DispGragh(AdjList *G);
void BFS(AdjList *G,int v0);//廣度遍歷
void DFS(AdjList *G,int v0);//深度遍歷
///////////////////與隊列有關的聲明/////////////////////////////////
void InitQueue(SQueue *Q);
void EnQueue(SQueue *Q,int e);
int  QueueEmpty(SQueue *Q);
void DeQueue(SQueue *Q,int*e);
////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
int i;
AdjList *G;
G=(AdjList *)malloc(sizeof(AdjList));
CreateGragh(G);
DispGragh(G);
printf("廣度優先遍歷圖:\n");
BFS(G,0);
printf("\n");
for(i=0;i<G->vexnum;i++)
visited[i]=0;
printf("深度遍歷:\n");
DFS(G,0);
}

//用鄰接表創建圖
int CreateGragh(AdjList *G)
{
ArcNode *p;
int i,j,k,w;
printf("輸入頂點數和邊數:\n");
scanf_s("%d%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
{
G->vertex[i].firstarc=NULL;
G->vertex[i].data=i;//令表頭節點的數據爲其頂點號
}

for(k=0;k<G->arcnum;k++)
{
printf("輸入第%d個邊的兩個頂點號(從0開始)和其權值\n",k+1);
scanf_s("%d%d%d",&i,&j,&w);
//printf("這個邊是:%d---%d,權重%d\n",i,j,w);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=w;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;

p=(ArcNode *)malloc(sizeof(ArcNode));//無向圖
p->adjvex=i;
p->info=w;
p->nextarc=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;
}
return OK;
}


//給出頂點的值,返回頂點號
int LocateVex(AdjList *G,VertexType v)
{
int i;
for(i=0;i<G->vexnum;i++)
if(G->vertex[i].data==v)
return i;
return -1;
}


//
void DispGragh(AdjList *G)
{
ArcNode *p;
int i;
printf("\n\n");
printf("該圖的鄰接表爲:\n");
for(i=0;i<G->vexnum;i++)
{
p=G->vertex[i].firstarc;
printf("G->vertex[%d]=%d:",i,G->vertex[i].data);
while(p!=NULL)
{
printf("%d(權重%d)\t",p->adjvex,p->info);
p=p->nextarc;
}
printf("\n");//換行,輸出下一個表頭所連接的節點
}
}

//廣度優先遍歷
void BFS(AdjList *G,int v0)
{
SQueue Q;
int v,j;
ArcNode *w;
InitQueue(&Q);
printf("%d ",G->vertex[v0].data);
visited[v0]=1;
EnQueue(&Q,v0);
while(!QueueEmpty(&Q))
{
DeQueue(&Q,&v);
w=G->vertex[v].firstarc;
while(w!=NULL)
{
j=w->adjvex;
if(!visited[j])
{
printf("%d ",G->vertex[j].data);
visited[j]=1;
EnQueue(&Q,j);
}
w=w->nextarc;
}
}
for(j=0;j<G->vexnum;j++)
{
if(!visited[j])
BFS(G,j);//遍歷其他未訪問的頂點
}
}

//深度優先遍歷
void DFS(AdjList *G,int v0)
{
int j;
ArcNode *p=G->vertex[v0].firstarc;
printf("%d ",G->vertex[v0].data);
visited[v0]=1;
while(p!=NULL)
{
j=p->adjvex;
if(!visited[j])
DFS(G,j);
p=p->nextarc;
}
for(j=0;j<G->vexnum;j++)
{
if(!visited[j])
DFS(G,j);//遍歷其他未訪問的頂點
}

}
///////////////////////////////////////與隊列有關的操作/////////////////////////////////////////////////////////////
void InitQueue(SQueue *Q)
{
Q->base=(VertexType *)malloc(QM*sizeof(VertexType));
if(!Q->base)exit(0);
Q->front=Q->rear=0;
}

void EnQueue(SQueue *Q,int e)
{
if((Q->rear+1)%QM==Q->front) exit(0);
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%QM;
}

int QueueEmpty(SQueue *Q)
{
if(Q->front==Q->rear)
return 1;
return 0;
}

void DeQueue(SQueue *Q,int *e)
{
if(Q->front==Q->rear)exit(0);
*e=Q->base[Q->front];
Q->front=(Q->front+1)%QM;
}
///////////////////////////////////////////////////////////////////////////////////////////////////


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