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

#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);
    }
}


mrs_empress
浏览 1903回答 3
3回答

onemoo

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 就可以了。

mrs_empress

懂了,不是赋值问题,是指针没搞好
打开App,查看更多内容
随时随地看视频慕课网APP