中南大学课程设计报告题目数据结构课程设计学生姓名指导教师漆华妹学院信息科学与工程学院专业班级学号完成时间 2011年07月目录第一章、需求分析 (2)第二章、概要设计 (2)2.1设定图的抽象数据类型 (2)2.2设定队列的抽象数据类型 (3)2.3本程序包含的功能模块 (3)第三章、详细设计 (3)3.1顶点、边和图的类型 (6)3.2队列类型 (8)3.3主程序和其他伪码算法 (9)第四章、调试分析 (9)第五章、用户手册 (9)第六章、测试结果 (10)第七章、心得体会 (10)附:源程序代码 (11)图遍历的演示题目:试设计一个程序,演示在连通的无向图上访问全部结点的操作第一章、需求分析1、以邻接多重表为存储结构;2、实现连通和非连通的无向图的深度优先和广度优先遍历;3、要求利用栈实现无向图的深度优先遍历;4、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集;5、用凹入表打印生成树;6、求出从一个结点到另外一个结点,但不经过另外一个指定结点的所有简单路径;6、本程序用C语言编写,在C-Free3.5环境下通过。
第二章、概要设计1、设定图的抽象数据类型:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为点集.数据关系R:R={VR}VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径} 基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合.操作结果:按V和VR是定义构造图G.DestroyGraph(&G)初始条件:图G存在操作结果:销毁图GLocateVex(G,u)初始条件: 图G存在,u和G中顶点有相同的特征操作结果:若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息GetVex(G,v)初始条件: 图G存在,v是G中顶点操作结果:返回v的值FirstAjvex(G,v)初始条件: 图G存在,v是G中顶点操作结果:返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空NextAjvex(G,v,w)初始条件: 图G存在,v是G中顶点,w是v的邻接顶点操作结果:返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空DeleteVexx(&G,v)初始条件: 图G存在,v是G中顶点操作结果:删除顶点v已经其相关的弧DFSTraverse(G,visit())初始条件: 图G存在,visit的顶点的应用函数操作结果: 对图进行深度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败BFSTraverse(G,visit())初始条件: 图G存在,visit的顶点的应用函数操作结果:对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败}ADT Graph2、设定队列的抽象数据类型:ADT Queue{数据对象:D={ai|ai属于Elemset,i=1,2….,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于D,i=1,2,…,n}约定ai为端为队列头,an为队列尾基本操作:InitQueue(&Q)操作结果:构造一个空队列QDestryoQueue(&Q)初始条件:队列Q已存在。
操作结果:队列Q被销毁,不再存在。
EnQueue(&Q,e)初始条件:队列Q已经存在操作结果:插入元素e为Q的新的队尾元素DeQueue(&Q,&E)初始条件:Q为非空队列操作结果:删除Q的队尾元素,并用e返回其值QueueEmpty(Q)初始条件:队列已经存在操作结果:若队列为空,则返回TRUE,否则返回FLASE}ADT Queue3、本程序包含四个模块:1)主程序模块void main (){手动构造一个图;进行深度优先遍历图;进行广度优先遍历图;};2)手动构造一个图-自己输入图的顶点和边生成一个图;3)进行深度优先遍历图-打出遍历的结点序列和边集;4)进行广度优先遍历图-打出遍历的结点序列和边集;第三章、详细设计1、顶点,边和图类型#define MAX_INFO 10 /* 相关信息字符串的最大长度+1 */#define MAX_VERTEX_NUM 20 /* 图中顶点数的最大值*/int visited[MAX_VERTEX_NUM]; /*全局变量,访问标志数组 */typedef char InfoType; /*相关信息类型*/typedef char VertexType; /* 字符类型 */typedef enum{unvisited,visited}VisitIf;typedef struct EBox /*边结点类型*/{int mark; /*访问标记 */int ivex,jvex; /*该边依附的两个顶点位置*/struct EBox *ilink,*jlink; /*分别指向依附这两个顶点的下一条边 */}EBox;typedef struct VexBox /*顶点结点类型*/{char data[MAX_LEN];EBox *fistedge; /*指向第一条依附该顶点的边*/}VexBox;typedef struct{VexBox list[MAX_VERTEX_NUM];int vexnum,edgenum; /*无向图当前顶点数和边数 */}AMLGraph;图的基本操作如下:int LocateVex(AMLGraph G,VertexType u);//查G和u有相同特征的顶点,若存在则返回该顶点在无向图中位置;否则返回-1。
VertexType& GetVex(AMLGraph G,int v);//以v返回邻接多重表中序号为i的顶点。
int FirstAdjVex(AMLGraph G,VertexType v);//返回v的第一个邻接顶点的序号。
若顶点在G中没有邻接顶点,则返回-1。
int NextAdjVex(AMLGraph G,VertexType v,VertexType w);//返回v的(相对于w的)下一个邻接顶点的序号若w是v的最后一个邻接点,则返回-1。
void CreateGraph(AMLGraph &G);//采用邻接多重表存储结构,构造无向图G。
Status DeleteArc(AMLGraph &G,VertexType v,VertexType w);//在G中删除边<v,w>。
Status DeleteVex(AMLGraph &G,VertexType v);//在G中删除顶点v及其相关的边。
void DestroyGraph(AMLGraph &G);//销毁一个图void Display(AMLGraph G);//输出无向图的邻接多重表G。
void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType));//从start顶点起,(利用栈非递归)深度优先遍历图G。
void BFSTraverse(AMLGraph G,VertexType start,int(*Visit)(VertexType));//从start顶点起,广度优先遍历图G。
void MarkUnvizited(AMLGraph G);//置边的访问标记为未被访问。
其中部分操作的算法如下:void CreateGraph(AMLGraph *p) /*创建无向图 */ {int i,j,k;EBox *q;printf("\n\t\t\t请输入图的结点个数和边的个数:");/*输入图的结点数和边数*/scanf("%d,%d",&p->vexnum,&p->edgenum);for(i=1;i<=p->vexnum;i++){ printf("\n\t\t\t请输入结点%d的名称:",i);/*输入顶点数据信息*/scanf("%s",p->list[i].data);p->list[i].fistedge=NULL; /*初始化指针*/ }for(k=0;k<p->edgenum;k++) /*输入各边并构造多重链表*/ { printf("\n\t\t\t请输入互相有关联的两个结点:");scanf("%d,%d",&i,&j);q=(EBox *)malloc(sizeof(EBox));q->mark=0; /*对边结点赋值*/q->ivex=i;q->ilink=p->list[i].fistedge;q->jvex=j;q->jlink=p->list[j].fistedge;p->list[i].fistedge=p->list[j].fistedge=q; /*完成边在链头的插入*/}printf("\n");}void DFS(AMLGraph *p, int v){ /*对第v个顶点的深度优先遍历 */int w;EBox *q;visited[v]=1; /*标记已访问结点 */printf("%s ",p->list[v].data);for(q=p->list[v].fistedge;q!=NULL;){if(q->ivex==v){w=q->jvex; q=q->jlink;}else{w=q->ivex; q=q->ilink;}if(!visited[w]) DFS(p,w); /*对尚未访问的点调用DFS*/}}void DFSTraverse(AMLGraph *p,int n){ /*深度优先遍历 */int v;printf("\n\t\t\t");for(v=1;v<=p->vexnum;v++)visited[v]=0; *访问标志数组初始化*/ DFS(p,n); /*对起始顶点调用DFS*/ for(v=1;v<=p->vexnum;v++)if(!visited[v]) DFS(p,v); /*对尚未访问的顶点调用DFS*/printf("\n");}2、队列类型typedef int QelemType;typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear; /* 队头、队尾指针 */}LinkQueue;队列的基本操作如下:Status InitQueue(LinkQueue &Q);//构造一个空队列Q。