亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我想實現結構體賦值,即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 關注
  • 1968 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號