图的具体操作(C++ 数据结构)

本文介绍了一种使用邻接表和邻接矩阵表示图的方法,并提供了深度优先搜索(DFS)和广度优先搜索(BFS)的具体实现。通过文件读取图的数据,创建邻接表和邻接矩阵,并演示了如何遍历图。

 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 100

using namespace std;

#ifndef GRAPHICS_H
#define GRAPHICS_H

struct EdgeNode
{
    int adjvex;
    EdgeNode *next;
};//定义邻接表的边节点类型
//定义邻接表类型
typedef EdgeNode **ADJLIST;

//对图操作的主菜单
void MainMenue();

//初始化邻接表
void InitialAdjList(ADJLIST &GL, int n);

//以文件方式输入图
//bool InputGraphics();

//建立图的邻接表
void CreatAdjList(ADJLIST &GL, int &n);

//建立图的邻接矩阵
void CreatAdjMatrix(ADJLIST &GL, int &n);

//从初始点出发深度优先搜索由邻接表GL表示的图
void DFSAdjList(ADJLIST GL, bool *&visited, int i, int n);

//从初始点出发广度优先搜索由邻接表GL表示的图
void BFSAdjList(ADJLIST GL, bool *&visited, int i, int n);

#endif

 

//部分函数原型声明
void Check(int n, int &i, int &j);
void InitialAdjList(ADJLIST &GL, int n);

//全局变量,控制递归函数中提示符的输出
int flag = 1;

void MainMenue()
//对图操作的主菜单
{
    cout<<"\n***************************************"<<endl;
    cout<<"**         T923-1 Lily               **"<<endl;
    cout<<"**         1.建立图的邻接表。        **"<<endl;
    cout<<"**         2.建立图的邻接矩阵。      **"<<endl;
    cout<<"**         3.深度优先遍历图。        **"<<endl;
    cout<<"**         4.广度优先遍历图。        **"<<endl;
    cout<<"**         5.退出。                  **"<<endl;
    cout<<"**                                   **"<<endl;
    cout<<"************ fulme ********************"<<endl;
 
}

void InitialAdjList(ADJLIST &GL, int n)
//初始化图的邻接表
{
    GL = new EdgeNode*[n];
    for (int i = 1; i <= n; i++)
        GL[i] = NULL;
}

void CreatAdjList(ADJLIST &GL, int &n)
//建立图的邻接表
{
    FILE *in1;
    FILE *out1;
    int i,j,k,b;
    char ch;
    int flag = 1;

        //建立无向图的邻接表
        if ((in1 = fopen("T923-1-888-Lily-Graphics.txt", "rb")) == NULL)
        {
            cout<<"打开 T923-1-888-Lily-Graphics.txt 失败!"<<endl;
            exit(1);
        }

        if ((out1 = fopen("T923-1-888-Lily-adjlist1.txt", "wb")) == NULL)
        {
            cout<<"打开 T923-1-888-Lily-adjlist1.txt 失败!"<<endl;
            flag = 1;
        }

        //读入顶点的个数, ",", 边数
        fscanf(in1, "%d", &n);
        fscanf(in1, "%c", &ch);
        fscanf(in1, "%d", &b);

        for (k = 0; k < b; k++)
        {
            fscanf(in1, "%d", &i);
            fscanf(in1, "%c", &ch);
            fscanf(in1, "%d", &j);

            Check(n, i, j);

            //向序号为i的单链表的表头插入一个边结点
            EdgeNode *p = new EdgeNode;
            p -> adjvex = j;
            p -> next = GL[i];
            GL[i] = p;

            //向序号为j的单链表的表头插入一个节点
            p = new EdgeNode;
            p -> adjvex = i;
            p -> next = GL[j];
            GL[j] = p;

        }

        //输出邻接表,并保存到adjlist1.txt中
        cout<<endl<<"\n====================="<<endl;
        cout<<"无向图的邻接表为:"<<endl;
        for (i = 1; i <= n; i++)
        {
            EdgeNode *p = GL[i];

            cout<<i - 1<<" |"<<"V"<<i;
            fprintf(out1, "%c", 'V');
            fprintf(out1, "%d", i);

            for (p = GL[i]; p != NULL; p = p -> next)
            {
                cout<<"|-|->|"<<p -> adjvex;
                fprintf(out1, "%s", "|-|->|");
                fprintf(out1, "%d", p -> adjvex);
            }
            cout<<"|^|"<<endl;
            fprintf(out1, "%s", "|^|");
            fprintf(out1, "\r\n");
        }
        if (flag)
            cout<<"无向图的邻接表已保存到T923-1-888-Lily-adjlist1.txt中"<<endl;
        fclose(in1);
        fclose(out1);

   
}

void CreatAdjMatrix(ADJLIST &GL, int &n)
//建立图的邻接矩阵
{
    int matrix[MAX_SIZE + 1][MAX_SIZE + 1];
    FILE *in1;
    FILE *out1;
    int i,j,k,b;
    char ch;
    int flag = 0;

    //初始化图的邻接矩阵
    for (i = 1; i <MAX_SIZE; i++)
    {
        for (j = 1; j <MAX_SIZE; j++)
        {
            matrix[i][j] = 0;
        }
    }

        //建立无向图的邻接矩阵
   
        if ((in1 = fopen("T923-1-888-Lily-Graphics.txt", "rb")) == NULL)
        {
            cout<<"打开 T923-1-888-Lily-Graphics.txt 失败!"<<endl;
            exit(1);
        }

        if ((out1 = fopen("T923-1-888-Lily-adjlmatrix1.txt", "wb")) == NULL)
        {
            cout<<"打开 T923-1-888-Lily-adjmatrix1.txt 失败!"<<endl;
            flag = 1;
        }

        //读入顶点的个数, ",", 边数
        fscanf(in1, "%d", &n);
        fscanf(in1, "%c", &ch);
        fscanf(in1, "%d", &b);

        for (k = 0; k < b; k++)
        {
            fscanf(in1, "%d", &i);
            fscanf(in1, "%c", &ch);
            fscanf(in1, "%d", &j);

            Check(n, i, j);
            matrix[i][j] = matrix[j][i] = 1;
        }
  cout<<"\n================================="<<endl;
  cout<<"无向图的邻接矩阵为:\n";
        for (i = 1; i <=n; i++)
        {
            for (j = 1; j <=n; j++)
            {
                cout<<matrix[i][j]<<' ';
                fprintf(out1, "%d ", matrix[i][j]);
            }
            cout<<endl;
            fprintf(out1, "\r\n");
        }
        cout<<"无向图的邻接矩阵已保存到T923-1-888-Lily-adjmatrix1.txt中!"<<endl;
  fclose(in1);
        fclose(out1);
   
   
}


void DFSAdjList(ADJLIST GL, bool *&visited, int i, int n)
//从初始点出发递归深度优先搜索邻接表GL表示的图
{
    if (flag)
    {
        flag = 0;
        cout<<"\n================================="<<endl;
        cout<<"\n图的深度优先遍历序列:"<<endl;
    }
    cout<<i<<' ';
    visited[i] = true;
    EdgeNode *p = GL[i];

    while (p != NULL)
    {
        int j = p -> adjvex; //j为Vi的一个邻接点的序号
        if (!visited[j])
            DFSAdjList(GL, visited, j, n);
        p = p -> next;
    }
}


void BFSAdjList(ADJLIST GL, bool *&visited, int i, int n)
//从初始点开始广度优先搜索邻接表GL表示的图
{
    int j;
    const int MaxLength = 100;

    //定义一个队列q, 其元素类型为整型
    int q[MaxLength] = {0};

    //定义队首和对尾指针
    int front = 0, rear = 0;

    cout<<"\n================================="<<endl;
    cout<<"\n图的广度优先遍历序列:"<<endl;
    for (j = 1; j <= n; j++)
        visited[j] = false;
    cout<<i<<' ';//访问Vi
    visited[i] = true;
    q[++rear] = i;

    while (front != rear)
        //当队列非空时进行循环处理
    {
        //删除队首元素,第一次执行时k的值为i
        front = (front + 1) % MaxLength;
        int k = q[front];

        //取邻接表的表头指针
        EdgeNode *p = GL[k];

        while (p != NULL)
            //依次搜索Vk的每个节点
        {
            //Vj为Vk的一个邻接节点
            int j = p -> adjvex;
            if (!visited[j])
            {
                cout<<j<<' ';
                visited[j] = true;
                rear = (rear + 1) % MaxLength;
                q[rear] = j;
            }
            p = p -> next;
        }
    }
    cout<<endl;
}


void Check(int n, int &i, int &j)
//检查输入的边序号是否越界,如越界择重输入
{
    while (1)
    {
        if (!(i >= 0 && j <= n && j >= 0 && j <= n))
        {
            cout<<"\n输入有误!"<<endl;
            exit(1);
        }
        break;
    }
}

int main()
{
    int i;
    int n;
    int ch;

    bool *visited = new bool[MAX_SIZE];
    ADJLIST gl;

    //初始化邻接表
    InitialAdjList(gl, MAX_SIZE);


    while (1)
    {
        MainMenue();  
        cout<<"请输入你的选择: ";
        cin>>ch;

        switch (ch)
        {
        case 1:
   system("cls");
            CreatAdjList(gl, n);
            break;
        case 2:
   system("cls");
            CreatAdjMatrix(gl, n);
            break;
        case 3:
   system("cls");
            for (i = 1; i <= n; i++)
            visited[i] = false;
            DFSAdjList(gl, visited, 1, n);
            break;
        case 4:
   system("cls");
            BFSAdjList(gl, visited, 1, n);
            break;
        case 5:
            exit(1);
        default:
            cout<<"输入有误!"<<endl;
            break;
        }
    }
    return 0;
}

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值