建立邻接表(分析)
存储各个点的信息:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 110
typedef struct graphhead{//表头(表的第一列)用来存各个顶点信息
int data;
struct node* next;
}List[max];//有多个顶点,所以用数组
存储各个点后继点信息:
struct node{//结构体节点,用来表示顶点的后继点的信息
int xuhao;//存后继点的序号(序号是用来找该后继点信息)
struct node* xuhaonext;//后继指针
};
邻接表的结构体:
struct graph{
int pnum,snum;//分别表示表中点的数量与边的数量
List list;//将表示各点信息的数组作成员可访问各个点的信息
};
查找点的序号:
int findxuhao(graph* g,int id)//查找序号,id为一个点的名字(信息),查找该点在list中所处的编号
{
for(int i=1;i<=g->pnum;i++)
{
if(id==g->list[i].data)return i;
}
return -1;
}
建立邻接表:
void create(graph* g)//创建邻接表
{
int start,end,n,m;
printf("输入节点数,边数:\n");
scanf("%d%d",&g->pnum,&g->snum);
for(int i=1;i<=g->pnum;i++)
{
printf("请输入第%d个顶点的信息:\n",i);
scanf("%d",&g->list[i].data);
g->list[i].next=NULL;
}
printf("请输入每条边的指向:\n");
for(int i=1;i<=g->snum;i++)
{
printf("第%d条边:\n",i);
scanf("%d%d",&start,&end);
m=findxuhao(g,start);
n=findxuhao(g,end);//查找指向点与被指向点的序号
if(m==-1||n==-1)printf("建立失败!\n");
node* p=(node*)malloc(sizeof(node));
p->xuhao=n;//头插法插入新建的指针
p->xuhaonext=g->list[m].next;
g->list[m].next=p;
}
}
打印出该点指向的链:
void PrintLink(graph* g ,node* xuhaonext) {//打印出该点指向的所有点
while (xuhaonext!= NULL) {
printf("%4d",g->list[xuhaonext->xuhao].data);
xuhaonext = xuhaonext->xuhaonext;
}
printf("\n");
}
打印出各个点:
void disp(graph* g) {//按序号顺序打印出各个点的信息
printf("邻接表:\n");
for (int i = 1; i <= g->pnum; i++) {
printf("%4d",g->list[i].data);
PrintLink(g,g->list[i].next);
}
}
主函数:
int main()
{
graph* g=(graph*)malloc(sizeof(graph));
create(g);
disp(g);
return 0;
}
自己建一个表模拟一下思路会更清楚~