鄰接表-建立無向圖、無向網、有向圖、有向網
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
typedef int InfoType; /* 該弧相關資訊的指標型別 */
typedef char VertexType; /* 頂點的型別 */
typedef struct ArcNode /* 弧結點的結構 */
{
int adjvex; /* 該弧所指向的頂點的位置 */
struct ArcNode *nextarc; /* 指向下一條弧的指標 */
InfoType *info; /* 該弧相關資訊的指標(覺得應該是記錄某些備註資訊)如權值 */
}ArcNode;
typedef struct VNode /* 頂點結點的結構 */
{
VertexType data; /* 頂點資訊 */
ArcNode *firstarc; /* 指向第一條依附該頂點的弧的指標 */
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct /* 圖的鄰接表結構定義 */
{
AdjList vertices; /* 存放頂點的陣列 */
int vexnum, arcnum; /* 圖的當前頂點數和弧數 */
int kind; /* 圖的種類標誌 */
}ALGraph;
int CreateUDG(ALGraph &G) /* 鄰接表建立無向圖 */
{
int i,s,d;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 輸入結點數目和邊數 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 輸入頂點 */
{
scanf("%c",&G.vertices[i].data); /* 輸入頂點 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化為NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 輸入一條邊依附的起點序號和終點序號 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 儲存該弧所指向的頂點位置 */
q->adjvex = s; /* 儲存該弧所指向的頂點位置 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateUDN(ALGraph &G) /* 鄰接表建立無向網 */
{
int i,s,d,w;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 輸入結點數目和邊數 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 輸入頂點 */
{
scanf("%c",&G.vertices[i].data); /* 輸入頂點 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化為NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 輸入一條邊依附的起點序號和終點序號 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->info = (InfoType *)malloc(sizeof(InfoType));
q->info = (InfoType *)malloc(sizeof(InfoType));
p->adjvex = d; /* 儲存該弧所指向的頂點位置 */
q->adjvex = s; /* 儲存該弧所指向的頂點位置 */
*(p->info) = w; /* 儲存權值到一個結點裡 */
*(q->info) = w; /* 儲存權值到一個結點裡 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateDG(ALGraph &G) /* 鄰接表建立有向圖 */
{
int i,s,d;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 輸入結點數目和邊數 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 輸入頂點 */
{
scanf("%c",&G.vertices[i].data); /* 輸入頂點 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化為NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 輸入一條邊依附的起點序號和終點序號 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 儲存該弧所指向的終點位置 */
/* 這兩句程式碼相當於單鏈表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 儲存頂點所對應的終點位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int CreateDN(ALGraph &G) /* 鄰接表建立有向網 */
{
int i,s,d,w;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 輸入結點數目和邊數 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 輸入頂點 */
{
scanf("%c",&G.vertices[i].data); /* 輸入頂點 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化為NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 輸入一條邊依附的起點序號和終點序號 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 儲存該弧所指向的終點位置 */
p->info = (InfoType*)malloc(sizeof(InfoType));
*(p->info) = w;
/* 這兩句程式碼相當於單鏈表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 儲存頂點所對應的終點位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int PrintALGraphUDG(ALGraph *G) /* 列印無向圖每個結點的單鏈表 */
{
int i;
printf("列印無向圖/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
while(G->vertices[i].firstarc->nextarc != NULL)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%d/n",G->vertices[i].firstarc->adjvex);
}
return OK;
}
int PrintALGraphUDN(ALGraph *G) /* 列印無向網每個結點的單鏈表 */
{
int i, j;
printf("列印無向網/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc->nextarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
printf("------------------------------------------/n");
}
return OK;
}
int PrintALGraphDG(ALGraph *G) /* 列印有向圖每個結點的單鏈表 */
{
int i;
printf("列印有向圖/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
if(G->vertices[i].firstarc == NULL)
{
printf("/n");
continue;
}
while(G->vertices[i].firstarc)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("/n");
}
return OK;
}
int PrintALGraphDN(ALGraph *G) /* 列印有向網每個結點的單鏈表 */
{
int i, j;
printf("列印有向網/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex; /* 取得終點的位置 */
printf("%c",G->vertices[j].data);
printf("/tweight = %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
}
return OK;
}
void main()
{
ALGraph G;
//CreateUDG(G); /* 建立無向圖 */
//PrintALGraphUDG(&G); /* 列印無向圖 */
//CreateDG(G); /* 建立有向圖 */
//PrintALGraphDG(&G); /* 列印有向圖 */
//CreateUDN(G); /* 建立無向網 */
//PrintALGraphUDN(&G); /* 列印無向網 */
CreateDN(G); /* 建立有向網 */
PrintALGraphDN(&G); /* 列印有向網 */
}
圖 的測試資料為:5 4 a b c d e 1 2 1 3 1 5 4 5
網 的測試資料為:5 4 a b c d e 1 2 10 1 3 15 1 5 20 4 5 30
提示:貼上進控制檯按回車執行!