#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef int Datatype;
typedef struct Arcnode
{
int adjvex ;
struct Arcnode *next;
}Arconde;
typedef struct vernode
{
Datatype vertex;
Arcnode *firstedge;
}Vernode;
typedef struct Algraph
{
Vernode adjlist[Maxsize];
int vertexnum,arcnum;
}ALG;
typedef struct SeqQ
{
int front,rear;
Datatype data[Maxsize];
}SQ;
//2 完成图G的邻接表存储
void Iintgraph(ALG *G,int n,int e,Datatype a[])
{
Arcnode *s;
int i,j,k;
G->vertexnum = n;
G->arcnum = e;
for(i=0;i<n;i++){
G->adjlist[i].vertex = a[i];
G->adjlist[i].firstedge = NULL;
}
for(k=0;k<e;k++){
printf("请输入边依附的两个顶点:\n");
scanf("%d,%d",&i,&j);
s=(Arcnode *)malloc(sizeof(Arcnode));
if(s==NULL){
printf("内存盛情失败!\n");
return ;
}
s->adjvex =j;
s->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s;
//无向图的邻接表存储
s=(Arcnode *)malloc(sizeof(Arcnode));
if(s==NULL){
printf("内存盛情失败!\n");
return ;
}
s->adjvex =i;
s->next = G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s;
}
}
//3输出邻接表信息
void Print(ALG *G){
int i;
Arcnode *p;
for(i=0;i<G->vertexnum;i++){
printf("顶点信息:%3d",G->adjlist[i].vertex);
p=G->adjlist[i].firstedge;
printf("邻接点");
while(p!=NULL){
printf("%3d",p->adjvex);
p=p->next;
}
printf("\n");
}
}
//4完成深度广度等求解
int visited[Maxsize]={0};
void DFS(ALG *G,int v)
{
int j;
Arcnode *p;
printf("%3d",G->adjlist[v].vertex);
visited[v]=1;
p=G->adjlist[v].firstedge;
while(p!=NULL)
{
j=p->adjvex;
if(p!=NULL && visited[j]==0)
{
DFS(G,j);
}
p=p->next;
}
}
//广度优先遍历
void BFS(ALG *G,int v)
{
SQ Q;
Arcnode *p;
int j;
int visited[Maxsize]={0};
Q.front=Q.rear =-1; //初始化队列,采用顺序表
printf("%d",G->adjlist[v].vertex);
visited[v]=1;
//Q[++rear]=v;
Q.rear=(Q.rear+1)%Maxsize;
Q.data[Q.rear] = v; //入队操作
while(Q.front!=Q.rear)
{
//v==Q[++front];
Q.front=(Q.front+1)%Maxsize;
v=Q.data[Q.front];
p=G->adjlist[v].firstedge; //工作指针初始化
while(p!=NULL)
{
j=p->adjvex;
if(visited[j]==0){
printf("%3d",G->adjlist[j].vertex);
visited[j]=1;
// Q[++rear]=j;
Q.rear=(Q.rear+1)%Maxsize;
Q.data[Q.rear]=j;
}
p=p->next;
}
}
}
//主函数完成图的生命,顶点个数,边数的初始化
//顶点的初始化
int main()
{
ALG G;
int n,e,i;
Datatype a[Maxsize];
printf("请输入顶点的个数和边数:\n");
scanf("%d,%d",&n,&e);
if(n<0)
printf("顶点个数无效");
else if(e<0 || e>n*(n-1)/2)
printf("边数无效");
else{
printf("顶点初始化:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
Iintgraph(&G,n,e,a);
printf("图G的邻接表存储如下:\n");
Print(&G);
printf("图G 的深度优先遍历:\n");
DFS(&G,0);
printf("\n");
printf("图G 的广度优先遍历:\n");
BFS(&G,0);
printf("\n");
}
}
图的邻接表存储(c语言实现)
最新推荐文章于 2022-11-18 17:39:14 发布