为了账号安全,请及时绑定邮箱和手机立即绑定

我想实现结构体赋值,即q=p;试了几种方法都不可行,请指教。(不怎么懂)

我想实现结构体赋值,即q=p;试了几种方法都不可行,请指教。(不怎么懂)

C++
mrs_empress 2017-06-11 12:17:08
#include <iostream> #include <cstdlib> #define INF 99999999 using namespace std; #define MaxVnum 50   //图的顶点数上限 typedef struct ArcNode{//表结点         int adjvex;         struct ArcNode *nextarc;         //第一种         void set(ArcNode *s1,ArcNode *s2){             s1->adjvex=s2->adjvex;             s1->nextarc=s2->nextarc;         }         ArcNode& operator=(const ArcNode *a){             set(this,(ArcNode *)&a);         }        /*第二种         ArcNode& operator=(ArcNode& a){             adjvex=a.adjvex;             nextarc=a.nextarc;             return *this;         }                  类似与第二种         ArcNode* operator=(ArcNode* a){              adjvex=a->adjvex;              nextarc=a->nextarc;              return this;         }       */       }ArcNode; typedef struct{//头结点           ArcNode *firstarc; }AdjList[MaxVnum]; typedef struct{         int vexnum,arcnum;//图的实际顶点数、边数         AdjList vertices;//邻接表 }ALGraph; bool visited[MaxVnum];//访问标志数组 void Create_ALGraph(ALGraph &G); void DFSTraverse_ALGraph(ALGraph G); void DFS_ALGraph(ALGraph G,int v); int main(){      ALGraph G2;      Create_ALGraph(G2);      DFSTraverse_ALGraph(G2);      return 0; } void Create_ALGraph(ALGraph &G){      cin>>G.vexnum>>G.arcnum;      for(int i=0;i<G.vexnum;i++)    G.vertices[i].firstarc=NULL;      for(int i=0;i<G.vexnum;i++){         char a[G.vexnum+1];         cin>>a;         for(int j=0;j<G.vexnum;j++)             if(a[j]=='1'){                 ArcNode *p;                 p=(ArcNode *)malloc(sizeof(ArcNode));                 p->adjvex=j;p->nextarc=NULL;                 ArcNode *q=G.vertices[i].firstarc;                 if(!q){                     q=p;//想要实现这个                }                 else{                     while(q->nextarc)q=q->nextarc;                     q->nextarc=p;                 }             }      } } void DFSTraverse_ALGraph(ALGraph G){     for(int v=0;v<G.vexnum;v++)  visited[v]=false;     for(int v=0;v<G.vexnum;v++)         if(!visited[v])             DFS_ALGraph(G,v); } void DFS_ALGraph(ALGraph G,int v){     visited[v]=true;     cout<<v<<endl;     for(ArcNode *w=G.vertices[v].firstarc;w;w=w->nextarc){         int p=w->adjvex;         if(!visited[p])             DFS_ALGraph(G,p);     } }
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

p 和 q 都是指向 ArcNode 类型的指针,那么你说的 q=p 是希望让 p 所指的 node “赋值”给 q 所指的 node 吗?

如果是这样的话,那只写 q = p 是不行的。

q = p 只是指针间的赋值,只是让 q 指针指向 p 指针所指的对象。而 G.vertices 数组中的原指针还是指向原来的 node。

虽然你在 ArcNode 中重载了 operator=,但这是 ArcNode 的成员函数,调用它需要左操作数类型是 ArcNode 类型,而不是 ArcNode 指针类型。

你可以试试 *q = p 这样来调用。


你的 ArcNode& operator=(const ArcNode *a) 将参数声明为 const 的,但是为了能够调用 set 函数,所以还需要将强制转型来去掉 const 修饰。

我想说的是在 C++ 中,最好不要用 (xxx) 的方式来转型,尤其是去掉 const 指针的转型应该用 const_cast<>。而且去掉 const 的转型始终是有危险的,虽然在你这个代码中应该没什么问题(因为 p 是否为 const 指针本就无所谓,由于你参数声明为 const 指针才成为 const 的)。

但其实你完全可以避免去 const 转型,只要你把 set 函数的第二个参数也声明为 const 就可以了。毕竟 set 函数也不去修改第二个参数所指的对象。


进一步说:你的 ArcNode& operator=(const ArcNode *a) 函数本来就很奇怪。

= 运算符一般使用在相同类型的对象上的,也就是等号左右两侧的类型应该相同。这虽然不是强制要求,但惯例如此,而且更直观。

将 = 运算符重载为 ArcNode& operator=(const ArcNode& a) 要更合理。 那么调用时只要 *q = *p 就可以了。

查看完整回答
1 反对 回复 2017-06-11
?
mrs_empress

TA贡献11条经验 获得超2个赞

懂了,不是赋值问题,是指针没搞好

查看完整回答
反对 回复 2017-06-11
  • 3 回答
  • 0 关注
  • 1844 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信