데이터 구조 및 알고리즘의 기초(Wang Zhuo)(25): 인접 목록으로 그래프 표현

목차

먼저 전체 인접 목록 구조의 모든 프레임워크를 정렬합니다. 편집

정점 노드:

 호/모서리 노드:

그래프의 구조 정의:

전제 조건:

방향이 지정되지 않은 네트워크를 만듭니다.

LocateVex(G, v) 함수:

기능 본문:

내가 쓴 첫 번째 버전:

질문:

게다가:

이해력: 나는 주로 내 자신의 연구 아이디어에 의존하고 직접 코드를 작성합니다.Tmd는 이 표준 답변을 매일 반복해서 읽고 중국어로 변환합니다.결국 나는 여전히 그 의미를 이해할 수 없습니다. ..#%$ & 너무 힘들어

최종 결과(outcome):

완전한 환경 플러스 함수 알고리즘:

교차 연결 목록: (유향 그래프의 경우)

 인접 다중 테이블: (무방향 그래프의 경우)


먼저 전체 인접 목록 구조의 모든 프레임워크를 정렬합니다.


정점 노드:

typedef struct VertexNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];
//例如:VNode v[MVNum] 相当于 AdjList vv

이렇게도 바꿀 수 있을 것 같아요(제가 썼습니다): (의심)

//顶点的结点结构
struct VNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
};
typedef VNode AdjList[MVNum];
//例如:VNode v[MVNum] 相当于 AdjList v

주요 문제/모호함은 AdjList에 있습니다. 위의 내용이 올바른지 모르겠지만 AdjList의 경우 다음과 같이 이해할 수 있습니다.

AdjList에 대한 이해를 돕기 위해 다음을 살펴보겠습니다.

VNode v[MVNum]은 AdjList v와 동일합니다.     

보는 것과 같습니다.
int a[ 5 ]를 정의하는 것은 Alist a와 동일합니다.

사실:
AdjList는 다음을 의미합니다. [배열 유형은 VNode 유형의 1차원 배열] 유형입니다.

그런데 코드에서 어떻게 그런 효과를 낼 수 있는지가 어려운 문제고, 암튼 그게 다야.

TMD와 나중에 살펴보니 이 AdjList 프로그램을 사용할 필요가 없습니다. 다음 그림의 프로그램을 다음과 같이 변경하기만 하면 됩니다.

//图的结构定义
struct ALG
{
    //AdjList vertices;  
    VNode vex[MVNum];//顶点表
    int vexnum, arcnum;  //顶点数和边数
}; //Adjacency List Graph

그렇다면 우리의 정의는 다음과 같이 직접 작성할 수 있습니다.

struct VertexNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
};

괜찮아, 이건 중요하지 않아, 난 정말 할 말을 잃었어...


 호/모서리 노드:

//弧/边的结点结构
typedef int OtherInfo;
struct ArcNode
{
    int adjvex;//Adjacency
    //该边所指向的(相邻)顶点的位置
    struct ArcNode* nextarc;  //指向下一条边的指针
    OtherInfo info;  //和边相关的信息
};

그래프의 구조 정의:

//图的结构定义
struct ALG
{
    //AdjList vertices;  
    VertexNode vex[MVNum];//顶点表
    int vexnum, arcnum;  //顶点数和边数
}; //Adjacency List Graph

요약:

전제 조건:

#include<iostream>
using namespace std;

typedef int Status;

#define MVNum 100  //最大顶点数
//MAX Vertex Number
typedef char VertexType;  //设顶点类型:字符型

//弧/边的结点结构
typedef int OtherInfo;
struct ArcNode
{
    int adjvex;//Adjacency
    //该边所指向的(相邻)顶点的位置
    struct ArcNode* nextarc;  //指向下一条边的指针
    OtherInfo info;  //和边相关的信息
};

struct VertexNode
    //顶点的结点结构
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
};

//图的结构定义
struct ALG
{
    //AdjList vertices;  
    VertexNode vex[MVNum];//顶点表
    int vexnum, arcnum;  //顶点数和边数
}; //Adjacency List Graph

방향이 지정되지 않은 네트워크를 만듭니다.

LocateVex(G, v) 함수:

Status LocateVexNumber(ALG G, VertexType v1)
{
    for (int i = 0; i <= G.vexnum; i++)
    {
        if (G.vex->data == v1)
            return i;
    }
    return -1;
}

기능 본문:

내가 쓴 첫 번째 버전:

Status CreateUDG(ALG& G)//无向网
{
    int i, j, k;
    

    cin >> G.vexnum >> G.arcnum;  //输入顶点数和边数
    for (i = 0; i < G.vexnum; i++)
    {
        cin >> G.vex[i].data;  //输入顶点值
        G.vex[i].firstarc = NULL;  //初始化表头结点的指针域
    }

    for (int m = 0; m <= G.vexnum; m++)
    {
        VertexType c1, c2;
        cout << "input vexs" << endl;
        //输入一条边邻接的其他边所对应的其他的结点,也可以不止两个
        cin >> c1 >> c2;
        int a = LocateVexNumber(G, c1);
        int b = LocateVexNumber(G, c2);//两结点各自所对应的位置序号

        //开辟边结点空间
        ArcNode*p1 = new ArcNode;
        p1->adjvex = a;
        //p1->adjvex = LocateVexNumber(G, c1);
        p1->nextarc = ???;
        //啊?这时候我们还没有创建我们下一个边结点,这怎么搞啊
        G.vex[m].firstarc = p1;
        
        ...
    }

}

질문:

(1):

여기서 우리가 가지고 있는 명백한 문제 중 하나는 알고리즘의 입력 에지 노드의 메커니즘을 이해하는 데 문제가 있다는 것입니다.

우리는 입력의 두 노드가

이 노드에 인접한 다른 모든 노드를 나타냅니다.

그리고 실제로 여기서 그것은 단지 말하는 것과 같습니다.

여기에 (C1,C2) 우리가 제공하는 이 두 노드에 연결된 에지가 있습니다.

(2):

(1)에 따르면: 일반적으로 인접 목록의 그래프를 기반으로 그리는 프로그램 흐름은 다음과 같아야 합니다.

  1. 에지 노드 p의 인접 노드인 노드
  2. 그런 다음 b 노드는 에지 노드 p를 가리킵니다.
  3. 마지막으로 에지 노드 p는 노드 b에 연결된 다음 에지 노드를 가리킵니다.

그러나 이것이 사실이라면 이전에 작성한 프로그램에서도 발생했던 문제가 발생했습니다.

우리는 아직 다음 노드를 알지 못합니다. 사실 현재 다음 노드는 존재하지도 않습니다. 결과적으로 현재로서는 빈 노드를 가리키도록 할 수 밖에 없습니다.

그러나 우리가 작성한 것은 for 루프입니다.꼬리 보간으로 알고리즘을 구현하려면 다음과 같이 하십시오.

다른 for 루프를 작성하지 않는 한 두 번째 for 루프에서 마지막에 이전 노드를 가리키는 명령문 연산을 추가합니다.

그러나 이것은 너무 번거롭기 때문에 여기서 헤더 삽입 방법을 사용하면 프로그램의 정상적인 흐름은 다음과 같아야 합니다.

  1. 에지 노드 p의 인접 노드인 노드
  2. 정점 b와 첫 번째 에지 노드 사이에 에지 노드 p를 삽입합니다.
  1. 에지 노드 p의 다음 에지 노드 = 첫 번째 노드
  2. b는 p를 가리킨다

주의할 점은 값을 먼저 할당해야 하는데 b가 p를 먼저 가리키면 첫 번째 노드의 주소를 잃어버리고 찾을 수 없기 때문에 다음 노드에 할당할 방법이 없다.

게다가:

여기에서는 처음에 첫 번째 노드를 비우면 무엇을 해야 할지 걱정할 필요가 없습니다.

이 노드가 비어 있더라도 항상 저장할 주소가 있기 때문입니다.

이 주소가 존재하지 않는 것은 불가능합니다. 그러면 (예) 이 노드가 비어 있는 것이 아니라 이 노드가 전혀 존재하지 않습니다.


이해력: 나는 주로 내 자신의 연구 아이디어에 의존하고 직접 코드를 작성합니다.Tmd는 이 표준 답변을 매일 반복해서 읽고 중국어로 변환합니다.결국 나는 여전히 그 의미를 이해할 수 없습니다. ..#%$ & 너무 힘들어


최종 결과(outcome):

Status CreateUDG(ALG& G)//无向网
{
    int i, j, k;
    

    cin >> G.vexnum >> G.arcnum;  //输入顶点数和边数
    for (i = 0; i < G.vexnum; i++)
    {
        cin >> G.vex[i].data;  //输入顶点值
        G.vex[i].firstarc = NULL;  //初始化表头结点的指针域
    }

    for (int m = 0; m <= G.vexnum; m++)
    {
        VertexType c1, c2;
        int weight;
        cout << "input vexs" << endl;
        //输入每条边依附的两个顶点及其权重
        cin >> c1 >> c2>>weight;
        int a = LocateVexNumber(G, c1);
        int b = LocateVexNumber(G, c2);
        //两个顶点各自所对应的位置序号

        //开辟边结点
        ArcNode*p1 = new ArcNode;
        p1->adjvex = a;
        //p1->adjvex = LocateVexNumber(G, c1);
        p1->nextarc = G.vex[b].firstarc;
        //边结点p的next边结点 = first结点       
        G.vex[b].firstarc = p1;//b指向p

        //无向图连线都(是)双向
        ArcNode* p2 = new ArcNode;
        p2->adjvex = b;
        //p1->adjvex = LocateVexNumber(G, c2);
        p2->nextarc = G.vex[a].firstarc;
        G.vex[a].firstarc = p1;
    }
    return true;
}

완전한 환경 플러스 함수 알고리즘:

#include<iostream>
using namespace std;

typedef int Status;

#define MVNum 100  //最大顶点数
//MAX Vertex Number
typedef char VertexType;  //设顶点类型:字符型

//弧/边的结点结构
typedef int OtherInfo;
struct ArcNode
{
    int adjvex;//Adjacency
    //该边所指向的(相邻)顶点的位置
    struct ArcNode* nextarc;  //指向下一条边的指针
    OtherInfo info;  //和边相关的信息
};

struct VertexNode
    //顶点的结点结构
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
};

//图的结构定义
struct ALG
{
    //AdjList vertices;  
    VertexNode vex[MVNum];//顶点表
    int vexnum, arcnum;  //顶点数和边数
}; //Adjacency List Graph

Status LocateVexNumber(ALG G, VertexType v1)
{
    for (int i = 0; i <= G.vexnum; i++)
    {
        if (G.vex->data == v1)
            return i;
    }
    return -1;
}

Status CreateUDG(ALG& G)//无向网
{
    int i, j, k;
    

    cin >> G.vexnum >> G.arcnum;  //输入顶点数和边数
    for (i = 0; i < G.vexnum; i++)
    {
        cin >> G.vex[i].data;  //输入顶点值
        G.vex[i].firstarc = NULL;  //初始化表头结点的指针域
    }

    for (int m = 0; m <= G.vexnum; m++)
    {
        VertexType c1, c2;
        int weight;
        cout << "input vexs" << endl;
        //输入每条边依附的两个顶点及其权重
        cin >> c1 >> c2>>weight;
        int a = LocateVexNumber(G, c1);
        int b = LocateVexNumber(G, c2);
        //两个顶点各自所对应的位置序号

        //开辟边结点
        ArcNode*p1 = new ArcNode;
        p1->adjvex = a;
        //p1->adjvex = LocateVexNumber(G, c1);
        p1->nextarc = G.vex[b].firstarc;
        //边结点p的next边结点 = first结点       
        G.vex[b].firstarc = p1;//b指向p

        //无向图连线都(是)双向
        ArcNode* p2 = new ArcNode;
        p2->adjvex = b;
        //p1->adjvex = LocateVexNumber(G, c2);
        p2->nextarc = G.vex[a].firstarc;
        G.vex[a].firstarc = p1;
    }
    return true;
}

int main()
{

}

교차 연결 목록: (유향 그래프의 경우)

 인접 다중 테이블: (무방향 그래프의 경우)

Supongo que te gusta

Origin blog.csdn.net/Zz_zzzzzzz__/article/details/129976494
Recomendado
Clasificación