无向网的邻接表创建及遍历输出
1.代码部分
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct node
{
int num;//顶点邻接的顶点的下标
int weight;//边上的权重
struct node* next;//指向下一个边表元素的指针
}Arcnode;//边表的数据结构定义
//(包括当前节点邻接的节点的下标,指向下一个边表数据的指针,和一些其他数据,比如权值)
typedef struct
{
char data;//顶点数据
Arcnode* first;//指向边表的第一个元素的指针
}Vernode;//顶点表(结构体数组中结构体的定义)
typedef struct
{
int vexnumber;//顶点个数
int edgenumber;//边的个数
Vernode V[MAX];//顶点表
}Adjlist;//无向网的数据结构定义
void create_Adjlist(Adjlist* P);//创建无向网的邻接矩阵
void traverse_Adjlist(Adjlist* P);//遍历无向网的邻接矩阵
int main()
{
Adjlist P;
create_Adjlist(&P);
traverse_Adjlist(&P);
}
void create_Adjlist(Adjlist* P)
{
printf("输入根节点个数:");
scanf("%d", &P->vexnumber);
printf("输入边的条数:");
scanf("%d", &P->edgenumber);
int i;
for (i = 1; i <= P->vexnumber; i++)//依次存入所有顶点的数据(顶点表)
{
printf("输入第%d个根节点的数据:",i);
scanf(" %c", &(P->V[i].data));
P->V[i].first = NULL;//初始化顶点表指针为NULL
}
for (i = 0; i < P->edgenumber; i++)//建立边表(就是链表)
{
int v1, v2;
printf("输入两个邻接节点的下标:");
scanf("%d %d", &v1, &v2);
Arcnode* s;//向两个邻接的边表后插入一个节点,用来存储对方的相关数据
s = (Arcnode*)malloc(sizeof(Arcnode));
s->num = v1;
s->next = P->V[v2].first;
P->V[v2].first = s;//(头插法)
printf("输入边上的权值大小:");
scanf("%d", &s->weight);
Arcnode* t;//因为是无向网,所以两个顶点的后面都要插入
t = (Arcnode*)malloc(sizeof(Arcnode));
t->num =v2;
t->next = P->V[v1].first;
t->weight = s->weight;
P->V[v1].first = t;
}
}
void traverse_Adjlist(Adjlist* P)
{
int i;
printf(" 下标 数据\n");
for (i = 1; i <= P->vexnumber; i++)
{
printf("%4d %3c ->", i,P->V[i].data);//输出顶点表(下标和数据)
Arcnode* a = P->V[i].first;
while (a!= NULL)
{
printf("数据%c (下标%d) 权值%d ->", P->V[a->num].data,a->num,a->weight);//输出每个顶点后的边表
a = a->next;
}
printf("\n");
}
}
2.运行结果
3.思路
结构
整个邻接表是依靠链表实现的,分成三个部分,顶点表和边表,然后整个邻接表的结构体由顶点个数,边的个数,和一个顶点表;顶点表实际上就是一个结构体数组,结构体中包含顶点的数据,指向边表的第一个元素的指针;边表实际上就是一个一个的链表,链接在顶点表之后。
过程:
输入顶点的个数,边的个数,建立顶点表(依次输入顶点的数据),输入邻接的两个顶点的下标,建立边表(创建链接在顶点表之后的一条条链表)(因为是无向网,所以需要在两个顶点之后都插入一个节点,存放对方的数据)
具体过程参见代码中的注释