邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径

邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径

我现在是大一刚刚结束,这个小项目是我们这学期数据结构的实训任务之一,如有不足,望大家指正。一学期的网课结束了,但感觉学习数据结构这门专业课挺无聊挺吃力的,感觉网课让我懈怠了不少,接下来我会不断的写博客,关于C语言程序设计基础,和数据结构的相关要点讲解和知识点,希望在这个暑假可以和大家共同进步。卑微求赞,求赞,求赞…
其中存盘读盘的文件路径根据个人进行修改。

#include 
using namespace std;
#include 
#include 
#include
#include
#include
#define MVNum 100
#define MaxInt 32767
#define error 0
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int status;

typedef struct
{
	VerTexType vexs[MVNum];
	ArcType arcs[MVNum][MVNum];
	int vexnum, arcnum;
}AMGraph;

int LocateVex(AMGraph G, VerTexType x)/*求顶点位置函数*/
{
	int j = error, k;
	for (k = 0; k<G.vexnum; k++)
		if (G.vexs[k] == x)
		{
			j = k;
			break;
		}
	return(j);
}

status CreateUDN(AMGraph &G)
{
	void Cunpan(AMGraph G);
	int i, j, k, w;
	VerTexType v1, v2;
	printf("请输入有向网的总顶点数和总边数(用空格隔开):\n");
	cin >> G.vexnum >> G.arcnum;
	printf("依次输入顶点的名称(如a):\n");

	for (i = 0; i<G.vexnum; ++i)
	{
		printf("请依次输入第%d个顶点:", i + 1);
		cin >> G.vexs[i];
	}

	for (i = 0; i<G.vexnum; ++i)
	{
		for (j = 0; j<G.vexnum; ++j)
			G.arcs[i][j] = MaxInt;
	}
	printf("请输入各条边依附的顶点及权值(如a b 5)其中a为弧尾:\n");

	for (k = 0; k<G.arcnum; ++k)
	{
		printf("请输入第%d条边依附的顶点及权值:", k + 1);
		cin >> v1 >> v2 >> w;
		i = LocateVex(G, v1); j = LocateVex(G, v2);
		G.arcs[i][j] = w;
	}
	Cunpan( G );

	return OK;
}


void Cunpan(AMGraph G)
{
	int i, j;
	ofstream  outFile;
	//  打开文件。  下面路径根据自己情况做修改。
	outFile.open("D:\\GGtestC\\data.txt");

	for (i = 0; i<G.vexnum; i++)    //写入数据
	{
		outFile << G.vexs[i];
		if (i == G.vexnum-1)
			outFile << endl;
	}
	//AMGraph G;
	for (i = 0; i<G.vexnum; ++i)
	{
		for (j = 0; j<G.vexnum; ++j)
		{
			if (G.arcs[i][j] != MaxInt)
				outFile << G.arcs[i][j];
			else
				outFile << "∞";
		}
		outFile << endl;
	}
	outFile.close();  //关闭文件
}

void Dupan()
{
    ifstream infile("D:\\GGtestC\\data.txt", ios::in);
    if(!infile.fail())
    {
        while(!infile.eof())
        {
            string str5;
            infile>>str5;
            cout<<str5<<endl;
        }
    }
	infile.close();
}


void ShortestPath_DIJ(AMGraph G , int v0)
{
int n,v,w,i,min,q;
int s[100],d[100],path[100];
    n=G.vexnum;
    for(v=0;v<n;++v)
    {
        s[v]=false;
        d[v]=G.arcs[v0][v];
        if(d[v]<MaxInt) path[v]=v0;
        else path[v]=-1;
    }
    s[v0]=true;
    d[v0]=0;

    for(i=1;i<n;++i)
    {
        min=MaxInt;
        for(w=0;w<n;++w)
         if(!s[w]&&d[w]<min)
         {v=w;min=d[w];}
        s[v]=true;
        for(w=0;w<n;++w)
            if(!s[w]&&(d[v]+G.arcs[v][w]<d[w]))
        {
            d[w]=d[v]+G.arcs[v][w];
            path[w]=v;
        }
    }
    printf("请输入想要求最短路径终点的下标:");
    scanf("%d",&q);
    printf("\n该最短路径为:%d\n\n",d[q]);
    printf("具体路径如下:");
    printf("%c",G.vexs[q]);
    q=path[q];
    while(path[q]!=-1)
    {
        printf("<--%c",G.vexs[q]);
        q=path[q];
    }
    printf("<--%c",G.vexs[q]);
}


int main()
{
	printf("**************邻接矩阵表示法创建的有向网**************\n");
	int i, j,v0;
	AMGraph G;
	CreateUDN(G);

	for (i = 0; i<G.vexnum; ++i)
	{
		for (j = 0; j<G.vexnum; ++j)
		{
			if (G.arcs[i][j] != MaxInt)
				cout << G.arcs[i][j] << "\t";
			else
				cout << "∞" << "\t";
		}
		cout << endl << endl;
	}
	cout << endl;
	int a;
    printf("是否需要读盘(1 or 0):");
    scanf("%d",&a);
      if(a)
      {
          Dupan();
      }
printf("\n***************迪杰斯特拉算法求最短路径*************\n");
        printf("顶点名称:");
        for(i=0;i<G.vexnum;i++)
        {
            printf("%c  ",G.vexs[i]);
        }printf("\n");
        printf("顶点下标:");
        for(i=0;i<G.vexnum;i++)
        {
            printf("%d  ",i);
        }printf("\n");
        printf("请输入起始顶点的下标:");
        scanf("%d",&v0);
      ShortestPath_DIJ( G,v0);
	return 0;
}

运行结果如下:

输入下图有向网
邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径_第1张图片
输入该网的数据
邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径_第2张图片
存盘读盘效果,左为读盘,右为存盘
邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径_第3张图片
迪杰斯特拉求最短路径
邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径_第4张图片

你可能感兴趣的:(数据结构期末实训,C语言程序设计)