首页技术数据结构课程设计 数据结构课程设计思路

数据结构课程设计 数据结构课程设计思路

编程之家2026-07-03617次浏览

大家好,关于数据结构课程设计很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于数据结构课程设计思路的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

数据结构课程设计 数据结构课程设计思路

数据结构课程设计是什么

.需求分析

1.运行环境

硬件:计算机486/64M以上

操作系统: WIN9x以上/WIN2000/WIN XP/WIN ME

相关软件:vistualC++

2.程序所实现的功能:

数据结构课程设计 数据结构课程设计思路

(1)建立并显示图的邻接表。

(2)深度优先遍历,显示遍历结果。

(3)对该图进行拓扑排序,显示排序结果。

(4)给出某一确定顶点到所有其它顶点的最短路径。

3.程序的输入,包含输入的数据格式和说明

(1)输入顶点数,及各顶点信息(数据格式为整形)

(2)输入边数,及权值(数据格式为整形)

4.程序的输出,程序输出的形式

(1)输出图的邻接表、深度优先遍历结果、拓扑排序结果。

(2)输入某一确定顶点到其它所有顶点的最短路径。

5.测试数据

二、设计说明

1、算法设计的思想

建立图类,建立相关成员函数。最后在主函数中实现。具体成员函数的实现请参看源程序。

2、主要的数据结构设计说明

图邻接矩阵、邻接表的建立。图的深度优先遍历、拓扑排序、顶点之间的最短路径。

3、程序的主要模板template<class Type> class Graph

4、程序的主要函数

Graph、link()、DFTraverse()、TopologicalOrder()、

TopologicalOrder()、GetVertexPos()、ShortestPath

三、上机结果及体会

1、实际完成的情况说明

主要程序参考教材《数据结构——C++版》。

2、程序的性能分析

可连续建图

3、上机过程中出现的问题及其解决方案。

编译没有错误,但结果有问题。解决方案:虽然程序的编译通过,只能说明语法上没有问题,结果只所以不正确是因为算法上原因。

4、程序中可以改进的地方说明

程序中的深度优先遍历,浪费空间较大,可以考虑用循环来做。但这样将付出代码长度度加长的代价。

5、程序中可以扩充的功能及设计实现假想

实现假想:随用户的输入可以随时动态的显示图的生成。

6、收获及体会

编写程序即是一件艰苦的工作,又是一件愉快的事情。最大的收获:编程时如果遇到看似简单但又无法解决的问题,很容易灰心丧气。此时切不可烦躁,一定要冷静的思考,认真的分析。要勇敢的面对问题,勇敢的接受问题,勇敢的处理问题,最后最勇敢的解决问题。

四、参考文献

数据结构(C++版)叶核亚主编机械工业出版社

数据结构经典算法实现与习题解答汪杰编著人民邮电出版社

数据结构课程设计苏仕华编著机械工业出版社

数据结构程序设计题典李春葆编著清华大学出版社

数据结构课程与题解(用C/C++描述)胡圣荣编著北京大学出版社

[程序运行流程图]

char op//程序控制变量

求一份数据结构课程设计报告

//class CNode.h

#ifndef __CNODE_H__

#define __CNODE_H__

#include<iostream>

using namespace std;

struct stData//出生年月结构

{

int m_nYear;

int m_nMonth;

int m_nDay;

};

struct stResult//五门课成绩结构

{

double m_dSubject_1;//自己改成绩的名称

double m_dSubject_2;

double m_dSubject_3;

double m_dSubject_4;

double m_dSubject_5;

};

struct stStudent//声明学生信息的结构

{

string m_strNumber;//学生学号

string m_strName;//姓名

char m_chSex;//性别

struct stData m_stData;//出生年月

string m_strAppearance;//政治面貌

struct stResult m_stResult;//五门课成绩

};

typedef class CNode

{

private:

struct stStudent m_stStudent;

CNode* m_Next;

public:

CNode();//构造函数

~CNode();//析构函数

void SetNodeData();//设置结点内容的函数成员

stStudent GetNodeData();//获取结点内容的函数成员

void SetNodeNext(CNode* _Next);//设置结点Next指针的函数成员

void ShowNodeData();//输出结点内容的函数成员

CNode* GetNodeNext();//获取结点Next指针的函数成员

}LinkNode;

#endif

//class CLinkList

#ifndef __CLINKLIST_H__

#define __CLINKLIST_H__

#include"CNode.h"

typedef class CLinkList

{

private:

LinkNode* m_Head;//链表的头指针

LinkNode m_Node;//链表的头结点

public:

CLinkList();//构造函数

~CLinkList();//析构函数

void CreateList();//初始化链表的函数成员

LinkNode* GetListNode(int _nIndex);//按位置查找指定位结点的成员函数

void InsertList(int _nIndex);//插入结点的成员函数

void DeleteList(int _nIndex);//删除某一结点的成员函数

LinkNode* GetHeadList();//获取头指针的成员函数

void SetListData(int _nIndex);//设置链表中某一结点的值的成员函数

void ShowListData(int _nIndex);//这个是现实链表中某一结点值的函数成员

void DestroyList(int _nIndex);//销毁某一位置以后链表的成员函数

void ShowList();//显示链表的成员函数

}LinkList;

#endif

//class CLinkList

#include"CLinkList.h"

#include"CNode.h"

CLinkList::CLinkList()

{

cout<<"这个是构造函数"<< endl;

m_Head=&m_Node;//链表的头指针指向头结点

m_Node.SetNodeNext(NULL);//将头结点的Next指针设置为NULL;

}

CLinkList::~CLinkList()

{

cout<<"这个是析构函数"<< endl;

}

void CLinkList::CreateList()//以向后追加的方式创建一个链表,输入0退出

{

int nTemp= 0;//定义一个临时变量用于标志程序结束

cout<<"欢迎来创建链表!"<< endl;

CNode* pTemp= NULL;//定义一个临时结点指针,用来增加新结点用

CNode* pNode= m_Head;//定义一个标记指针,首先叫其指向头结点

while(1)

{

pTemp= new LinkNode;

cout<<"请输入下一个结点的内容!"<< endl;

pTemp->SetNodeData();//设置链表中结点的内容

cout<<"如果想继续输入下一个学生的信息请输入 1,否则输入 0"<< endl;

cin>> nTemp;

if('0'== nTemp)

{

break;

}

pNode->SetNodeNext(pTemp);//让链尾的Next指向新建的结点

pNode= pTemp;//将结尾元素向后移

}

cout<<"创建链表结束"<< endl;

}

LinkNode* CLinkList::GetListNode(int _nIndex)

{

cout<<"这个是按位置查找指定位结点的成员函数"<< endl;

LinkNode* pNode= m_Head->GetNodeNext();//定义一个临时的结点指针,初始化指向头结点

int Temp= 0;//定义一个临时的变量,用来标记已检查结点的个数的

if(-1== _nIndex)//返回头结点(即头指针)

{

return m_Head;

}

if(_nIndex<-1)//_nIndex控制条件

{

cout<<"您输入的是错误的位置!"<< endl;

return 0;

}

while(pNode!= NULL)

{

if(_nIndex== Temp)

{

return pNode;

}

pNode= pNode->GetNodeNext();//临时结点向后移动

++Temp;

}

return pNode;//没找到结点就返回NULL

}

void CLinkList::ShowListData(int _nIndex);

void CLinkList::InsertList(int _nIndex)//插入结点的函数成员

{

cout<<"这个是插入结点的成员函数"<< endl;

LinkNode* pNode= GetListNode(_nIndex- 1);//定义一个结点类的指针,指向的是要插入位置的前一指针

LinkNode* pTemp= new CNode;//定义一个临时结点指针,用来增加新结点用

pTemp->SetNodeData();//设置插入结点的内容

pTemp->SetNodeNext(pNode->GetNodeNext());

pNode->SetNodeNext(pTemp);

}

void CLinkList::DeleteList(int _nIndex)

{

cout<<"这个是删除某一结点的成员函数"<< endl;

LinkNode* pNode= GetListNode(_nIndex- 1);//定义一个结点类的指针,指向的是要删除位置的前一指针

LinkNode* pTemp= NULL;//定义一个临时结点指针,用来指向要删除的结点

pTemp=pNode->GetNodeNext();//把pTemp指向要删除的结点

pNode->SetNodeNext(pTemp->GetNodeNext());//把pNode指向要删除的结点的后一个结点

delete pTemp;//删除结点

pTemp= NULL;

}

LinkNode* CLinkList::GetHeadList()

{

cout<<"这个是获取头指针的成员函数"<< endl;

return m_Head;

}

void CLinkList::SetListData(int _nIndex)

{

cout<<"这个是设置链表中某一结点的值的成员函数"<< endl;

CNode*pNode= GetListNode(_nIndex);//定义一个结点类的指针,指向的是要修改内容位置的结点

pNode->SetNodeData();//修改内容

}

void CLinkList::ShowListData(int _nIndex)

{

cout<<"这个是显示链表中某一结点值的成员函数"<< endl;

CNode*pNode= GetListNode(_nIndex);//定义一个结点类的指针,指向的是要获取内容位置的结点

pNode->ShowNodeData();//返回想要得到位置的结点内容

}

void CLinkList::DestroyList(int _nIndex)

{

cout<<"这个是销毁某一位置以后链表的成员函数"<< endl;

LinkNode* pTemp= GetListNode(_nIndex- 1);//定义一个结点指针,指向要销毁位置的前一结点

LinkNode* pNode= pTemp->GetNodeNext();//定义一个结点指针,指向要销毁位置的结点

while(pTemp->GetNodeNext()!= NULL)//销毁动作的结束条件或初始条件

{

pTemp->SetNodeNext(pNode->GetNodeNext());//把需要销毁的位置的前结点的Next指向销毁位置的下一个结点

delete pNode;//销毁结点

pNode= pTemp->GetNodeNext();//把pNode重新指向要销毁位置的结点

}

}

void CLinkList::ShowList()

{

cout<<"这个是显示链表的成员函数"<< endl;

int nTemp= 0;//定义一个临时的整形变量用来控制输入的个数

LinkNode* pTemp= m_Head->GetNodeNext();//定义一个结点类指针,指向第0位的结点

if(NULL== pTemp)

{

cout<<"这是个空链"<< endl;

}

while(pTemp!= NULL)

{

pTemp->ShowNodeData();

++nTemp;

if(0== nTemp% 5&& nTemp!= 0)//控制每行只能输出5个结点的内容

{

cout<< endl;

}

pTemp= pTemp->GetNodeNext();

}

}

//class CNode

#include"CNode.h"

CNode::CNode()//构造函数

{

//m_stStudent={0};

m_Next= NULL;

}

CNode::~CNode()//析构函数

{

}

void CNode::SetNodeData()

{

char* pNumber= new char[30];//用来接收字符串的临时变量

char* pName= new char[30];

char* pAppearance= new char[30];

cout<<"学生学号:"<< endl;

cin>> pNumber;

m_stStudent.m_strNumber= pNumber;

cout<<"姓名:"<< endl;

cin>> pName;

m_stStudent.m_strName= pName;

cout<<"性别:"<< endl;

cin>> m_stStudent.m_chSex;

cout<<"出生年月:"<< endl;

cout<<"m_stData.m_nYear"<< endl;

cin>> m_stStudent.m_stData.m_nYear;

cout<<"m_stData.m_nMonth"<< endl;

cin>> m_stStudent.m_stData.m_nMonth;

cout<<"m_stData.m_nDay"<< endl;

cin>> m_stStudent.m_stData.m_nDay;

cout<<"政治面貌:"<< endl;

cin>> pAppearance;

m_stStudent.m_strAppearance= pAppearance;

cout<<"五门课成绩:"<< endl;

cout<<"m_dSubject_1:"<< endl;

cin>> m_stStudent.m_stResult.m_dSubject_1;

cout<<"m_dSubject_2:"<< endl;

cin>> m_stStudent.m_stResult.m_dSubject_2;

cout<<"m_dSubject_3:"<< endl;

cin>> m_stStudent.m_stResult.m_dSubject_3;

cout<<"m_dSubject_4:"<< endl;

cin>> m_stStudent.m_stResult.m_dSubject_4;

cout<<"m_dSubject_5:"<< endl;

cin>> m_stStudent.m_stResult.m_dSubject_5;

delete []pNumber;//释放内存

pNumber= NULL;//指针置空

delete []pName;//释放内存

pName= NULL;

delete []pAppearance;//释放内存

pAppearance= NULL;

}

stStudent CNode::GetNodeData()//返回结点内容(即学生信息)

{

return m_stStudent;

}

void CNode::SetNodeNext(CNode* _Next)

{

m_Next= _Next;

}

void CNode::ShowNodeData()

{

const char* pNumber= m_stStudent.m_strNumber.c_str();//用来接收字符串的临时变量

const char* pName= m_stStudent.m_strNumber.c_str();

const char* pAppearance= m_stStudent.m_strAppearance.c_str();

cout<<"学生学号:"<< pNumber<<'\t'<<"姓名:"<< pName<<'\t'<<"性别:"<< m_stStudent.m_chSex;

cout<<"出生年月:"<< m_stStudent.m_stData.m_nYear<<','<< m_stStudent.m_stData.m_nMonth<<','<< m_stStudent.m_stData.m_nDay;

cout<<"政治面貌:"<< pAppearance<<"五门课成绩:"<< endl;

cout<<"m_dSubject_1:"<< m_stStudent.m_stResult.m_dSubject_1<< endl;

cout<<"m_dSubject_2:"<< m_stStudent.m_stResult.m_dSubject_2<< endl;

cout<<"m_dSubject_3:"<< m_stStudent.m_stResult.m_dSubject_3<< endl;

cout<<"m_dSubject_4:"<< m_stStudent.m_stResult.m_dSubject_4<< endl;

cout<<"m_dSubject_5:"<< m_stStudent.m_stResult.m_dSubject_5<< endl;

}

CNode* CNode::GetNodeNext()

{

return m_Next;

}

#include"CLinkList.h"

#include"CNode.h"

void Text();//测试函数声明

int main()

{

cout<<"这是mian函数"<< endl;

Text();

return 0;

}

void Text()

{

cout<<"这个是测试函数"<< endl;

LinkList* pList= new LinkList;//创建一个内存链表对象

cout<<"------------------CreateList-----------------------------"<< endl;

pList->CreateList();//初始化链表的函数成员

pList->ShowList();

cout<< endl;

cout<<"------------------GetListNode-----------------------------"<< endl;

LinkNode* pNode= NULL;//定义一个临时的结点类指针用于检测查找函数成员

pNode= pList->GetListNode(3);//按位置查找指定位结点的成员函数的测试

if(pNode)

{

cout<<"用按位置查找的方法找到了指定位结点"<< endl;

}

else

{

cout<<"对不起,用按位置查找的方没有找到指定位结点"<< endl;

}

cout<< endl;

cout<<"------------------InsertList-----------------------------"<< endl;

pList->InsertList(0);//插入结点的成员函数的测试

pList->ShowList();

cout<< endl;

cout<<"------------------DeleteList-----------------------------"<< endl;

pList->DeleteList(0);//删除某一结点的成员函数的测试

pList->ShowList();

cout<< endl;

cout<<"------------------GetHeadList-----------------------------"<< endl;

pNode= NULL;

pNode= pList->GetHeadList();//获取头指针的成员函数的测试

if(pNode)

{

cout<<"已经返回了头指针"<< endl;

}

else

{

cout<<"对不起,头指针为空"<< endl;

}

cout<< endl;

cout<<"------------------GetHeadList-----------------------------"<< endl;

pList->SetListData(3);//设置链表中某一结点的值的成员函数的测试

pList->ShowList();

cout<< endl;

cout<<"------------------GetListData-----------------------------"<< endl;

cout<<"pList->ShowListData(3)=";

pList->ShowListData(3);//获取链中某一结点值的成员函数的测试

cout<< endl;

cout<<"------------------DestroyList(3)-----------------------------"<< endl;

pList->DestroyList(3);//销毁第3位置以后链表的成员函数的测试

pList->ShowList();

cout<< endl;

cout<<"------------------DestroyList(0)-----------------------------"<< endl;

pList->DestroyList(0);//销毁第0位置以后链表的成员函数的测试

pList->ShowList();

cout<< endl;

delete pList;//释放内存

pList= NULL;//指针置空

}

你的要求太多,没仔细看,我把我给别人写的赋值给你吧,我已经写的很全了,程序有问题可以给我留言

急!!!数据结构课程设计

#include<iostream.h>

#include<malloc.h>

#include<stdlib.h>

#define MAX_VERTEX_NUM 30//最大顶点数

#define INFINITY 10000000//无穷大

typedef struct ArcCell{

int adj;

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct{

char vexs[MAX_VERTEX_NUM];

AdjMatrix arcs;

int vexnum,arcnum;

}MGraph;

//查询顶点位置

int LocateVex(MGraph G,char v){

int i=0;

while(G.vexs[i]!=v&&i<G.vexnum)

i++;

return i;

}

//创建图的邻接矩阵

MGraph CreateMGraph(){

MGraph G;

int i,j,k;

int w;

char v1,v2;

cout<<"请输入图的顶点数:";

cin>>G.vexnum;

cout<<"请输入图的弧数:";

cin>>G.arcnum;

for(i=0;i<G.vexnum;i++){

cout<<"请输入第"<<i+1<<"个顶点:";

cin>>G.vexs[i];

}

for(i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)

G.arcs[i][j].adj=INFINITY;

for(k=0;k<G.arcnum;k++){

cout<<"请输入弧"<<k+1<<"所关联的顶点和权值:";

cin>>v1>>v2>>w;

if(LocateVex(G,v1)<G.vexnum)

i=LocateVex(G,v1);

else{

cout<<"没有找到此顶点!"<<endl;

k--;

continue;

}

if(LocateVex(G,v2)<G.vexnum)

j=LocateVex(G,v2);

else{

cout<<"没有找到此顶点!"<<endl;

k--;

continue;

}

G.arcs[i][j].adj=w;

G.arcs[j][i]=G.arcs[i][j];

}

cout<<"MGraph创建成功!"<<endl;

return G;

}

//……………………输出MGraph…………………

void PrintMGraph(MGraph G){

cout<<"图的邻接矩阵"<<endl;

int i,j;

for(i=0;i<G.vexnum;i++)

cout<<""<<G.vexs[i];

cout<<endl;

for( i=0;i<G.vexnum;i++){

cout<<G.vexs[i]<<"";

for( j=0;j<G.vexnum;j++){

if(G.arcs[i][j].adj!=INFINITY)

cout<<G.arcs[i][j].adj<<"";

else

cout<<"∞"<<"";

}

cout<<endl;

}

cout<<"--------------------------------------------"<<endl;

}

//……………………求各个顶点的度…………………

void Vdu(MGraph G){//求各个顶点的度

int i,j;

int V[20];

for(i=0;i<G.vexnum;i++){

int count=0;

for(j=0;j<G.vexnum;j++)

if(G.arcs[i][j].adj!=INFINITY)

count++;

V[i]=count;

}

for(i=0;i<G.vexnum;i++)

cout<<endl<<"第"<<i+1<<"个顶点"<<G.vexs[i]<<"的度为:"<<V[i]<<endl;

}

//……………………插入顶点…………………

void InsertVex(MGraph&G){

char v;

int i,j;

cout<<"请输入你想插入的顶点:";

cin>>v;

i=G.vexnum++;

G.vexs[i]=v;

for(j=0;j<G.vexnum;j++)

G.arcs[i][j].adj=INFINITY;

j=G.vexnum-1;

for(i=0;i<G.vexnum;i++)

G.arcs[i][j].adj=INFINITY;

cout<<endl<<"插入成功!"<<endl;

}

//……………………插入弧…………………

void InsertArc(MGraph&G){

char v1,v2;

int i,j,w;

cout<<"请输入你要插入的弧所关联的顶点和权值:";

cin>>v1>>v2>>w;

if(LocateVex(G,v1)<G.vexnum&&LocateVex(G,v2)<G.vexnum){

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j].adj=w;

G.arcs[j][i]=G.arcs[i][j];

cout<<endl<<"插入成功!"<<endl;

}else{

cout<<"没有找到关联的顶点!"<<endl;

}

}

//……………………删除顶点…………………

void DeleteVex(MGraph&G){

int i,j;

char v;

cout<<"请输入你所要删除的顶点:";

cin>>v;

if(LocateVex(G,v)<G.vexnum){

int l=LocateVex(G,v);

for(i=l;i<G.vexnum-1;i++)

G.vexs[i]=G.vexs[i+1];

for(i=l;i<G.vexnum-1;i++)

for(j=0;j<G.vexnum;j++)

G.arcs[i][j]=G.arcs[i+1][j];

for(i=0;i<G.vexnum;i++)

for(j=l;j<G.vexnum-1;j++)

G.arcs[i][j]=G.arcs[i][j+1];

G.vexnum--;

cout<<"已成功删除此顶点!"<<endl;

}else

cout<<"没有此顶点!"<<endl;

}

//……………………删除弧…………………

void DeleteArc(MGraph&G){

int i,j;

char v1,v2;

cout<<"请输入你要删除的弧所关联的顶点";

cin>>v1>>v2;

if(LocateVex(G,v1)<G.vexnum&&LocateVex(G,v2)<G.vexnum){

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j].adj=INFINITY;

G.arcs[j][i]=G.arcs[i][j];

cout<<"已成功删除此弧!"<<endl;

}else

cout<<"没有找到此弧所关联的顶点!"<<endl;

}

typedef struct ArcNode{

int adjvex;

struct ArcNode*nextarc;

}ArcNode;

typedef struct vnode{

char data;

ArcNode*firstarc;

}vnode,adjlist;

typedef struct{

adjlist vertices[MAX_VERTEX_NUM];

int vexnum,arcnum;

}ALGraph;

//……………………创建图的邻接表…………………

ALGraph CreateUDG(MGraph G){

ALGraph gra;

int i,j;

ArcNode*arc,*tem,*p;

for(i=0;i<G.vexnum;i++){

gra.vertices[i].data=G.vexs[i];

gra.vertices[i].firstarc=NULL;

}

for(i=0;i<G.vexnum;i++){

for(j=0;j<G.vexnum;j++){

if(gra.vertices[i].firstarc==NULL){

if(G.arcs[i][j].adj!=INFINITY){

arc=(ArcNode*)malloc(sizeof(ArcNode));

arc->adjvex=j;

gra.vertices[i].firstarc=arc;

arc->nextarc=NULL;

p=arc;

j++;

while(G.arcs[i][j].adj!=INFINITY&&j<G.vexnum){

tem=(ArcNode*)malloc(sizeof(ArcNode));

tem->adjvex=j;

gra.vertices[i].firstarc=tem;

tem->nextarc=arc;

arc=tem;

j++;

}

}

}else{

if(G.arcs[i][j].adj!=INFINITY){

arc=(ArcNode*)malloc(sizeof(ArcNode));

arc->adjvex=j;

p->nextarc=arc;

arc->nextarc=NULL;

p=arc;

}

}

}

}

gra.vexnum=G.vexnum;

gra.arcnum=G.arcnum;

cout<<"ALGraph创建成功!"<<endl;

return gra;

}

//……………………输出ALGraph…………………

void PrintUDG(ALGraph gra){

int i;

ArcNode*p;

cout<<"图的各顶点为:"<<endl;

for(i=0;i<gra.vexnum;i++)

cout<<gra.vertices[i].data<<"";

cout<<endl;

cout<<"图的邻接表为:"<<endl;

for(i=0;i<gra.vexnum;i++){

cout<<i<<""<<gra.vertices[i].data;

p=gra.vertices[i].firstarc;

while(p){

cout<<"->"<<p->adjvex;

p=p->nextarc;

}

cout<<endl;

}

}

//……定义全局变量……

int visited[MAX_VERTEX_NUM];

int we;

//……求第一个邻接点……

int firstadjvex(ALGraph gra,vnode v){

if(v.firstarc!=NULL)

return v.firstarc->adjvex;

else

return-1;

}

//……求相对于w的下一个邻接点

int nextadjvex(ALGraph gra,vnode v,int w){

ArcNode*p;

p=v.firstarc;

while(p!=NULL&&p->adjvex!=w){

p=p->nextarc;

}

if(p->adjvex==w&&p->nextarc!=NULL){

p=p->nextarc;

return p->adjvex;

}else

return-1;

}

//……………………图的深度优先遍历…………………

void DFS(ALGraph gra,int i){

visited[i]=1;

int we1;

cout<<gra.vertices[i].data<<"";

for(we=firstadjvex(gra,gra.vertices[i]);we>=0;we=nextadjvex(gra,gra.vertices[i],we)){

we1=we;

if(visited[we]==0)

DFS(gra,we);

we=we1;

}

}

void DFSTravers(ALGraph gra){

int i;

for(i=0;i<gra.vexnum;i++){

visited[i]=0;

}

for(i=0;i<gra.vexnum;i++){

if(visited[i]==0)

DFS(gra,i);

}

cout<<endl;

}

//…………………………………………………………………

//……………………队列定义和基本操作……………………

typedef struct qnode{

int data;

struct qnode*next;

}qnode,*queueptr;

typedef struct{

queueptr front;

queueptr rear;

}linkqueue;

//……初始化队列………

void initqueue(linkqueue&q){

q.rear=(queueptr)malloc(sizeof(qnode));

q.front=q.rear;

q.front->next=NULL;

}

//……入队列………

int enqueue(linkqueue&q,int e){

queueptr p;

p=(queueptr)malloc(sizeof(qnode));//系统生成qnode节点并赋予p

if(!p)

return 0;

else{

p->data=e;

p->next=NULL;

q.rear->next=p;

q.rear=p;

return 1;

}

}

//……出队列……

int dequeue(linkqueue&q,int&e){

queueptr p;

if(q.front==q.rear)

return 0;

p=q.front->next;

e=p->data;

q.front->next=p->next;

if(q.rear==p)

q.rear=q.front;

free(p);

return 1;

}

//……判断队列是否为空……

int queueempty(linkqueue q){

if(q.front==q.rear)

return 1;

return 0;

}

//………………………………………………………………………

//……………………图的广度优先遍历…………………

void BFSTravers(ALGraph gra){

int i,e;

linkqueue q;

for(i=0;i<gra.vexnum;i++)

visited[i]=0;

initqueue(q);//附设队列存储已经被访问的路径长度为1 2...的顶点

for(i=0;i<gra.vexnum;i++)

if(!visited[i]){

visited[i]=1;

cout<<gra.vertices[i].data<<"";

enqueue(q,i);

while(!queueempty(q)){

dequeue(q,e);

for(we=firstadjvex(gra,gra.vertices[e]);we>=0;we=nextadjvex(gra,gra.vertices[e],we)){

if(!visited[we]){

visited[we]=1;

cout<<gra.vertices[we].data<<"";

enqueue(q,we);

}

}

}

}

cout<<endl;

}

//……………………求图的连通分支…………………

void DFSTraversFL(ALGraph gra){

int i,count=1;

for(i=0;i<gra.vexnum;i++){

visited[i]=0;

}

for(i=0;i<gra.vexnum;i++){

if(visited[i]==0){

cout<<"第"<<count<<"个连通分支为:";

DFS(gra,i);//对连通图,只需从一个顶点出发深度优先遍历即可访问所有顶点

cout<<endl;

count++;

}

}

}

//……………………用普里姆算法求最小生成树…………………

void PRIM(ALGraph gra,int g[][MAX_VERTEX_NUM],int n){

int lowcost[MAX_VERTEX_NUM],prevex[MAX_VERTEX_NUM];

int i,j,k,min;

for(i=2;i<=n;i++){

lowcost[i]=g[1][i];

prevex[i]=1;

}

lowcost[1]=0;

for(i=2;i<=n;i++){

min=INFINITY;

k=0;

for(j=2;j<=n;j++)

if(lowcost[j]<min&&lowcost[j]!=0){

min=lowcost[j];

k=j;

}

cout<<gra.vertices[prevex[k]-1].data<<""<<gra.vertices[k-1].data<<""<<min;

lowcost[k]=0;

for(j=2;j<=n;j++)

if(g[k][j]<lowcost[j]){

lowcost[j]=g[k][j];

prevex[j]=k;

}

cout<<endl;

}

}

//…………求最短路径…………

void ShortPath(MGraph G,char ch){//迪杰斯特拉算法实现,某点到其余各点

int i,j,min,k,t,w;

int v=0;

int final[MAX_VERTEX_NUM];

int lowcost[MAX_VERTEX_NUM];

int q[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

k=LocateVex(G,ch);

for(i=0;i<G.vexnum;i++){

final[i]=0;

lowcost[i]=G.arcs[k][i].adj;

for(j=0;j<G.vexnum;j++)

q[i][j]=0;

if(lowcost[i]<INFINITY){

q[i][k]=1;

q[i][i]=1;

}

}

lowcost[k]=0;

final[k]=1;

for(i=0;i<G.vexnum;i++){

min=INFINITY;

for(j=0;j<G.vexnum;j++)

if(!final[j])

if(lowcost[j]<min){

min=lowcost[j];

v=j;

}

final[v]=1;

for(w=0;w<G.vexnum;w++)

if(!final[w]&&(min+G.arcs[v][w].adj<lowcost[w])){

lowcost[w]=min+G.arcs[v][w].adj;

for(t=0;t<G.vexnum;t++)

q[w][t]=q[v][t];

q[w][w]=1;

}

}

for(i=0;i<G.vexnum;i++){

if(i!=k){

cout<<ch<<" to"<<G.vexs[i]<<endl;

cout<<"最短路径:";

if(lowcost[i]<INFINITY){

for(j=0;j<G.vexnum;j++)

if(q[i][j]&&j!=i)

cout<<G.vexs[j]<<"";

cout<<G.vexs[i];

cout<<"长度:"<<lowcost[i]<<endl;

}else

cout<<"不存在!"<<endl;

}

}

}

typedef struct CSNode{

char data;

struct CSNode*firstchild,*nextsibling;

}CSNode,*CSTree;

//……………………深度优先生成树…………………

void DFSTree(ALGraph gra,int v,CSTree&T){//深度优先搜索后顺序输出

visited[v]=1;

int w,first=1;

CSTree p,q;

for(w=firstadjvex(gra,gra.vertices[v]);w>=0;w=nextadjvex(gra,gra.vertices[v],w))

if(!visited[w]){

p=(CSTree)malloc(sizeof(CSNode));

p->data=gra.vertices[w].data;

p->firstchild=NULL;

p->nextsibling=NULL;

if(first){

T->firstchild=p;

first=0;

}else

q->nextsibling=p;

q=p;

DFSTree(gra,w,q);

}

}

void DFSForest(ALGraph gra,CSTree&T){

T=NULL;

CSTree p,q;

int v;

for(v=0;v<gra.vexnum;v++)

visited[v]=0;

for(v=0;v<gra.vexnum;v++)

if(!visited[v]){

p=(CSTree)malloc(sizeof(CSNode));

p->data=gra.vertices[v].data;

p->firstchild=NULL;

p->nextsibling=NULL;

if(!T)

T=p;

else

q->nextsibling=p;

q=p;

DFSTree(gra,v,p);

}

}

//……………………先序遍历深度优先生成树…………………

void Preorder(CSTree T){

if(T){

cout<<T->data<<"";

Preorder(T->firstchild);

Preorder(T->nextsibling);

}

cout<<endl;

}

//……………………求u到v之间的最短路径…………………

void shortestdistance(MGraph G){

int i,u,v,w,S,E;

char start,end;

int Distance[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

cout<<"请输入两个顶点:";

cin>>start>>end;

while(LocateVex(G,start)>=G.vexnum||LocateVex(G,end)>=G.vexnum){

cout<<"没有找到关联的顶点!请重新输入:";

cin>>start>>end;

}

for(i=0;i<G.vexnum;i++)

G.arcs[i][i].adj=0;

for(u=0;u<G.vexnum;u++)

for(v=0;v<G.vexnum;v++)

Distance[u][v]=G.arcs[u][v].adj;

for(u=0;u<G.vexnum;u++)

for(v=0;v<G.vexnum;v++)

for(w=0;w<G.vexnum;w++)

if(Distance[u][w]+Distance[w][v]<Distance[u][v])

Distance[u][v]=Distance[u][w]+Distance[w][v];

S=LocateVex(G,start);

E=LocateVex(G,end);

if(Distance[S][E]==INFINITY)

cout<<start<<"到"<<end<<"的最短路径不存在!"<<endl;

else

cout<<start<<"到"<<end<<"的最短路径为:"<<Distance[S][E]<<endl;

}

//……………………求所有顶点之间的最短路径…………………

void shortdistance(MGraph G){//弗洛依德算法实现,任意两顶点

int i,j,u,v,w;

int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

for(i=0;i<G.vexnum;i++)

G.arcs[i][i].adj=0;

for(u=0;u<G.vexnum;u++)

for(v=0;v<G.vexnum;v++)

D[u][v]=G.arcs[u][v].adj;

for(u=0;u<G.vexnum;u++)

for(v=0;v<G.vexnum;v++)

for(w=0;w<G.vexnum;w++)

if(D[u][w]+D[w][v]<D[u][v])

D[u][v]=D[u][w]+D[w][v];

for(i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)

if(D[i][j]==INFINITY)

cout<<G.vexs[i]<<"到"<<G.vexs[j]<<"的最短路径不存在!"<<endl;

else

cout<<G.vexs[i]<<"到"<<G.vexs[j]<<"的最短路径为:"<<D[i][j]<<endl;

}

void main(){

int i,j;

char ch='y';

MGraph G;

G.vexnum=0;

ALGraph gra;

gra.vexnum=0;

int t[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

CSTree T=NULL;

while(ch=='y'){

cout<<"************************************************************"<<endl;

cout<<" MENU"<<endl;

cout<<"************************************************************"<<endl;

cout<<""<<"1|利用邻接矩阵创建图"<<endl;

cout<<""<<"2|显示图的邻接矩阵"<<endl;

cout<<""<<"3|求各顶点的度"<<endl;

cout<<""<<"4|插入顶点"<<endl;

cout<<""<<"5|插入弧"<<endl;

cout<<""<<"6|删除顶点"<<endl;

cout<<""<<"7|删除弧"<<endl;

cout<<""<<"8|用邻接矩阵创建邻接表UDG"<<endl;

cout<<""<<"9|显示图的邻接表"<<endl;

cout<<""<<"10|深度优先便利序列"<<endl;

cout<<""<<"11|广度优先便利序列"<<endl;

cout<<""<<"12|图的连通分支"<<endl;

cout<<""<<"13|求连通图最小生成树"<<endl;

cout<<""<<"14|求任意顶点到其它顶点的最短路径"<<endl;

cout<<""<<"15|求图的深度优先生成树"<<endl;

cout<<""<<"16|对生成树进行先序遍历"<<endl;

cout<<""<<"17|求两点间的最短路径"<<endl;

cout<<""<<"18|求所有点之间的最短路径"<<endl;

cout<<""<<"0|退出!"<<endl;

cout<<"***********************************************************"<<endl;

cout<<endl<<"请选择你要进行的操作:";

cin>>i;

switch(i){

case 1:

if(G.vexnum==0)

G=CreateMGraph();

else

cout<<"MGraph已经创建!"<<endl;

break;

case 2:

if(G.vexnum!=0)

PrintMGraph(G);

else

cout<<"MGraph为空!"<<endl;

break;

case 3:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

Vdu(G);

break;

case 4:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

InsertVex(G);

break;

case 5:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

InsertArc(G);

break;

case 6:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

DeleteVex(G);

break;

case 7:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

DeleteArc(G);

break;

case 8:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else{

gra=CreateUDG(G);

}

break;

case 9:

if(gra.vexnum!=0)

PrintUDG(gra);

else

cout<<"UDG为空!"<<endl;

break;

case 10:

if(gra.vexnum!=0){

cout<<"图的深度优先遍历序列为:";

DFSTravers(gra);

}

else

cout<<"请先创建ALGraph!"<<endl;

break;

case 11:

if(gra.vexnum!=0){

cout<<"图的广度优先遍历序列为:";

BFSTravers(gra);

}

else

cout<<"请先创建ALGraph!"<<endl;

break;

case 12:

if(gra.vexnum!=0){

cout<<"图的连通分支如下:"<<endl;

DFSTraversFL(gra);

}

else

cout<<"请先创建ALGraph!"<<endl;

break;

case 13:

if(gra.vexnum!=0){

for(i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++)

t[i+1][j+1]=G.arcs[i][j].adj;

cout<<"图的最小生成树为:"<<endl;

PRIM(gra,t,G.vexnum);

}

else

cout<<"请先创建ALGraph!"<<endl;

break;

case 14:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else{

char ch;

cout<<"请选择一个顶点:";

cin>>ch;

while(LocateVex(G,ch)>=G.vexnum){

cout<<"没有找到此顶点!请重新选择一个顶点:";

cin>>ch;

}

ShortPath(G,ch);

}

break;

case 15:

if(gra.vexnum==0)

cout<<"请先创建ALGraph!"<<endl;

else

DFSForest(gra,T);

break;

case 16:

if(!T)

cout<<"请先求深度优先生成树!"<<endl;

else{

Preorder(T);

cout<<"深度优先生成树已成功创建!"<<endl;

}

break;

case 17:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

shortestdistance(G);

break;

case 18:

if(G.vexnum==0)

cout<<"请先创建MGraph!"<<endl;

else

shortdistance(G);

break;

case 0:

exit(1);

default:

cout<<"请在0~18之间进行选择!"<<endl;

}

cout<<"是否继续y/n:";

cin>>ch;

system("cls");

}

}

OK,关于数据结构课程设计和数据结构课程设计思路的内容到此结束了,希望对大家有所帮助。

php正则表达式手册,php正则表达式教程struts工作原理,简述SSH的工作原理