#include "SeqList"
//邻接矩阵实现图的存储类型定义
typedef struct
{
SeqList vertices; //存放顶点的顺序表
int edge[MaxVertices][MaxVertices]; //存放边的邻接矩阵
int numOfEdges; //边的数目
}AdjMGraph;//图的结构体定义
typedef struct
{
int row; //行下标
int col; //列下标
int weight; //权值
}RowColWeight;//边信息结构体定义
struct massages
{
char name[20];
int num;
int cen;
}massage[10]={{"教一楼",50,7},{"教二楼",50,7},{"教三楼",50,7},{"主楼",50,7},{"图书馆",50},{"北一楼",50,7},{"北二楼",50,7},{"北三楼",50,7},{"北综",50,7},{"北区图书馆",50,7}};
//置带权有向图G为空图,时间复杂度:O(1)。
int GraphInitiate(AdjMGraph *G)
{
int i,j;
for(i=0;i<MaxVertices;i++)
for(j=0;j<MaxVertices;j++)
{
if(i==j) G->edge[i][j]=0;
else G->edge[i][j]=MaxWeight; //MaxWeight表示权值无穷大
}
G->numOfEdges=0; //边的条数置为0
ListInitiate(&G->vertices); //顶点顺序表初始化
}
int IsVertex(AdjMGraph *G,DataType vertex)
{
int i;
for (i=0;ivertices.size;i++)
{
if(G->vertices.list[i]==vertex)
{
break;
}
}
if (i==G->vertices.size)
return -1;
else
return i;
}
int InsertVertex(AdjMGraph *G,DataType vertex)
{
if(IsVertex(G,vertex)<0)
if(ListInsert(&G->vertices,G->vertices.size,vertex)==0)//在顶点顺序表的表尾插入顶点vertex
{
printf("插入顶点时空间已满无法插入!");
exit(1);
}
}
int InsertEdge(AdjMGraph *G,int v1,int v2,int weight)
{
DataType x;
if(v1!=v2)
{
if((ListGet(G->vertices,v1,&x)==0)||(ListGet(G->vertices,v2,&x)==0))
{
printf("插入边时参数v1和v2越界出错!\n");
exit(1);
}
G->edge[v1][v2]=weight;
G->numOfEdges++;
}
}
int IsEdge(AdjMGraph *G,int v1,int v2)
{
DataType x;
if((ListGet(G->vertices,v1,&x)==0) || (ListGet(G->vertices,v2,&x)==0))
{
printf("边的参数v1和v2越界出错!\n");
return 0;
}
if(G->edge[v1][v2] == MaxWeight || v1==v2)
{
printf("该边不存在!\n");
return 0;
}
return 1;
}
int DeleteEdge(AdjMGraph *G,int v1,int v2)
{
if (IsEdge(G,v1,v2)==0)
{
printf("删除边时出错!");
exit(1);
}
else
{
G->edge[v1][v2]=MaxWeight;
G->numOfEdges--;
}
}
//计算带权有向图G中第v个顶点的入度,时间复杂度:O(n)。
int InDegree(AdjMGraph *G,int v)
{
//在此插入你第二步的代码,替换掉下面的语句
int din=0,j;
for(j=0;jvertices.size;j++)
{
if(G->edge[v][j]!=0&&G->edge[v][j]!=MaxWeight)
din++;
}
return din;
}
//计算带权有向图G中第v个顶点的出度,时间复杂度:O(n)。
int OutDegree(AdjMGraph *G,int v)
{
//在此插入你第二步的代码,替换掉下面的语句
int dou=0,j;
for(j=0;jvertices.size;j++)
{
if(G->edge[j][v]!=0&&G->edge[v][j]!=MaxWeight)
dou++;
}
return dou;
}
//计算带权有向图G中第v个顶点的度,时间复杂度:O(n)。
int Degree(AdjMGraph *G,int v)
{
return(InDegree(G,v)+OutDegree(G,v));
}
//在带权有向图G中删除第v个顶点,时间复杂度:O(n^2)。
int DeleteVertex(AdjMGraph *G,int v)
{
//在此插入你第一步的代码
int j=0,i;
if(v>G->vertices.size)
{
printf("参数v出错!\n");
return;
}
for (j=v;jvertices.size;j++)
{
for (i=0;ivertices.size;i++)
{
G->edge[j][i]=G->edge[j][i+1];
}
}
for (j=v;jvertices.size-1;j++)
{
for (i=0;ivertices.size;i++)
{
G->edge[i][j]=G->edge[i+1][j];
}
}
for(j=v;jvertices.size-1;j++)
G->vertices.list[j]=G->vertices.list[j+1];
G->vertices.size--;
}
//在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:O(n)。
int GetFirstVex(AdjMGraph G,int v)
{
int col;DataType x;
if(ListGet(G.vertices,v,&x)==0)
{
printf("取第一个邻接顶点时参数v越界出错!\n");
exit(1);
}
//寻找邻接矩阵v行中从最左开始第一个值非零且非无穷大的权值对应的顶点
for(col=0;col<G.vertices.size;col++)
if(G.edge[v][col]>0 && G.edge[v][col] < MaxWeight)
return col;
return -1;
}
//在带权有向图G中取第v1个顶点的继邻接结点第v2个顶点之后的下一个邻接结点,时间复杂度:O(n)。
int GetNextVex(AdjMGraph G,int v1,int v2)
{
int col;DataType x;
if((ListGet(G.vertices,v1,&x)==0)||(ListGet(G.vertices,v2,&x)==0))
{
printf("取下一邻接顶点时参数v1和v2越界出错!\n");
exit(1);
}
if(G.edge[v1][v2]==0)
{
printf("v2不是v1的邻接顶点\n");
exit(1);
}
//寻找邻接矩阵v行中从第v2+1列开始的第一个值非零且非无穷大的权值对应的顶点
for(col=v2+1;col<G.vertices.size;col++)
if(G.edge[v1][col]>0 && G.edge[v1][col]<MaxWeight)
return col;
return -1;
}
//创建有向图G,通过在空图G中插入n个顶点和e条边实现。时间复杂度:O(n^2+e)。
int GraphCreat(AdjMGraph *G,DataType v[],int n,RowColWeight W[],int e)
{
int i,k;
GraphInitiate(G);
for(i=0;i<n;i++)
InsertVertex(G,v[i]);
for(k=0;k<e;k++)
InsertEdge(G,W[k].row,W[k].col,W[k].weight);
}
int Dijkstra(AdjMGraph G,int v0,int distance[],int path[])
{
int n=G.vertices.size;
int *s=(int *)malloc(sizeof(int)*n);
int minDis,i,j,u;
for (i=0;i<n;i++)
{
distance[i]=G.edge[v0][i];
s[i]=0;
if (i!=v0&&distance[i]<MaxWeight)
path[i]=v0;
else path[i]=-1;
}
s[v0]=1;
for (i=0;i<n;i++)
{
minDis=MaxWeight;
for (j=0;j<n;j++)
{
if (s[j]==0&&distance[j]<minDis)
{
u=j;
minDis=distance[j];
}
}
if (minDis==MaxWeight)
return;
s[u]=1;
for (j=0;j<n;j++)
{
if (s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j])
{
distance[j]=distance[u]+G.edge[u][j];
path[j]=u;
}
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
#define MaxSize 100
#define MaxVertices 15
#define MaxWeight 10000
#include "AdjMGraph.h"
#include "Dijkstra.h"
int main()
{
int p[10];
int flog=0;
AdjMGraph g;
int i,j,k,o,l,n=10,e=30,t;
int distance[10],path[10];
DataType a[]={0,1,2,3,4,5,6,7,8,9};
RowColWeight rcw[]={{0,3,20},{0,4,15},{1,2,30},{2,1,30},{2,3,50},{2,4,65},{2,7,653},{2,8,700},{3,0,20},{3,2,50},{3,4,6},{4,0,15},{4,2,65},{4,3,6},{5,6,10},{5,9,20},{6,5,10},{6,7,10},{6,9,30},{7,2,653},{7,6,10},{7,8,50},{7,9,20},{8,2,700},{8,7,50},{8,9,40},{9,5,20},{9,6,30},{9,7,20},{9,8,40}};
int output(int t);
GraphCreat(&g,a,n,rcw,e);
Dijkstra(g,0,distance,path);
printf("\n\n\n\t\t辽宁科技大学\n\n");
printf("\t一、地图信息\n\n");
printf("\t0、博学楼 1、明德楼 2、博闻楼 3、博识楼 4、图书馆\n");
printf("\n\t5、逸兴居 6、知行居 7、弘毅居 8、新实验楼 9、工程技术中心\n\n");
printf("\t二、可供操作\n\n");
printf("\t1、校园内各景点\n\n");
printf("\t2、问路查询\n\n");
printf("\t3、修改景点信息\n\n");
printf("\t4、退出\n\n");
while(1)
{
printf("\n\t现在请选择相关操作:");
scanf("%d",&k);
switch (k)
{
case 1:
printf("\t请输入要查询的景点代号:");
scanf("%d",&o);
printf("\n\t信息如下:\n\n");
printf("\t地点为:%s 楼层为:%d 教室数为:%d\n\n",massage[o].name,massage[o].cen,massage[o].num);break;
case 2:
printf("\t请输入要查询的两个地点:");
scanf("%d,%d",&o,&l);
Dijkstra(g,o,distance,path);
printf("\t从%s到%s最短距离为:%d\n\n",massage[o].name,massage[l].name,distance[l]);
printf("\t从%s到%s路程为:\n\n",massage[o].name,massage[l].name);
printf("\t");
do
{
l=path[l];
}while (massage[o].name!=massage[l].name);
for (i=0;;i++)
{
p[i]=g.vertices.list[o];
o=path[o];
if (massage[o].name==massage[l].name)
break;
flog++;
}
printf("%s",massage[o].name);
for (i=flog;i>1;i--)
{
printf("-->%s",massage[p[i]].name);
}
break;
case 3:
printf("\t请输入要修改的地点代号:");
scanf("%d",&o);
printf("\t请写入信息:");
scanf("%d,%d,%s",&massage[o].cen,&massage[o].num,massage[o].name);
printf("\t修改成功信息如下:\n");
printf("\n\t地点为:%s 楼层为:%d 教室数为:%d\n\n",massage[o].name,massage[o].cen,massage[o].num);break;
case 4:
break;
}
if (k==4)
break;
}
return 0;
}
#include的文件你到底有没有啊
你引入了一个编译器无法找到的文件,就报错了
有这个文件吗,是在当前cpp同目录下的吗
显示找不到"Seqlist.h",如果你会配置,就配置一下头文件的路径,如果不会配置,把头文件放在工程主目录下