115 87 C:\Users\Administrator\Documents\未命名1.cpp [Error] initializer-string for array of chars is too long [-fpermissive]
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXV 5
#define INF 32767
typedef struct
{ int no; /*顶点编号*/
char name[MAXV]; /*顶点其他信息*/
}VertexType; /*顶点类型*/
typedef struct ANode
{ int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置
struct ANode *nextarc; //链域,指示下一条边或弧
int weight;
}ArcNode;
typedef struct Vnode
{ VertexType data; //存放顶点信息Vi
ArcNode *firstarc; //指示第一个邻接点结点
}VNode;
typedef struct
{VNode adjlist[MAXV]; //邻接表
int n,e; //顶点数和边数
}AdjGraph; //图的类型
void CreatAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) /*将邻接矩阵A转换成邻接表G*/
{
int i,j;
ArcNode *p;
G=(AdjGraph *)malloc(sizeof(AdjGraph));
for (i=0;i<n;i++) /*给邻接表中所有头结点的指针域置初值*/
{
G->adjlist[i].firstarc=NULL;
}
for (i=0;i<n;i++) /*检查邻接矩阵中每个元素*/
for (j=n-1;j>=0;j--)
if (A[i][j]!=0&&A[i][j]!=INF) /*邻接矩阵的当前元素不为0或无穷大*/
{ p=(ArcNode *)malloc(sizeof(ArcNode));/*创建一个结点*p*/
p->adjvex=j;
p->weight=A[i][j];
p->nextarc=G->adjlist[i].firstarc;/*用头插法将*p链到链表*/
G->adjlist[i].firstarc=p;
}
G->n=n;G->e=e;
}
void DispAdj(AdjGraph *G)
/*输出邻接表G*/
{
int i;
ArcNode *p;
for (i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
if (p!=NULL) printf("%3d<%10s>: ",G->adjlist[i].data.no,G->adjlist[i].data.name);
while (p!=NULL)
{
printf("%3d[%d]", G->adjlist[p->adjvex].data.no,p->weight);
p=p->nextarc;
}
printf("\n");
}
}
int visited[MAXV]={0};
void DFS(AdjGraph *G,int v) //从v顶点开始遍历的递归算法
{
ArcNode *p;
visited[v]=1; /*置已访问标记*/
printf("%3d",v); /*输出被访问顶点的编号*/
p=G->adjlist[v].firstarc; /*p指向顶点v的第一条弧的弧头结点*/
while (p!=NULL)
{
if (visited[p->adjvex]==0) /*若p->adjvex顶点未访问,递归访问它*/
DFS(G,p->adjvex);
p=p->nextarc; /*p指向顶点v的下一条弧的弧头结点*/
}
}
void BFS(AdjGraph *G,int v) //从v顶点开始遍历的广度优先遍历算法
{
ArcNode *p;
int queue[MAXV],front=0,rear=0; /*定义循环队列并初始化*/
int visited[MAXV]; /*定义存放结点的访问标志的数组*/
int w,i;
for (i=0;i<G->n;i++) visited[i]=0; /*访问标志数组初始化*/
printf("%3d",v); /*输出被访问顶点的编号*/
visited[v]=1; /*置已访问标记*/
rear=(rear+1)%MAXV;
queue[rear]=v; /*v进队*/
while (front!=rear) /*若队列不空时循环*/
{
front=(front+1)%MAXV;
w=queue[front]; /*出队并赋给w*/
p=G->adjlist[w].firstarc; /*找与顶点w邻接的第一个顶点*/
while (p!=NULL)
{
if (visited[p->adjvex]==0) /*若当前邻接顶点未被访问*/
{
printf("%3d",p->adjvex); /*访问相邻顶点*/
visited[p->adjvex]=1; /*置该顶点已被访问的标志*/
rear=(rear+1)%MAXV; /*该顶点进队*/
queue[rear]=p->adjvex;
}
p=p->nextarc; /*找下一个邻接顶点*/
}
}
printf("\n");
}
int main()
{
int i;
AdjGraph *G;
int n=5,e=7;
VertexType a[5]={{1,"图书馆"},{2,"教学B楼"},{3,"教学C楼"},{4,"教学D楼"},{5,"信息楼"}};
int A[][MAXV]={{INF,150,200,150,100},{150,INF,400,INF,INF},{200,400,INF,50,INF},{150,INF,50,INF,50},{100,INF,INF,50,INF}};
CreatAdj(G,A,n,e);
for(i=0;i<n;i++)
{
G->adjlist[i].data.no=a[i].no;
strcpy(G->adjlist[i].data.name,a[i].name);
}
DispAdj(G);
return 0;
}