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


前言

博主是一名大二的学生,数据结构课题是城市最少交通时间,由于需要图形界面,所以自学了一点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时安装了多个版本(打包版本要与编辑版本一致)。
在这里插入图片描述

最终效果展示

在这里插入图片描述
以上就是今天我要分享的内容,感谢阅读。

  • 3
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值