邻接矩阵和邻接表运用的思想是一致的
结构体中的定义大概分为三类 值 顶点个数 弧个数
其中顶点和弧在程序中只进行循环时的一个标量操作 值顾名思义表示彼此直接的关系
而邻接表定义结构体较为麻烦 主要在于在头结点上要定义链接后面表示关系结点的头结点
邻接矩阵和邻接表创建主要 有三步:
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;
}