输入边来创建无向图的邻接表,首先用一个n*2的数组edge来存放各条边,初始化头节点,然后把各个头节点对应的边用单链表连接
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
#define MAXSIZE 100
int edge[MAXSIZE][2];
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firsttarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
void insert(ArcNode *a,ArcNode *b)//插入单链表
{
ArcNode *p;
p=a;
while(p->nextarc!=NULL)
p=p->nextarc;
p->nextarc=b;
}
ALGraph create(ALGraph &p,int vexnum,int arcnum)
{
int i,a1,a2;
ArcNode *temp;
for(i=1;i<=vexnum;i++)//头节点初始化
{
p.vertices[i].data=i;
p.vertices[i].firsttarc=NULL;
}
for(i=1;i<=arcnum;i++)
{
a1=edge[i][0];
a2=edge[i][1];
temp=(ArcNode*)malloc(sizeof(ArcNode));//创建新的表节点
temp->adjvex=a2;
temp->nextarc=NULL;
if(p.vertices[a1].firsttarc==NULL)
p.vertices[a1].firsttarc=temp;
else
{
insert(p.vertices[a1].firsttarc,temp);
}
}
return p;
}
int main()
{
int i=0,x;
printf("输入边数 ");
scanf("%d",&x);
for(i=1;i<=x;i++)//初始化边
{
scanf("%d",&edge[i][0]);
scanf("%d",&edge[i][1]);
}
for(i=x+1;i<=2*x;i++)//这道题要做无向图,如有向图可省去这个操作,但是输入的边数x也不一样
{
edge[i][0]=edge[i-x][1];
edge[i][1]=edge[i-x][0];
}
ALGraph p;
printf("\n");
printf("输入顶点数");
scanf("%d",&p.vexnum);
p.arcnum=2*x;//
create(p,p.vexnum,p.arcnum);
for(i=1;i<=p.vexnum;i++)//输出邻接表
{
ArcNode *b;
b=(ArcNode*)malloc(sizeof(ArcNode));
if(p.vertices[i].firsttarc==NULL)
printf("error");
else
{
b=p.vertices[i].firsttarc;
printf("%d",p.vertices[i].data);
while(b!=NULL)
{
printf("%d",b->adjvex);
b=b->nextarc;
}
}
printf("\n");
}
}
代码测试无误