图的基本操作与实现的课程设计报告

合集下载

cadcam课程设计实验报告

cadcam课程设计实验报告

cadcam课程设计实验报告一、课程目标知识目标:1. 学生能理解CAD/CAM的基本概念,掌握其应用领域及发展历程。

2. 学生能掌握CAD/CAM软件的基本操作,如绘图、编辑、建模、渲染等。

3. 学生能了解CAD/CAM技术在制造业中的实际应用,如模具设计、数控编程等。

技能目标:1. 学生能运用CAD软件进行二维和三维图形的绘制,具备一定的设计能力。

2. 学生能运用CAM软件对设计好的图形进行加工路径的生成和仿真,具备基本的加工操作能力。

3. 学生能通过CAD/CAM软件解决实际问题,具备一定的创新能力和实践能力。

情感态度价值观目标:1. 学生通过学习CAD/CAM课程,培养对制造业的兴趣和热情,增强职业认同感。

2. 学生在学习过程中,培养团队协作、沟通交流的能力,养成良好的学习习惯。

3. 学生能认识到CAD/CAM技术在现代制造业中的重要性,树立正确的科技观和创新意识。

课程性质:本课程为实验课程,注重实践操作和实际应用,结合理论教学,提高学生的实际操作能力和创新能力。

学生特点:本课程面向初中年级学生,学生对新鲜事物充满好奇,动手能力强,但理论知识相对薄弱。

教学要求:教师应注重理论与实践相结合,引导学生主动参与实践,提高学生的操作技能和解决问题的能力。

同时,关注学生的个体差异,因材施教,使每个学生都能在课程中收获成果。

通过课程目标的分解和实施,确保教学设计和评估的有效性。

二、教学内容1. CAD/CAM基本概念与历史发展- CAD/CAM定义及其相互关系- CAD/CAM发展历程及趋势2. CAD软件操作与绘图技巧- 软件界面及基本工具介绍- 二维图形绘制与编辑- 三维建模与渲染3. CAM软件加工路径生成与仿真- 数控加工基础知识- 加工路径策略及参数设置- 加工仿真与优化4. CAD/CAM技术在制造业的应用实例- 模具设计与制造- 数控编程与加工- 产品设计与创新5. 实践操作与案例分析- 实践项目设计与实施- 学生作品展示与评价- 行业案例分析及讨论教学内容安排与进度:第一周:CAD/CAM基本概念与历史发展第二周:CAD软件操作与绘图技巧第三周:CAM软件加工路径生成与仿真第四周:CAD/CAM技术在制造业的应用实例第五周:实践操作与案例分析教材章节关联:《CAD/CAM技术与应用》第一章:CAD/CAM概述《CAD/CAM技术与应用》第二章:CAD软件操作《CAD/CAM技术与应用》第三章:CAM软件加工《CAD/CAM技术与应用》第四章:CAD/CAM应用实例教学内容确保科学性和系统性,注重理论与实践相结合,引导学生掌握CAD/CAM技术的基本知识和操作技能,提高实际应用能力。

ps图形处理课程设计

ps图形处理课程设计

ps图形处理课程设计一、教学目标本节课的教学目标是让学生掌握PS图形处理的基本知识和技能,能够运用PS 进行简单的图形设计和处理。

具体来说,知识目标包括了解PS的基本界面和工具栏,掌握PS的基本操作,如选择、裁剪、调整颜色等;技能目标包括能够运用PS 进行简单的图形设计,如制作简单的海报、图片处理等;情感态度价值观目标包括培养学生对PS图形处理的兴趣,提高学生的创造力和审美能力。

二、教学内容本节课的教学内容主要包括PS的基本概念、基本工具和基本操作。

首先,介绍PS的基本界面和工具栏,使学生熟悉PS的工作环境。

然后,讲解PS的基本操作,如选择工具、裁剪工具、调整颜色等,并通过实际操作让学生掌握这些工具的使用方法。

最后,通过实际案例,如制作简单的海报,让学生运用所学的知识和技能进行实际操作。

三、教学方法本节课采用讲授法、演示法和实验法相结合的教学方法。

首先,通过讲授法向学生介绍PS的基本概念和基本操作。

然后,通过演示法向学生展示如何运用PS 进行图形设计,使学生直观地了解PS的使用方法。

最后,通过实验法,让学生实际操作PS,巩固所学的知识和技能。

四、教学资源本节课的教学资源主要包括教材、多媒体资料和实验设备。

教材为学生提供了PS的基本知识和操作方法,是学生学习的主要参考资料。

多媒体资料包括图片、视频等,用于辅助教学,使学生更加直观地了解PS的使用方法。

实验设备包括计算机、投影仪等,用于演示和实验操作。

通过这些教学资源的运用,为学生提供了丰富的学习体验,提高了学生的学习效果。

五、教学评估本节课的教学评估主要包括平时表现、作业和考试三个部分。

平时表现主要评估学生在课堂上的参与程度、提问回答等情况,通过观察学生的表现来了解他们的学习状态。

作业方面,会布置一些实际操作性的任务,如利用PS制作一张海报,通过作业的完成情况来评估学生对知识的掌握和技能的应用。

考试部分,将设置选择题、填空题和操作题,全面测试学生对PS基本概念、工具和操作的掌握程度。

图的基本操作 实验报告

图的基本操作 实验报告

图的基本操作实验报告图的基本操作实验报告引言:图是一种常见的数据结构,广泛应用于计算机科学和其他领域。

本实验报告旨在介绍图的基本操作,包括创建图、添加节点和边、遍历图等,并通过实验验证这些操作的正确性和效率。

实验目的:1. 了解图的基本概念和术语;2. 掌握图的创建和修改操作;3. 熟悉图的遍历算法;4. 分析图的操作的时间复杂度。

实验过程:1. 创建图首先,我们需要创建一个图对象。

图可以用邻接矩阵或邻接表来表示。

在本实验中,我们选择使用邻接表来表示图。

通过遍历输入的节点和边信息,我们可以创建一个包含所有节点和边的图。

2. 添加节点和边在创建图对象后,我们可以通过添加节点和边来构建图的结构。

通过输入节点的标识符和边的起始和结束节点,我们可以在图中添加新的节点和边。

添加节点和边的操作可以通过修改邻接表来实现,将节点和边的信息存储在对应的链表中。

3. 遍历图遍历图是图操作中常用的操作之一。

通过遍历图,我们可以访问图中的所有节点和边。

在本实验中,我们选择使用深度优先搜索(DFS)算法来遍历图。

DFS算法通过递归的方式遍历图中的节点,先访问当前节点,然后再递归地访问与当前节点相邻的节点。

4. 分析时间复杂度在实验过程中,我们记录了图的操作所花费的时间,并分析了它们的时间复杂度。

通过对比不同规模的图的操作时间,我们可以评估图操作的效率和可扩展性。

实验结果:通过实验,我们成功创建了一个图对象,并添加了多个节点和边。

我们还通过DFS算法遍历了图,并记录了遍历的顺序。

实验结果表明,我们的图操作实现正确,并且在不同规模的图上都能够高效地工作。

讨论与结论:本实验报告介绍了图的基本操作,并通过实验验证了这些操作的正确性和效率。

通过实验,我们了解到图是一种重要的数据结构,可以用于解决许多实际问题。

同时,我们还深入分析了图操作的时间复杂度,为后续的图算法设计和优化提供了参考。

总结:通过本次实验,我们对图的基本操作有了更深入的了解。

cad课程设计实验报告

cad课程设计实验报告

cad课程设计实验报告一、课程目标知识目标:1. 理解CAD(计算机辅助设计)软件的基本概念,掌握软件的界面操作和基本工具使用;2. 学习并掌握CAD绘图的基本命令,如绘制直线、圆、矩形等基本图形;3. 学习并理解CAD绘图中的图层管理和尺寸标注方法;4. 掌握CAD软件中的打印输出和文件保存的相关操作。

技能目标:1. 能够独立操作CAD软件,完成简单的二维图形绘制;2. 学会运用CAD软件进行图形的编辑与修改,提高绘图效率;3. 学会运用图层管理功能,对图形进行有序组织;4. 学会进行尺寸标注和文字注释,使图纸表达清晰、准确。

情感态度价值观目标:1. 培养学生耐心细致、严谨认真的学习态度,提高解决问题的能力;2. 激发学生对计算机辅助设计的兴趣,培养创新意识和实践能力;3. 引导学生认识到CAD技术在现代工程领域的重要作用,树立正确的职业观念;4. 培养学生的团队协作意识,提高沟通与交流能力。

课程性质:本课程为实践性较强的课程,注重培养学生的动手操作能力和实际应用能力。

学生特点:学生为初中年级,具备一定的计算机操作基础,对新鲜事物充满好奇,但需加强引导和培养耐心细致的学习态度。

教学要求:结合学生特点,教师应采用任务驱动法,引导学生主动探索,注重理论与实践相结合,确保学生能够掌握课程目标所设定的知识技能。

同时,关注学生的情感态度价值观培养,使学生在学习过程中形成良好的学习习惯和职业素养。

通过课程学习,实现具体学习成果的达成,为后续学习打下坚实基础。

二、教学内容1. CAD软件概述- CAD软件的定义与应用领域- CAD软件的界面认识与基本操作方法2. CAD基本绘图命令- 绘制直线、圆、矩形、多边形等基本图形- 使用辅助工具如捕捉、正交、极轴等提高绘图精度3. 图形的编辑与修改- 选择、移动、复制、旋转、缩放图形- 删除、修剪、延伸、打断、合并图形4. 图层管理- 图层的创建、删除、重命名- 设置图层颜色、线型、线宽等属性5. 尺寸标注与文字注释- 设置标注样式- 进行线性、径向、角度、坐标等尺寸标注- 添加文字注释和多重引线6. 打印输出与文件管理- 设置打印样式和页面布局- 打印预览与输出- 文件保存、另存为、导出等操作教学内容安排与进度:第1周:CAD软件概述及界面认识第2-3周:基本绘图命令学习与实践第4-5周:图形的编辑与修改第6周:图层管理第7周:尺寸标注与文字注释第8周:打印输出与文件管理教材章节关联:教学内容与教材第3章“CAD基本操作与绘图技巧”和第4章“图形编辑与尺寸标注”相关,确保教学内容与课本紧密关联,帮助学生巩固所学知识。

数据结构试验报告-图的基本操作

数据结构试验报告-图的基本操作

中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。

2、熟练掌握图的存储结构。

3、熟练掌握图的两种遍历算法。

二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。

[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。

以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。

【测试数据】由学生依据软件工程的测试技术自己确定。

三、实验前的准备工作1、掌握图的相关概念。

2、掌握图的逻辑结构和存储结构。

3、掌握图的两种遍历算法的实现。

四、实验报告要求1、实验报告要按照实验报告格式规范书写。

2、实验上要写出多批测试数据的运行结果。

3、结合运行结果,对程序进行分析。

【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。

数字图像处理实验一图像的基本操作和基本统计指标计算实验报告.doc

数字图像处理实验一图像的基本操作和基本统计指标计算实验报告.doc

实验一图像的基本操作和基本统计指标计算一、实验目的熟悉MATLAB图像处理工具箱,在掌握MATLAB基本操作的基础上,本课程主要依靠图像处理工具箱验证和设计图像处理算法。

对于初学者来说,勤学多练、熟悉MATLAB图像处理工具箱也是学号本课程的必经之路。

了解计算图像的统计指标的方法及其在图像处理中的意义。

了解图像的几何操作,如改变图像大小、剪切、旋转等。

二、实验主要仪器设备(1)台式计算机或笔记本电脑(2)MATLAB(安装了图像处理工具箱,即Image Processing Toolbox(IPT))(3)典型的灰度、彩色图像文件三、实验原理(1)将一幅图像视为一个二维矩阵。

(2)利用MATLAB图像处理工具箱读、写和显示图像文件。

①调用imread函数将图像文件读入图像数组(矩阵)。

例如“I=imread(‘tire.tif’);”。

其基本格式为:“A=imread(‘filename.fmt’)”,其中,A为二维矩阵,filename.为文件名,fmt 为图像文件格式的扩展名。

②调用imwrite函数将图像矩阵写入图像文件。

例如“imwrite(A,’test_image.jpg’);”。

其基本格式为“imwrite(a,filename.fmt)”。

③调用imshow函数显示图像。

例如“imshow(‘tire.tif’);”。

其基本格式为:I为图像矩阵,N为显示的灰度级数,默认时为256。

(3)计算图像有关的统计参数。

四、实验内容(1)利用MATLAB图像处理工具箱和Photoshop读、写和显示图像文件。

(2)利用MATLAB计算图像有关的统计参数。

五、实验步骤(1)利用“读图像文件I/O”函数读入图像Italy.jpg。

(2)利用“读图像文件I/O”的iminfo函数了解图像文件的基本信息:主要包括Filename(文件名)、FileModDate(文件修改时间)、Filesize(文件尺寸)、Format(文件格式)、FormatVersion (格式版本)、Width(图像宽度)、Height(图像高度)、BitDepth(每个像素的位深度)、ColorType (彩色类型)、CodingMethod(编码方法)等。

ps图片课程设计

ps图片课程设计

ps图片课程设计一、课程目标知识目标:1. 学生能理解PS图片处理的基本概念,掌握图层、选区、蒙版等核心功能的使用。

2. 学生能够运用PS工具进行图片编辑、修复和美化,了解不同图片格式的特点和应用场景。

3. 学生掌握基本的色彩调整技巧,能对图片的色调、对比度、饱和度等进行调整。

技能目标:1. 学生能够独立操作PS软件,完成图片的简单编辑和效果处理。

2. 学生具备一定的图片创意设计能力,能够运用PS工具创作出具有个性的图片作品。

3. 学生能够运用所学知识解决实际问题,如制作班级活动海报、修图等。

情感态度价值观目标:1. 学生通过学习PS图片处理,培养对美的感知和欣赏能力,提高审美素养。

2. 学生在创作过程中,培养创新意识和团队协作精神,学会尊重他人意见。

3. 学生在学习过程中,树立正确的价值观,遵循法律法规,不参与侵权、抄袭等不良行为。

课程性质:本课程为信息技术学科,旨在通过PS图片处理软件的教学,提高学生的信息技术素养和实际操作能力。

学生特点:六年级学生具有一定的计算机操作基础,对新事物充满好奇心,喜欢动手实践,但注意力集中时间较短。

教学要求:结合学生特点,课程设计应注重实践操作,以任务驱动法引导学生主动参与,注重激发学生的学习兴趣和创作欲望。

同时,注重培养学生的创新意识和团队协作精神,提高学生的综合素养。

通过分解课程目标,为后续教学设计和评估提供依据。

二、教学内容1. 图片处理基础:- 图层概念与操作- 选区工具的使用- 蒙版与通道的应用2. 图片编辑技巧:- 图像裁剪与缩放- 画布调整与图像旋转- 图像修复工具的使用(如污点修复、红眼工具)3. 色彩调整与美化:- 色彩平衡、亮度/对比度调整- 色相/饱和度调整- 层次与曲线调整4. 创意设计与应用:- 文字工具与排版设计- 图层样式与特效制作- 合成技巧与创意构思教学大纲安排:第一课时:图片处理基础(图层、选区、蒙版)第二课时:图片编辑技巧(裁剪、缩放、旋转)第三课时:色彩调整与美化(色彩平衡、层次曲线)第四课时:创意设计与应用(文字排版、图层样式)第五课时:综合实践(小组合作,完成主题海报设计)教学内容关联教材:《信息技术》六年级下册,第三章“图像处理”:涵盖了图层、选区、色彩调整等基本概念与操作,与教学内容紧密结合。

图的基本操作及应用

图的基本操作及应用

武 夷 学 院课程设计报告课程名称: 数据结构设计题目: 图的基本操作及应用 学生班级: 学生姓名: 指导教师:完成日期:2012.5.30数学与计算机系课程设计项目研究报告目录第 1 章项目简介 (3)1.1 项目名称 (3)1.2 开发人员 (3)1.3 指导教师 (3)第 2 章项目研究意义 (3)2.1 课程设计概述 (3)第3章课程设计项目进度表 (4)第4 章课程设计任务分配表 (5)第5 章达到的效果 (6)图5—1 6 5.2 图的数据类型定义表 (7)第6 章源程序 (17)第7 章附录 (28)(1)图的基本操作及应用 (28)(2)二叉树的遍历 (29)第8 章设计心得 (29)第9 章参考文献 (30)第 1 章项目简介1.1 项目名称(1)图的基本操作及应用(2)二叉树的遍历1.2 开发人员1.3 指导教师第 2 章项目研究意义2.1 课程设计概述(1)图是一种比树更为复杂的一些的非线性结构。

在图状结构中,任意两个结点之间都可能具有邻接关系,也就是在图的数据元素之间存在多对多的关系。

所以图状结构可以描述任意结点之间的关系,例如各种线性结构和树形结构,这些都可以看做图这种结构的特例。

于是,从某种意义上讲,图应该是一种最基本的数据结构。

图是一种应用极为广泛的数据结构。

比如,在供电网络分析、交通运输管理、市政管线铺设、工作进度安排等诸多方面,都常采用图状结构来模拟各种复杂的数据对象。

当前,它的应用已经渗透到了计算机科学、社会科学、人文科学、工程技术等各个领域。

本设计基于图的结构,创建一个无向图,基于设计要求,我们对要求进行编号,让用户可以自由选择操作,我们可以将各个顶点的数据域储存所需的信息,可以用深度遍历或者广度遍历对信息进行访问,也可以删除顶点的数据。

这对于很多操作系统都是很需要的。

1本程序的功能是对任意二叉树进行递归前序遍历和后序遍历 用栈实现非递归的前序、和后序遍历 还有对树的层序遍历以及树与二叉树的转换。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国矿业大学徐海学院计算机系《软件认知实践》报告姓名:学号:专业:设计题目:指导教师:2013年12月30日目录第1章题目概述 (2)第1.1节题目要求 (2)第1.2节主要难点 (3)第2章系统流程图 (4)第3章数据结构和算法 (5)第4章核心代码分析 (6)第5章复杂度分析 (25)参考文献 (25)第一章题目概述第1.1节题目要求(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;(2)求每个顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信息“无x”;(6)判断图G是否是连通图,输出信息“YES”/“NO”;(7)如果选用的存储结构是邻接矩阵,则用邻接矩阵的信息生成图G的邻接表,即复制图G,然再执行操作(2);反之亦然。

第1.2节主要难点(1)自选存储结构创建一个图:通过用户从键盘敲入的两个数值分别确定图的顶点数和边数,选择邻接矩阵存储结构将图的结点信息存储在一个顺序表中,图的边信息存储在一个二维数组中。

(2)求每个顶点的度:1.邻接矩阵存储结构下求每个顶点的度:利用图的邻接矩阵,每个顶点所在行和所在列的边的权值如果存在则该顶点的度+1,依次算出每个顶点的度,并且记录在一个数组中输出。

2.邻接表存储结构下求每个顶点的度:定义一个邻接边指针循环指向顶点的邻接边单链表头结点,当结点不空时,该顶点的出度+1,邻接边弧头结点的入度+1,依次求出每个顶点的出度和入度之和就为该顶点的度。

(3)图的深度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点1.访问结点v并标记结点v已访问;2.查找结点v的第一个邻接结点w;3.若结点v的邻接结点w存在,则继续执行,否则算法结束;4.若结点w尚未被访问,则递归访问结点w;5.查找结点v的w邻接结点的下一个邻接结点w,转到步骤3。

(4)图的广度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序1.首先访问初始结点v并标记结点v为已访问;2.结点v入队列;3.当队列非空时则继续执行,否则算法结束;4.出队列取得队头结点u;5.查找u的第一个邻接结点w;6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:6.1若结点w尚未被访问,则访问结点w并标记结点w为已访问;6.2结点w入队列;6.3查找结点u的w邻接结点的下一个邻接结点w,转到步骤6 。

(5)判断有向图的强连通性:采取邻接表结构,在图中寻找一个包含所有顶点且首尾相连的环,若这样的环存在,则该图为强连通图,否则不为强连通图。

(6)用邻接矩阵的信息生成邻接表:定义一个邻接表的边信息结构体,将邻接矩阵的边信息转换成邻接表的边信息存储到邻接边的单链表中。

第二章系统流程图第三章数据结构和算法(1)有向图顶点的数据类型DataType 定义如下:typedef int DataType ;(2)邻接矩阵存储结构下图的结构体定义如下:typedef struct{SeqList Vertices;int edge[MaxVertices][MaxVertices];int numOfEdges;}AdjMGraph;(3)邻接矩阵存储结构下图的边信息结构体定义如下:typedef struct{int row;int col;int weight;}RowColWeight;(4)邻接表存储结构下图的结构体定义如下:typedef struct Node{int dest;struct Node *next;}Edge;typedef struct{DataType data;int sorce;Edge *adj;}AdjLHeight;typedef struct{AdjLHeight a[MaxVertices];int numOfVerts;int numOfEdges;}AdjLGraph;(5)邻接表存储结构下图的边信息结构体定义如下:typedef structint row;int col;}RowCol;(6)顺序循环队列的结构体定义如下:typedef struct{DataType queue[MaxQueueSize];int rear;int front;int count;}SeqCQueue;(7)顺序表的结构体定义如下:typedef struct{DataType list[MaxSize];int size;}SeqList;第四章核心代码分析源程序存放在八个文件夹中,文件SeqList.h是顺序表的结构体定义和操作函数,文件SeqCQueue.h是顺序循环队列的结构体定义和操作函数,文件AdjMGraph.h是邻接矩阵存储结构下图的结构体定义和操作函数,文件AdjMGraphCreate.h是邻接矩阵存储结构下图的创建函数,文件AdjLGraph.h是邻接表存储结构下图的结构体定义和操作函数,文件AdjLGraphCreate.h 是邻接表存储结构下图的创建函数,文件AdjMGraphTraverse.h是邻接矩阵存储结构下图的深度优先遍历和广度优先遍历操作函数,文件图的基本操作与实现.c是主函数。

(1)/* 文件SeqList.h */typedef struct{DataType list[MaxSize];int size;}SeqList;void ListInitiate(SeqList *L)L->size=0;}int ListLength(SeqList L){return L.size;}int ListInsert(SeqList *L,int i,DataType x){int j;if(L->size>=MaxSize){printf("数组已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数不合法!\n");return 0;}else{for(j=L->size;j>i;i--)L->list[j]=L->list[j-1];L->list[i]=x;L->size++;return 1;}}int ListDelete(SeqList *L,int i,DataType *x){int j;if(L->size<=0){printf("顺序表已空无数据元素可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法!\n");return 0;}else{*x=L->list[i];for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}}int ListGet(SeqList L,int i,DataType *x){if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}}(2)/* 文件SeqCQueue.h*/typedef struct{DataType queue[MaxQueueSize];int rear;int front;int count;}SeqCQueue;void QueueInitiate(SeqCQueue *Q){Q->rear=0;Q->front =0;Q->count =0;}int QueueNotEmpty(SeqCQueue Q){if(Q.count !=0) return 1;else return 0;}int QueueAppend(SeqCQueue *Q,DataType x) {if(Q->count>0&&Q->rear==Q->front){printf("队列已满无法插入!");return 0;}else{Q->queue [Q->rear]=x;Q->rear =(Q->rear +1)%MaxQueueSize;Q->count ++;return 1;}}int QueueDelete(SeqCQueue *Q,DataType *d) {if(Q->count ==0){printf("队列已空无数据出队列!\n");return 0;}else{*d=Q->queue[Q->front];Q->front=(Q->front+1)%MaxQueueSize;Q->count --;return 1;}}int QueueGet(SeqCQueue Q,DataType*d){if(Q.count ==0){printf("队列已空无数据出队列!\n");return 0;}else{*d=Q.queue [Q.front ];return 1;}}(3)/* 文件AdjMGraph.h*/#include"SeqList.h"typedef struct{SeqList Vertices; //存放结点的顺序表int edge[MaxVertices][MaxVertices]; //存放边的邻接矩阵int numOfEdges; //边的条数}AdjMGraph; //边的结构体定义void Initiate(AdjMGraph *G,int n) //初始化{int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j)G->edge[i][j]=0;elseG->edge[i][j]=MaxWeight;}G->numOfEdges=0; //边的条数置为0ListInitiate(&G->Vertices); //顺序表初始化}void InsertVertex(AdjMGraph *G,DataType vertex) //在图G中插入结点vertex {ListInsert(&G->Vertices,G->Vertices.size,vertex); //顺序表尾插入}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)//在图G中插入边<v1,v2>,边<v1,v2>的权为weight{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=weight;G->numOfEdges++;}void DeleteEdge(AdjMGraph *G,int v1,int v2) //在图中删除边<v1,v2> {if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size||v1==v2) {printf("参数v1或v2越界出错!\n");exit(1);}if(G->edge[v1][v2]==MaxWeight||v1==v2){printf("该边不存在!\n");exit(0);}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;}void DeleteVerten(AdjMGraph *G,int v) //删除结点v{int n=ListLength(G->Vertices),i,j;DataType x;for(i=0;i<n;i++) //计算删除后的边数{for(j=0;j<n;j++)if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight) G->numOfEdges--; //计算被删除边}for(i=v;i<n;i++) //删除第v行{for(j=0;j<n;j++)G->edge[i][j]=G->edge[i+1][j];}for(i=0;i<n;i++) //删除第v列{for(j=v;j<n;j++)G->edge[i][j]=G->edge[i][j+1];}ListDelete(&G->Vertices,v,&x); //删除结点v}int GetFistVex(AdjMGraph *G,int v)//在图G中寻找序号为v的结点的第一个邻接结点//如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1{int col;if(v<0||v>G->Vertices.size){printf("参数v1越界出错!\n");exit(1);}for(col=0;col<G->Vertices.size;col++)if(G->edge[v][col]>0&&G->edge[v][col]<MaxWeight)return col;return -1;}int GetNextVex(AdjMGraph*G,int v1,int v2)//在图中寻找v1结点的邻接结点v2的下一个邻接结点//如果这样的结点存在,返回该邻接结点的序号;否则,返回-1//v1和v2都是相应结点的序号{int col;if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}for(col=v2+1;col<G->Vertices.size;col++)if(G->edge[v1][col]>0&&G->edge[v1][col]<MaxWeight)return col;return -1;}//输出图G的邻接矩阵void Print(AdjMGraph *G){int i,j;for(i=0;i<G->Vertices.size;i++){for(j=0;j<G->Vertices.size;j++)printf("%6d ",G->edge[i][j]);printf("\n");}}//邻接矩阵存储结构下求出每个顶点的度并输出void MVertices(AdjMGraph *G,DataType a[]){int i,j,m;DataType b[MaxVertices];//用数组b[]记录相应结点的度for(i=0;i<G->Vertices.size;i++)b[i]=0; //置0printf("邻接矩阵存储结构下图的顶点的度为:\n");for(m=0;m<G->Vertices.size;m++) //求出每个结点的度{for(i=0;i<G->Vertices.size;i++)for(j=0;j<G->Vertices.size;j++){if(i==m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)//求出邻接矩阵第i行权值存在的边的个数,当边<m,j>存在时,b[m]加1 b[m]++;if(j==m&&i!=m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)//求出邻接矩阵第j列权值存在的边的个数,当边<i,m>存在时,b[m]加1 b[m]++;}printf("顶点%d的度为:%d\n",a[m],b[m]);}}//查找图G中是否存在点vint ChaZhao(AdjMGraph *G,int v){if(0<=v&&v<G->Vertices.size){printf("存在顶点%d\n",v);return 1;}else{printf("不存在顶点%d\n",v);return 0;}}//删除查找到的结点v并删除该结点及与之相关的边void MDelete(AdjMGraph *G,int v){int i;for(i=0;i<G->Vertices.size;i++){if(G->edge[v][i]>0&&G->edge[v][i]<MaxWeight)//当邻接矩阵的第v行有边<v,i>存在时,删除边<v,i>DeleteEdge(G,v,i);if(G->edge[i][v]>0&&G->edge[i][v]<MaxWeight)//当邻接矩阵的第j行有边<i,v>存在时,删除边<i,v>DeleteEdge(G,i,v);}DeleteVerten(G,v);//删除结点v}(4)/* 文件AdjMGraphCreate.h*/typedef struct{int row; //行下标int col; //列下标int weight; //权值}RowColWeight; //边信息结构体定义void CreatGraph(AdjMGraph *G,DataType v[],int n,RowColWeight E[],int e) //在图G中插入n个结点信息v和e条边信息E{int i,k;Initiate(G,n); //结点顺序表初始化for(i=0;i<n;i++)InsertVertex(G,v[i]); //结点插入for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight); //边插入}(5)/* 文件AdjLGraph.h *///邻接表的存储结构typedef struct Node{int dest; //邻接边的弧头结点序号struct Node *next;}Edge; //邻接边单链表的结点结构体t ypedef struct{DataType data; //结点数据元素int sorce; //邻接边的弧尾结点序号Edge *adj; //邻接边的头指针}AdjLHeight; //数组的数据元素类型结构体typedef struct{AdjLHeight a[MaxVertices]; //邻接表数组int numOfVerts; //结点个数int numOfEdges; //边个数}AdjLGraph; //邻接表结构体//初始化操作函数void LAdjInitiate(AdjLGraph *G){int i;G->numOfVerts=0;G->numOfEdges=0;for(i=0;i<MaxVertices;i++){G->a[i].sorce=i;G->a[i].adj=NULL;}}//撤销操作函数void LAdjDestroy(AdjLGraph *G)//撤销图G中的所有邻接边单链表{int i;Edge *p,*q;for(i=0;i<G->numOfVerts;i++){p=G->a[i].adj;while(p!=NULL){q=p->next;free(p);p=q;}}}//插入结点操作函数void LInsertVertex(AdjLGraph *G,int i,DataType vertex)//在图G中的第i(0<=i<MaxVertices)个位置插入结点数据元素vertex {if(i>=0&&i<MaxVertices){G->a[i].data=vertex; //存储结点数据元素vertexG->numOfVerts++; //个数加1}elseprintf("结点越界");}//插入边操作函数void LInsertEdge(AdjLGraph *G,int v1,int v2)//在图G中加入边<v1,v2>的信息{Edge *p; //定义一个邻接边指针if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts){printf("参数v1或v2越界出错");exit(0);}p=(Edge *)malloc(sizeof(Edge)); //申请邻接边单链表结点空间p->dest=v2; //置邻接边弧头序号p->next=G->a[v1].adj; //新结点插入单链表的表头G->a[v1].adj=p; //头指针指向新的单链表表头G->numOfEdges++; //边数个数加1}//删除边操作函数void LDeleteEdge(AdjLGraph *G,int v1,int v2)//删除图G中的边<v1,v2>信息{Edge *curr,*pre;if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts) {printf("参数v1或v2越界出错!");exit(0);}pre=NULL;curr=G->a[v1].adj;while(curr!=NULL&&curr->dest!=v2)//在v1结点的邻接边单链表中查找v2结点{pre=curr;curr=curr->next;}//删除表示邻接边<v1,v2>的结点if(curr!=NULL&&curr->dest==v2&&pre==NULL)//当邻接边<v1,v2>的结点是单链表的第一个结点时{G->a[v1].adj=curr->next;free(curr);G->numOfEdges--;}else if(curr!=NULL&&curr->dest==v2&&pre!=NULL)//当邻接边<v1,v2>的结点不是单链表的第一个结点时{pre->next=curr->next;free(curr);G->numOfEdges--;}else//当邻接边<v1,v2>结点不存在时printf("边<v1,v2>不存在时");}//取第一个邻接结点int LGetFirstVex(AdjLGraph *G,int v)//取图G中结点v的第一个邻接结点//取到时返回该邻接结点的对应序号,否则返回-1{Edge *p;if(v<0||v>G->numOfVerts){printf("参数v1或v2越界出错!");exit(0);}p=G->a[v].adj;if(p!=NULL)return p->dest; //返回该邻接结点的对应序号elsereturn -1; //返回-1}//取下一个邻接结点int LGetNextVex(AdjLGraph *G,int v1,int v2)//取图G中结点v1的邻接结点v2的下一个邻接结点//取到时返回该邻接结点的对应序号,否则返回-1{Edge *p;if(v1<0||v1>G->numOfVerts||v2<0||v2>G->numOfVerts) {printf("参数v1或v2越界出错!");exit(0);}p=G->a[v1].adj;while(p!=NULL) //寻找结点v1的邻接结点v2{if(p->dest!=v2){p=p->next;continue;}elsebreak;}p=p->next; //p指向邻接结点v2的下一个邻接结点if(p!=NULL)return p->dest; //返回该邻接结点的对应序号elsereturn -1; //返回-1}//邻接表存储下求每个顶点的度并输出结果void LVertices(AdjLGraph *G,DataType a[]){printf("邻接表存储结构下的图的顶点的度为:\n");int OutDegree[MaxVertices],InDegree[MaxVertices];//定义一个出度和入度的数组int i;for(i=0;i<G->numOfVerts;i++) //首先将出度和入度数组的每个成员都置0{OutDegree[i]=0;InDegree[i]=0;}Edge *p; //定义一个邻接边指针for(i=0;i<G->numOfVerts;i++){p=G->a[i].adj; //指针指向a[i]的邻接边单链表头结点while(p!=NULL)//当p所指向的邻接边结点不空时{OutDegree[i]++; //出度加1InDegree[p->dest]++; //邻接边弧头结点的入度加1p=p->next; //p指向下一个邻接边结点}}for(i=0;i<G->numOfVerts;i++) //输出每个结点的度{printf("顶点%d的度为:",a[i]);printf("%d",OutDegree[i]+InDegree[i]); //每个结点的度即出度与入度相加的和printf("\n");}}//判断有向图G是否为强连通图int LianTong(AdjLGraph *G,DataType a[]){int i,b[MaxVertices],k=0;for(i=0;i<G->numOfVerts;i++)b[i]=0;Edge *q,*p; //定义一个邻接边指针for(i=0;i<G->numOfVerts;i++){q=G->a[i].adj;while(q!=NULL){b[i]++;q=q->next;}}for(i=0;i<G->numOfVerts;i++){if(b[i]==1)k++;}p=G->a[G->numOfVerts-1].adj;if(k==G->numOfVerts&&p->dest==a[0])return 1;elsereturn 0;}(6)/* 文件AdjLGraphCreate.h */typedef struct{int row; //行下标int col; //列下标}RowCol; //边信息结构体定义void CreatLGraph(AdjLGraph *G,DataType v[],int n,RowCol d[],int e) {int i,k;LAdjInitiate(G);for(i=0;i<n;i++)LInsertVertex(G,i,v[i]);for(k=0;k<e;k++)LInsertEdge(G,d[k].row,d[k].col);}(7)/* 文件AdjMGraphTraverse.h */void Visit(DataType item){printf("%d ",item);}void DepthFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item)) //连通图G以v为初始结点的访问操作为Visit()的深度优先遍历//数组visited标记了相应结点是否已访问过,0表示未访问,1表示已访问{int w;Visit(G.Vertices.list[v]); //访问结点vvisited[v]=1; //置已访问标记w=GetFistVex(&G,v); //取第一个邻接结点while(w!=-1){if(!visited[w])//非0 还未访问DepthFSearch(G,w,visited,Visit);w=GetNextVex(&G,v,w);}}void DepthFirstSearch(AdjMGraph G,void Visit(DataType item))//非连通图G的访问操作为Visit()的深度优先遍历{int i;int *visited=(int *)malloc(sizeof(int)*G.Vertices.size);for(i=0;i<G.Vertices.size;i++)visited[i]=0;for(i=0;i<G.Vertices.size;i++)if(!visited[i])DepthFSearch(G,i,visited,Visit);free(visited);}#include"SeqCQueue.h" //包括顺序循环队列void BroadFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item)) //连通图G以v为初始结点的访问操作为Visit()的广度优先遍历//数组visited标记了相应结点是否已访问过,0表示未访问,1表示已访问{DataType u,w;SeqCQueue queue;Visit(G.Vertices.list[v]); //访问结点vvisited[v]=1; //置已访问标记QueueInitiate(&queue); //队列初始化QueueAppend(&queue,v); //初始结点v入队列while(QueueNotEmpty(queue)) //队列非空时{QueueDelete(&queue,&u); //出队列w=GetFistVex(&G,u); //取结点u的第一个邻接结点while(w!=-1) //邻接结点w存在时{if(!visited[w]) //若没有访问过{Visit(G.Vertices.list[w]); //访问结点wvisited[w]=1; //置已访问标记QueueAppend(&queue,w); //结点w入队列}w=GetNextVex(&G,u,w); //取下一个邻接结点}}}void BroadFirstSearch(AdjMGraph G,void Visit(DataType item)) //非连通图G访问操作为Visit()的广度优先遍历{int i;int *visited=(int *)malloc(sizeof(int)*G.Vertices.size);for(i=0;i<G.Vertices.size;i++)visited[i]=0;for(i=0;i<G.Vertices.size;i++)if(!visited[i])BroadFSearch(G,i,visited,Visit);free(visited);}(8)/* 文件图的基本操作与实现.c */#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int DataType;//定义DataType为整形#define MaxSize 100#define MaxVertices 10#define MaxEdges 100#define MaxWeight 10000 //定义无穷大的具体值#define MaxQueueSize 100#include "AdjMGraph.h"#include"AdjMGraphCreate.h"#include"AdjMGraphTraverse.h"#include"AdjLGraph.h"#include"AdjLGraphCreate.h"void main(){AdjMGraph g1; //定义一个邻接矩阵存储结构的图g1RowColWeight rcw[MaxEdges];//定义边信息数组int n,e,i,j;printf("请输入有向图的顶点数:");scanf("%d",&n);printf("请输入有向图的边数:");scanf("%d",&e);DataType a[MaxVertices];//定义一个数组存储顶点字符为整形printf("该图的%d个顶点字符分别为:",n);//输出每个顶点字符for(i=0;i<n;i++){a[i]=i;printf("%2d",a[i]);}printf("\n");//存储边的信息for(i=0;i<e;i++){printf("请输入一条边依附的顶点字符v1,v2及权值(v1,v2,w):");scanf("%d,%d,%d",&rcw[i].row,&rcw[i].col,&rcw[i].weight);}CreatGraph(&g1,a,n,rcw,e);//创建一个邻接矩阵存储结构的图g1printf("该图的邻接矩阵为:\n");Print(&g1);//输出图g1的邻接矩阵//求出邻接矩阵存储结构下图g1的每个顶点的度MVertices(&g1,a);AdjLGraph g2;//定义一个邻接表存储结构的图g2RowCol rwc[MaxEdges];//定义边信息数组//用邻接矩阵的信息生成邻接表for(i=0;i<e;i++){rwc[i].col=rcw[i].col;rwc[i].row=rcw[i].row;}CreatLGraph(&g2,a,g1.Vertices.size,rwc,g1.numOfEdges);//求出邻接表存储结构下图g2每个顶点的度LVertices(&g2,a);//判断图g1的连通性printf("图g1是否为强连通图:");if(LianTong(&g2,a)){printf("YES\n");printf("深度优先遍历序列为:");//对图g1作DFS遍历,输出DFS顶点序列DepthFirstSearch(g1,Visit);printf("\n");printf("广度优先遍历序列为:");//对图g1作BFS遍历,输出BFS顶点序列BroadFirstSearch(g1,Visit);}else{printf("NO\n");printf("深度优先遍历序列为:");DepthFirstSearch(g1,Visit);printf("\n");printf("广度优先遍历序列为:");BroadFirstSearch(g1,Visit);}printf("\n");//输入顶点x,查找图g1:若存在含x的顶点,则删除该结点及与之相关连的边, //并作DFS遍历否则输出信息"无x";int x;printf("请输入要查找的顶点:");scanf("%d",&x);if(ChaZhao(&g1,x)){MDelete(&g1,x);printf("删除顶点%d后的图的邻接矩阵为:\n",x);Print(&g1);printf("删除顶点%d后的深度优先遍历序列为:",x);DepthFirstSearch(g1,Visit);}elseprintf("不存在顶点%d\n",x);}第五章时间复杂度分析算法的时间复杂度和空间复杂度(1)图的邻接矩阵存储:空间复杂度为O(n2) 时间复杂度都为O(n)。

相关文档
最新文档