想找一下这段c语言的错误,该怎么改。(详细代码和报错如下) - 爱问答

(爱问答)

想找一下这段c语言的错误,该怎么改。(详细代码和报错如下)

代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<queue>
#include<string.h>
#define INFINITY 0X7fffffff
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
using namespace std;
#define MAX_VERTEX_NUM 30
typedef char InfoType;
typedef int Status;
typedef int Boolean;
typedef string VertexType;
typedef enum {DG,DN,UDG,UDN} GraphKind;
typedef struct ArcNode///弧(邻接表)
{
int adjvex; ///当前弧指向的顶点
int info; ///权值
struct ArcNode *nextarc;///下一条当前顶点为出度的弧
} ArcNode;
typedef struct VNode///点(邻接表)
{
VertexType data;///结点名
ArcNode *firstarc;///该点的第一条出边
} VNode,AdjList[MAX_VERTEX_NUM];
typedef struct///图(邻接表)
{
AdjList vertices;///点的邻接表(数组)
int vexnum,arcnum;
int kind;
} Algraph;
Status (*VisitFunc_2)(Algraph G,int v);
void ArcAdd_sort(ALGraph &G,int v1,int v2,int w)///从大到小顺序建立邻接表
{
ArcNode *p,*h,*q;
p=new ArcNode;
p->adjvex=v2;
p->info=w;
p->nextarc=NULL;
h=q=***.vertices[v1].firstarc;
if(q==NULL)***.vertices[v2].firstarc=p;
else
{
if(p->adjvex > q->adjvex)///邻接表按结点序号从大到小排列
{
p->nextarc=q;
***.vertices[v2].firstarc=p;
}
else
{
while(***.vertices[v2].firstarc!=NULL&&q->nextarc!=NULL&&p->adjvex < q->adjvex)
{
h=q;
q=q->nextarc;
}
if(q->nextarc==NULL&&p->adjvex < q->adjvex) q->nextarc=p;
else
{
p->nextarc=q;
h->nextarc=p;
}
}
}
}
void ArcAdd(ALGraph &G,int v1,int v2,int w)///加边
{
ArcNode *p,*q;
p=new ArcNode;
p->adjvex=v2;
p->info=w;
p->nextarc=NULL;
q=***.vertices[v1].firstarc;
if(q==NULL) ***.vertices[v1].firstarc=p;///若第一条依附v2顶点的弧还未存在,新加入的边作为第一条依附弧
else///否则顺着链表向后查找
{
while(q->nextarc!=NULL) q=q->nextarc;
q->nextarc=p;
}
}
int LocateVex_2(ALGraph G,string name)///获取结点标号
{
for(int i=0; i<***.vexnum; i++)
if(name==***.vertices[i].data)return i;
return -1;
}
Status CreateDG_2(ALGraph &G)///邻接表(建立无权有向图)
{
printf("建立无权有向图,请依次输入总结点数、总边数: ");
scanf("%d%d",&***.vexnum,&***.arcnum);
printf("请为从1至n个结点命名: ");
for(int i=0; i<***.vexnum; i++)cin>>***.vertices[i].data,***.vertices[i].firstarc=NULL;
string v1,v2;
printf("请输入%d组由左指向右的有向边: ",***.arcnum);
for(int k=0; k<***.arcnum; k++)
{
cin>>v1>>v2;
int i=LocateVex_2(G,v1);///获取标号
int j=LocateVex_2(G,v2);
ArcAdd(G,i,j,1);
}
return OK;
}
Status CreateDN_2(ALGraph &G)///邻接表(建立带权有向网)
{
printf("建立带权有向网,请依次输入总结点数、总边数: ");
scanf("%d%d",&***.vexnum,&***.arcnum);
printf("请为从1至n个结点命名: ");
for(int i=0; i<***.vexnum; i++)cin>>***.vertices[i].data,***.vertices[i].firstarc=NULL;
string v1,v2;
int w;
printf("请输入%d组由左指向右的有向边与边权: ",***.arcnum);
for(int k=0; k<***.arcnum; k++)
{
cin>>v1>>v2>>w;
int i=LocateVex_2(G,v1);///获取标号
int j=LocateVex_2(G,v2);
ArcAdd(G,i,j,w);
}
return OK;
}
Status CreateUDG_2(ALGraph &G)///邻接表(建立无权无向图)
{
printf("建立无权无向图,请依次输入总结点数、总边数: ");
scanf("%d%d",&***.vexnum,&***.arcnum);
printf("请为从1至n个结点命名: ");
for(int i=0; i<***.vexnum; i++)cin>>***.vertices[i].data,***.vertices[i].firstarc=NULL;
string v1,v2;
printf("请输入%d组相互依附的两结点: ",***.arcnum);
for(int k=0; k<***.arcnum; k++)
{
cin>>v1>>v2;
int i=LocateVex_2(G,v1);///获取标号
int j=LocateVex_2(G,v2);
ArcAdd(G,i,j,1);///无向边
ArcAdd(G,j,i,1);
}
return OK;
}
Status CreateUDN_2(ALGraph &G)///邻接表(建立带权无向网)
{
printf("建立带权无向网,请依次输入总结点数、总边数: ");
scanf("%d%d",&***.vexnum,&***.arcnum);
printf("请为从1至n个结点命名: ");
for(int i=0; i<***.vexnum; i++)cin>>***.vertices[i].data,***.vertices[i].firstarc=NULL;
string v1,v2;
int w;
printf("请输入%d组相互依附的两结点与边权: ",***.arcnum);
for(int k=0; k<***.arcnum; k++)
{
cin>>v1>>v2>>w;
int i=LocateVex_2(G,v1);///获取标号
int j=LocateVex_2(G,v2);
ArcAdd(G,i,j,w);///无向边
ArcAdd(G,j,i,w);
}
return OK;
}
int FirstAdjVex(ALGraph G,int v)
{
if(***.vertices[v].firstarc) return ***.vertices[v].firstarc->adjvex;
return -1;
}
int NextAdjVex(ALGraph G,int v,int w)
{
ArcNode *p=***.vertices[v].firstarc;
while(p->adjvex!=w&&p->nextarc!=NULL)p=p->nextarc;
if(p->nextarc==NULL)return -1;
return p->nextarc->adjvex;
}
void DFS_2(ALGraph G,int v)///邻接表DFS
{
visited[v]=TRUE;
VisitFunc_2(G,v);
for(int w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))
if(!visited[w])DFS_2(G,w);
}
void DFSTraverse_2(ALGraph G,Status (*Visit)(ALGraph G,int v))
{
VisitFunc_2=Visit;
printf("请输入深度优先搜索起始结点: ");
for(int v=0; v<***.vexnum; v++)visited[v]=FALSE;
string st;
cin>>st;
int tmp=LocateVex_2(G,st);
printf("深度优先搜索遍历序列: ");
DFS_2(G,tmp);
for(int v=0; v<***.vexnum; v++)if(!visited[v])DFS_2(G,v);
printf(" ");
}
void BFSTraverse_2(ALGraph G,Status (*Visit)(ALGraph G,int v))///邻接表BFS
{
for(int v=0; v<***.vexnum; v++)visited[v]=FALSE;
queue<int>Q;
printf("请输入广度优先搜索起始结点: ");
string st;
cin>>st;
printf("广度优先搜索遍历序列: ");
int temp=LocateVex_2(G,st);
Visit(G,temp);
***.push(temp);
visited[temp]=TRUE;
while(!***.empty())
{
int tmp=***.front();
***.pop();
for(int w=FirstAdjVex(G,tmp); w>=0; w=NextAdjVex(G,tmp,w))
{
if(!visited[w])
{
visited[w]=TRUE;
Visit(G,w);
***.push(w);
}
}
}
for(int v=0; v<***.vexnum; v++)///剩余连通分量
{
if(!visited[v])
{
visited[v]=TRUE;
Visit(G,v);
***.push(v);
while(!***.empty())
{
int tmp=***.front();
***.pop();
for(int w=FirstAdjVex(G,tmp); w>=0; w=NextAdjVex(G,tmp,w))
{
if(!visited[w])
{
visited[w]=TRUE;
Visit(G,w);
***.push(w);
}
}
}
}
}
printf(" ");
}
void PrintGraph(ALGraph G)///输出邻接表
{
cout<<"图的创建完成,该图的邻接表表示为:"<<endl;
ArcNode *p;
for(int i=0; i<***.vexnum; i++)
{
if(***.vertices[i].firstarc == NULL)
cout<<i<<":"<<***.vertices[i].data<<"-->NULL"<<endl;
else
{
p = ***.vertices[i].firstarc;
cout<<i<<":"<<***.vertices[i].data<<"-->";
while(p->nextarc!=NULL)
{
cout<<p->adjvex<<"-->";
p = p->nextarc;
}
cout<<p->adjvex<<"-->NULL"<<endl;
}
}
}
Status CreateGraph_2(ALGraph &G)///邻接表
{
printf("请输入建图类型(1:无权有向图、2:带权有向网、3:无权无向图、4:带权无向网): ");
scanf("%d",&***.kind);///输入图的种类
switch(***.kind-1)
{
case DG:
return CreateDG_2(G);
case DN:
return CreateDN_2(G);
case UDG:
return CreateUDG_2(G);
case UDN:
return CreateUDN_2(G);
default:
return ERROR;
}
}
Status visit_2(ALGraph G,int v)///邻接表遍历
{
cout<<***.vertices[v].data<<' ';
}
int main()
{
while(true)
{
MGraph G1;
CreateGraph(G1);///邻接矩阵
DFSTraverse(G1,visit);///深搜邻接矩阵
BFSTraverse(G1,visit);///广搜邻接矩阵
ALGraph G2;///邻接表
CreateGraph_2(G2);
PrintGraph(G2);///输出邻接表
DFSTraverse_2(G2,visit_2);///邻接表深搜
BFSTraverse_2(G2,visit_2);///邻接表广搜
}
}
报错:
想找一下这段c语言的错误,该怎么改。(详细代码和报错如下)

首先,你的程序不是c语言的,而是C++的(C与C++是两种不同的语言)

其次,你的程序不完整,除了少了visited变量的定义(它应该是一个bool型数组),还少了MGraph类型及CreateGraph/BFSTraverse两个函数的定义

若是参考了别人的程序,请检查程序完整性

对一个专业程序员来说,分析修改别人的程序要比自己写一个难很多的(要理解别人的思路,逐条分析每个语句的具体含义),所以如果你是想学习编程,建议完全自己动手,若只是交作业,网上找完整的解决方案或把具体要求发上来看看有空帮你写一个。

相关标签:c语言

下一篇:c语言统计数字字符的个数

上一篇:玩游戏这配置还有加固态硬盘的必要吗

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?