平时看到C/C++ 结构体问题的一些知识,比较有用,分享出来

程序如下:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX_VERTEX_NUM 20
#define INFINITY INT_MAX
using namespace std;
int i,j,n,m;
 
enum Mark
{
    INFEASIBLE=-2,
    OVERFLOW,
    ERROR,
    OK
};
typedef struct ArcCell
{
    int data;
} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
    char vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
} MGraph;
 
int LocateVex(MGraph &G,char v)   //寻找图中相同名称的顶点
{
    for(i=0; i<G.vexnum; i++)
    {
        if(v==G.vexs[i])
            return i;
        if(i==G.vexnum)
            return ERROR;
 
    }
    return OK;
}
int CreateGraph(MGraph &G,int l,int k)
{
    char v,v1,v2;
    int count=0;
    G.vexnum=l;
    G.arcnum=k;
    for( i=0; i<l; i++)
    {
        for(j=0; j<l; j++)
            G.arcs[i][j].data=0;
    }
    while(l--)
    {
        cin>>v;
        G.vexs[count++]=v;
    }
    while(k--)
    {
        int e,r;
        cin>>v1>>v2;
        e=LocateVex(G,v1);
        if(i<0) return ERROR;
        r=LocateVex(G,v2);
        if(j<0) return ERROR;
        G.arcs[e][r].data=1;
        G.arcs[r][e].data=1;
    }
    return OK;
 
}
//------------------------------------------------------------------------------------------//
int InsertArc(MGraph &G,char v,char w)
{
    i=LocateVex(G,v);
    cout<<i;
    j=LocateVex(G,w);
    cout<<j;
    if(i<0)
        return ERROR;
    if(j<0)
        return ERROR;
    if(i==j)
        return ERROR;
    if(G.arcs[i][j].data!=1)
    {
        G.arcs[i][j].data=1;
        G.arcs[j][i].data=1;
        cout<<G.arcs[i][j].data;
         cout<<G.arcs[j][i].data;
        G.arcnum++;
    }
    return OK;
}
//---------------------------------------------------------------------------------------------//
int InsertVex(MGraph &G,char v)
{
 
    if(G.vexnum>=MAX_VERTEX_NUM)
        return INFEASIBLE;
    G.vexs[++G.vexnum]=v;
    return OK;
}
int DeleteVex(MGraph &G,char v)
{
    n=G.vexnum;
    m=LocateVex(G,v);
    if(j<0)
        return ERROR;
    char ch;
    ch=G.vexs[n-1];
    G.vexs[n-1]=G.vexs[m];
    G.vexs[m]=ch;
    for(i=0; i<n-2; i++)
    {
        G.arcs[m][i]=G.arcs[n-1][i];
    }
    G.arcs[m][m].data=0;
    G.vexnum--;
    return OK;
}
int DeleteArc(MGraph &G,char v,char w)
{
    i=LocateVex(G,v);
    j=LocateVex(G,w);
    if(i<0)
        return ERROR;
    if(j<0)
        return ERROR;
    if(G.arcs[i][j].data)
        G.arcs[i][j].data=0;
    G.arcnum--;
    return OK;
}
int main()
{
    MGraph G;
    int l,k;
    char ch1,ch2;
    cin>>l>>k;
    CreateGraph(G,l,k);
    cin>>ch1>>ch2;
    InsertArc(G,ch1,ch2);
    for( i=0; i<G.vexnum; i++)
    {
        for(j=0; j<G.vexnum; j++)
        {
            cout<<G.arcs[i][j].data<<" ";
        }
        cout<<endl;
    }
 
    return 0;
}
问题:
cout<<G.arcs[i][j].data;
         cout<<G.arcs[j][i].data;
为什么没结果的?

解答:
C/C++结构体的区别  
C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。
C++中的结构体和类的异同:
一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;
也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。
二、不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,(而struct中没有是错误的,一直被误导啊,经过测试struct的成员函数一样具有this指针),类的关键字class能作为template模板的关键字 即template<class T> class A{}; 而struct不可以。
实际上,C中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的,而到C++中一类或者一个结构体可以包含函数(这个函数在C++我们通常中称为成员函数),C++中的结构体和类体现了数据结构和算法的结合。

猜你喜欢

转载自blog.csdn.net/u012187684/article/details/71747424