数据结构课设:最短路径图形界面(C++)

文章目录

  • 前言
  • 一、QT是什么?
  • 二、课程设计
    • 1.结点设计
    • 2.构造函数
    • 3.获取顶点和边的信息
    • 4.Floyd算法
    • 5.路径输出
  • 三、图形界面UI(一些细节,篇幅有限)
    • 1.固定窗口
    • 2.画箭头
  • 四、打包
  • 最终效果展示


前言

博主是一名大二的学生,数据结构课题是城市最少交通时间,由于需要图形界面,所以自学了一点QT(B站的视频),基于C++所学知识和Floyd算法完成了课程设计。本文是我的课设报告分享,之后如果有需要会分享打包好的程序和源码供大家参考。


一、QT是什么?

QT是一个跨平台的 C++ 开发库,是一个跨平台的C++图形用户界面应用程序框架,主要用来开发图形用户界面。

二、课程设计

1.结点设计

template<class T>
struct EdgeType
{
    T head, tail;
    int cost;
    EdgeType(T h = 0, T t = 0, int c = 0)
    {
        head = h; tail = t; cost = c;
    }
};
template<class T>
struct Edge
{
    T adjvex;
    int lowcost;
};
template<class T>

2.构造函数

template<class T>
void MGraph<T>::create(QVector<T> v, int n, int e)
{
    vexnum = n;
    edgenum = e;
    vexs.resize(vexnum);
    edges.resize(vexnum);
    for (int i = 0; i < n; i++)
        edges[i].resize(vexnum);
    for (int i = 0; i < n; i++)
        vexs[i] = v[i];
    //初始化edges数组
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i == j)
                edges[i][j] = 0;
            else
                edges[i][j] = INT_MAX;
        }
    }
}

3.获取顶点和边的信息

//返回顶点数
template<class T>
int MGraph<T>::VexterNum()
{
    return vexnum;
}
//返回边数
template<class T>
int MGraph<T>::EdgeNum()
{
    return edgenum;
}
//得到对应位置的顶点值
template<class T>
T MGraph<T>::GetVexValue(int i)
{
    return vexs[i];
}
//得到相应值的顶点位置
template<class T>
int MGraph<T>::GetVexValueNum(T v)
{
    int i;
    for (i = 0; i < vexnum; i++)
        if (vexs[i] == v)
            return i;
    return -1;
}
template<class T>
int MGraph<T>::GetEdgeValue(int i, int j)
{
    return edges[i][j];
}

4.Floyd算法

//Floyd最短路径算法
template<class T>
void MGraph<T>::Floyd(QVector<QVector<int> >& Path, QVector<QVector<int> >& D)
{
    for (int i = 0; i < vexnum; i++)
        for (int j = 0; j < vexnum; j++)
        {
            if (i == j)
                D[i][j] = 0;
            else
                D[i][j] = GetEdgeValue(i, j);
            if (D[i][j] < INT_MAX)
                Path[i][j] = j;
            else
                Path[i][j] = -1;
        }
    for (int k = 0; k < vexnum; k++)
        for (int i = 0; i < vexnum; i++)
            for (int j = 0; j < vexnum; j++)
                if (D[i][j] > D[i][k] + D[k][j] && D[i][k] != INT_MAX && D[k][j] != INT_MAX)
                {
                    D[i][j] = D[i][k] + D[k][j];
                    Path[i][j] = Path[i][k];
                }
}

5.路径输出

template<class T>
void MGraph<T>::OutputPath(QVector<int>& minpath,QVector<QVector<int> >& Path,T sta,T end)
{
    int i = GetVexValueNum(sta);
    int j = GetVexValueNum(end);
    int tempi = i;
    minpath.push_back(tempi);
    while (j != Path[tempi][j])
    {
        tempi = Path[tempi][j];
        minpath.push_back(tempi);
    }
    minpath.push_back(j);
}

三、图形界面UI(一些细节,篇幅有限)

1.固定窗口

为了突出对比,对显示区域和空间区域喷涂了不同的背景

    setFixedSize(1400,1000);
        QPixmap pix;
    pix.load(":\\background\\photo8.jpg");//1,4,5,6,8,9,11
    painter.drawPixmap(0,0,900,1000,pix);
    pix.load(":\\background\\photo1.jpg");//1,4,5,6,8,9,11
    painter.drawPixmap(900,0,500,1000,pix);

2.画箭头

QT没有自带画箭头操作,我们画两条线段实现

        float x1=begin.x();
        float y1=begin.y();
        float x2=mid.x();
        float y2=mid.y();
        double angle=atan2(y2-y1,x2-x1);    //中点添加箭头
        float l=50;
        float a=0.5;
        float nx1=x2-l*cos(angle-a);
        float ny1=y2-l*sin(angle-a);
        float nx2=x2-l*cos(angle+a);
        float ny2=y2-l*sin(angle+a);
        QPoint newpoint1(nx1,ny1);
        QPoint newpoint2(nx2,ny2);
        painter.drawLine(mid,newpoint1);
        painter.drawLine(mid,newpoint2);

四、打包

当我以为一切大功告成的时候,打包又出了问题。Qt自带打包windeplouqt。
打包的目的是让没有安装Qt的人也可以运行程序,然而它却提示我缺少******dll文件。无可奈何,找到了这个dll文件放到当前目录下,然后自信的点击exe文件,再次报错。。。。
痛定思痛,突然想到安装Qt时安装了多个版本(打包版本要与编辑版本一致)。
数据结构课设:最短路径图形界面(C++)_第1张图片

最终效果展示

数据结构课设:最短路径图形界面(C++)_第2张图片
以上就是今天我要分享的内容,感谢阅读。

你可能感兴趣的:(c++,数据结构,算法)