鄰接矩陣和鄰接表運用的思想是一致的
結構體中的定義大概分爲三類 值 頂點個數 弧個數
其中頂點和弧在程序中只進行循環時的一個標量操作 值顧名思義表示彼此直接的關係
而鄰接表定義結構體較爲麻煩 主要在於在頭結點上要定義鏈接後面表示關係結點的頭結點
鄰接矩陣和鄰接表創建主要 有三步:
1.初始化 :將其值域賦爲初始值 鏈表則賦爲NULL;
2.找到鏈接的點 在頂點中的下標 及程序中的locatevertex函數;
3.改變原有的初始化 及賦值或插入鏈接
鄰接矩陣:
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 20
#define INTMAX 32767
typedef struct Node
{
int arcs[MAXVEX][MAXVEX];
char vex[MAXVEX];
int vexnum; //頂點個數
int arxnum; //邊數或弧數
}AdjMatrix;
int locatevertex(AdjMatrix *G,char x)
{
int i;
for(i=1;i<=G->vexnum;i++)
{
if(G->vex[i]==x)
return i;
}
return 0;
}
void creat(AdjMatrix *G)
{
int i,j,k,weight;
char vex1,vex2;
printf("請輸入無向網的頂點數和邊數:\n");
scanf("%d%d",&G->vexnum,&G->arxnum);
for(i=1;i<=G->vexnum;i++)
for(j=1;j<=G->vexnum;j++)
G->arcs[i][j]=INTMAX;
printf("請輸入無向網中%d個頂點:",G->arxnum);
for(i=1;i<=G->vexnum;i++)
{
printf("NO.%d個頂點:頂點\n",i);
flushall();
scanf("%c",&G->vex[i]);
}
printf("請輸入無向網中的邊");
for(k=1;k<=G->arxnum;k++)
{
printf("\nNO.%d條邊:\n",k);
flushall();
vex1=getchar();
i=locatevertex(G,vex1);
// flushall();
vex2=getchar();
j=locatevertex(G,vex2);
printf("權值");
scanf("%d",&weight);
G->arcs[i][j]=weight;
G->arcs[j][i]=weight;
}
}
void print(AdjMatrix *G)
{
int i,j;
for(i=1;i<=G->vexnum;i++)
{
flushall();
printf("%7c",G->vex[i]);
}
printf("\n");
for(i=1;i<=G->vexnum;i++)
{
for(j=1;j<=G->vexnum;j++)
printf("%7d",G->arcs[i][j]);
printf("\n");
}
}
int main(void)
{
AdjMatrix *G;
G=(AdjMatrix *)malloc(sizeof(AdjMatrix));
creat(G);
print(G);
return 0;
}
注:如若雙向則進行兩變改變操作
在寫鄰接表時注意鏈表的開闢空間問題 及指針移動問題
鄰接表:
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 20
typedef struct ArcNode
{
int adjvex; //連接的節點值的下標
// int weight; //權值
struct ArcNode *next;
}ArcNode;
typedef struct VertexNode
{
char vexdata; //頂點
ArcNode *first; //連接在頂點上第一個節點
}VertexNode;
typedef struct
{
VertexNode vertex[MAXVEX];
int vexnum; //頂點數
int arcnum; //弧個數
}AdjList;
int locatevertex(AdjList *G,char x)
{
int i;
for(i=1;i<=G->vexnum;i++)
{
if(G->vertex[i].vexdata==x)
return i;
}
return 0;
}
void InSert(ArcNode **first,int i)
{
ArcNode *a,*s;
a=(ArcNode *)malloc(sizeof(ArcNode));
a->adjvex=i;
s=*first;
while(s->next!=NULL)
s=s->next;
s->next=a;
a->next=NULL;
}
void CreatUDG (AdjList *G)
{
int i,j,k;
char v1,v2;
printf("請輸入頂點數和弧個數\n");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("請輸入頂點\n");
flushall();
for(k=1;k<=G->vexnum;k++)
{
scanf("%c",&G->vertex[k].vexdata);
G->vertex[k].first = (ArcNode *)malloc(sizeof(ArcNode));
G->vertex[k].first->next=NULL;
}
printf("請輸入弧關係\n");
for(k=1;k<=G->arcnum;k++)
{
printf("NO:%d//%d:",k,G->arcnum);
flushall();
scanf("%c%c",&v1,&v2);
i=locatevertex(G,v1);
j=locatevertex(G,v2);
InSert(&G->vertex[i].first,j);
InSert(&G->vertex[j].first,i);
}
}
print(AdjList *G)
{
int i;
ArcNode *s;
for(i=1;i<=G->vexnum;i++)
{
flushall();
printf("%4c",G->vertex[i].vexdata);
s=G->vertex[i].first->next;
while(s!=NULL)
{
printf("%4d",s->adjvex);
s=s->next;
}
printf("\n");
}
}
int main(void)
{
AdjList *G;
G=(AdjList *)malloc(sizeof(AdjList));
CreatUDG(G);
print(G);
return 0;
}