关于邻接表,我们不妨构建一个思路
首先定义头节点结构体将头节点存入一个列表;并且初始化头节点的列表结构体
如此构建函数并且输入邻接点储存然后打印
将边表也设置一个结构体,再构建一个头节点的结构体
再用结构体封装头节点结构体的数组,并且存入边数和顶点数;
下面是有关邻接表的构建和打印的代码
#include<stdio.h>
#include<iostream>
#include<malloc.h>
using namespace std;
#define MVNUM 100
typedef int edgetype;
typedef char vextype;
typedef struct Edgenode
{
edgetype adjvex;//邻接域下标
struct Edgenode *next;
//edgetype weight;//若有权值加上该条
}Edgnode;//邻接域
typedef struct Headvex
{
Edgnode * firstnode;
vextype data;
}Hedavex, ahead[MVNUM];//头节点
typedef struct
{
ahead head;//储存头节点的数组
int vexnum, arcnum;
}Headlist;
void creatlist(Headlist*G)
{
int i,j,k,v,a;
Edgnode *e;
cout << "输入顶点数和边数:";
cin >> G->vexnum >> G->arcnum;
cout << "存入顶点:";
for (v = 0; v < G->vexnum; v++)
{
cin >> G->head[v].data;
G->head[v].firstnode = NULL;
}//初始化邻接表
for (k = 0; k < G->arcnum; k++)
{
int listnum1, listnum2;//输入顶点表序号位置i,listnum2代表邻接的下标
cout << "输入顶点表位置和下标:";
cin >> listnum1 >> listnum2;
//cin>>w;
e = (Edgenode*)malloc(sizeof(Edgenode));
e->adjvex = listnum2 ;
//e->weight = w;
e->next = G->head[listnum1].firstnode;
G->head[listnum1].firstnode = e;
e = (Edgenode*)malloc(sizeof(Edgenode));//无向网没有出入度,故在listnum2连接listnum1
e->adjvex = listnum1;
e->next = G->head[listnum2].firstnode;
G->head[listnum2].firstnode = e;
}
}
void printlist(Headlist*G)
{
int i, j;
for (i = 0; i < G->vexnum; i++)
{
printf("%d->", i);
if(G->head[i].firstnode!=NULL)
{
while (G->head[i].firstnode != NULL)
{
printf("%d->", G->head[i].firstnode->adjvex);
G->head[i].firstnode = G->head[i].firstnode->next;
if (G->head[i].firstnode == NULL)
{
printf( "^");
}
}
printf("\n");
}
}
}
int main(void)
{
Headlist* TEST=(Headlist*)malloc(sizeof(Headlist));// 初始化结构体内存
creatlist(TEST);
printlist(TEST);
return 0;
}
例如下面是一个无向图,我们要让它在C语言中用邻接表打印,这边借用王卓老师上课的图为例子
这边运行邻接表的代码结果,结果可能会与之前的有所差别,但是运行结果的顺序不影响正确值