X_lanyuan
2021-06-07 13:58
采纳率: 100%
浏览 19

C数据结构 我这个为什么错了啊。。。


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;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • qfl_sdu 2021-06-07 14:05
    已采纳

    字符串长度越界了,一个汉子占2个字节,数组中赋值的时候4个汉子的长度就是8,但是结构体中定义的name的大小长度只有5,#define MAXV 5这里,把5改大一些,比如改成#define MAXV 20

    点赞 1 打赏 评论

相关推荐 更多相似问题