太原理工数据结构实验报告 实验三 图
太原理工大学数据结构实验报告
数据结构实验报告课程名称:数据结构实验项目:线性表、树、图、查找、内排序实验地点:***********************专业班级:物联网**** 学号:********* 学生姓名:指导教师:周杰伦2014年*月*日实验一线性表目的与要求本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,提高分析和解决问题的能力。
要求仔细阅读并理解下列例题,上机调试并编译执行通过,并观察其结果,然后独立完成后面的实验内容,写出完整的实验报告。
编写程序过程中注意养成良好的编程风格与习惯,要求程序结构清晰,程序缩进,适当注释。
实验仪器使用的计算机联想:硬件配置cpu-i3等、软件环境win7实验内容问题描述:1.设顺序表A中的数据元素递增有序,试写一程序,将x插入到顺序表的适当位置上,使该表仍然有序。
输入:插入见的顺序表,插入的数,插入后的顺序表输出:插入前的顺序表,插入的数,插入后的顺序表存储结构:顺序表存储数据算法基本思想:这里采用了顺序表来存储数据,主要就是考虑插入的位置是不是在最后一个,如果不是在最后一个,那么就要移动数据了,算法很简单就不在这里的数据都看成是整型的实验代码#include<stdio.h>#include<stdlib.h>void Insert(int* p,int length,int n){int i,j;int flag=0;if(n>=p[length-1]){p[length]=n;flag=1;}else{for(i=length-2;i>=0;i--){if(n>=p[i]){for(j=length;j>=i+2;j--){p[j]=p[j-1];}p[i+1]=n;flag=1;break;}}}if(flag==0){for(j=length;j>=1;j--){p[j]=p[j-1];}p[0]=n;}}int main(){int L[10]={2,5,8,11,14,17,20};int length=7;int i,x;printf("cha ru qian de shun xu biao wei :\n");for(i=0;i<length;i++){printf("%4d",L[i]); }printf("\nqing shu ru yao cha ru de zheng shu:\n");scanf("%d",&x);Insert(L,length,x);printf("charu%dhoudeshunxubiaowei:\n",x);for(i=0;i<=length;i++){printf("%4d",L[i]);}printf("\n"); system("pause");return 0;}实验结果实验心得与体会本次实验是数据结构的第一个实验,虽然已经学过C语言,也用过vc++6.0,但是实验中还是不可避免的遇到许多问题,不过经过自己上网了解和同学与老师的帮助,问题都得到了解决,其中在运行代码后出现了“预编译头文件找不到”的错误,多次运行都出现这种错误,于是上网查询后,才知道是头文件错误,加上“#include<stdio.h>”之后程序顺利运行。
数据结构图的实验报告
数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。
它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。
本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。
具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。
无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。
然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。
这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。
例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。
2. 数据操作在构建好数据结构图后,我们可以进行多种操作。
例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。
我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。
3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。
它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。
同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。
四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。
我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。
太原理工大学 软件学院《数据结构B》--实验指导书-杨永强
《数据结构B》实验指导书计算机科学与技术学院计算机科学与技术系2011年09月目录实验一线性表 (1)实验二树 (5)实验三图 (7)实验四查找 (11)实验五内排序 (13)实验一线性表【目的与要求】本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,提高分析和解决问题的能力。
要求仔细阅读并理解下列例题,上机调试并编译执行通过,并观察其结果,然后独立完成后面的实验内容,写出完整的实验报告。
编写程序过程中注意养成良好的编程风格与习惯,要求程序结构清晰,程序缩进,适当注释。
【参考例题】[问题描述]用链表形式存储一个字符串,插入、删除某个字符,最后按正序、逆序两种方式输出字符串。
[输入]初始字符串,插入位置,插入字符,删除字符。
[输出]已建立链表(字符串),插入字符后链表,删除字符后链表,逆转后链表。
[存储结构]采用链式存储结构[算法的基本思想]建立链表:当读入字符不是结束符时,给结点分配存储空间,写数据域,将新结点插到表尾;插入字符:根据读入的字符在链表中找插入位置,将新结点插入到该位置之前;删除字符:根据读入的删除字符在链表中找到被删结点后,将其从链表中删除;链表逆转:从链表的第一个结点开始对所有结点处理,将每个结点的前驱变为它的后继;打印链表:从链表的第一个结点开始,依次打印各个结点的数据域。
[参考源程序]#define NULL 0typedef struct node{char a;struct node *link;}node,*nodelink;void readlink(nodelink head){nodelink p,q;char c;p=head;printf("Input a linktable(a string):");scanf("%c",&c);if (c=='\n') printf("This string is empty。
数据结构图实验报告
数据结构图实验报告数据结构图实验报告1. 引言数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。
图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网络分析等。
本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜索和最短路径算法等。
3. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
数据结构的实训报告结果
一、实训目的本次数据结构实训旨在通过实践操作,加深对数据结构理论知识的理解,提高解决实际问题的能力。
通过实训,使学生能够熟练掌握各种基本数据结构及其操作方法,并能够将这些知识应用于解决实际问题。
二、实训环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。
1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。
通过编写代码,实现了链表的插入、删除和查找操作。
在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。
通过查阅资料和与同学讨论,我们逐步解决了这些问题。
2. 栈接着,我们学习了栈的基本概念和操作方法。
通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。
在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。
此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。
3. 队列然后,我们学习了队列的基本概念和操作方法。
通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。
在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。
数据结构的实验报告
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构实验报告图
数据结构实验报告图数据结构实验报告图问题描述:;四则运算表达式求值,将四则运算表达式用中缀表达式;一、需求分析:;1、本程序是利用二叉树后序遍历来实现表达式的转换;2、输入输出格式:;输入格式:在字符界面上输入一个中缀表达式,回车表;请输入表达式:;输入一个中缀表达式;输出格式:如果该中缀表达式正确,那么在字符界面上;式,其中后缀表达式中两相邻操作数之间利用空格隔开;果不正确,在字符界面上输出问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
一、需求分析:1、本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2、输入输出格式:输入格式:在字符界面上输入一个中缀表达式,回车表示结束。
请输入表达式:输入一个中缀表达式输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
逆波兰表达式为:3、测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+ 输出逆波兰表达式运算结果为:输出运算后的结果二、概要设计:抽象数据类型二叉树类BiTree算法的基本思想根据题目要求,利用栈计算,和二叉树存储,来计算表达式该算法的基本思想是:先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值程序的流程程序由三个模块组成:(1) 输入模块:输入一个运算式(2) 计算模块:利用栈进行表达式的计算,二叉树来存储。
(3 ) 输出模块:屏幕上显示出后缀表达式和运算结果。
三、详细设计物理数据类型程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数compare(char a,char b);生成树的函数void InorderCreate(BiTreeNode *&T,char str,int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法。
太原理工大学ORACLE数据库实验
本科实验报告课程名称:ORACLE大型数据库系统实验项目:创建数据库和表实验地点:迎西校区4506机房专业班级:软件工程学号:学生姓名:指导教师:2012年5月实验一创建数据库和表目的与要求(1)了解数据可的结构以及一些基本概念。
(2)了解表的结构特点。
(3)了解Oracle 10g的基本数据类型。
(4)学会使用DBCA创建数据库。
(5)学会使用界面方式创建表。
(6)学会使用SQL语句手工穿件数据库。
(7)学会使用SQL语句创建表。
实验准备首先要明确,能够创建数据库的用户必须是系统管理员,或是被授权使用CREATE DATABASE语句的用户。
其次创建数据库必须要确定数据库名、所有者(即创建数据库的用户)、数据库大小、SGA分配和存储数据库的文件。
然后,确定数据库包含哪些表以及所包含的各表的结构,还要了解Oracle 10g的常用数据类型,以创建数据库的表。
此外还要了解两种常用的创建数据库、表的方法,即利用DBCA创建和使用PL/SQL的CREATE DATABASE语句创建。
实验内容创建企业管理的员工管理数据库YGGL,包含Employees(员工自然信息)表、Department (部门信息)表和Salary(员工薪水情况)表。
使用OEM创建表图1-1创建Employees表图1-2成功创建Employees表图1-3成功删除Employees表图1-4创建Departments表图1-5成功创建Departments表图1-6 成功删除Departments表图1-7创建Salary表图1-8成功创建Salary表图1-9成功删除Salary表在PL/SQL语句创建表1.创建Employees表create table Employee(EmployeeID char(6) NOT NULL PRIMARY KEY,Name char(10) NOT NULL,Bithday date NOT NULL,Sex number(1) NOT NULL,Address char(20) NULL,Zip char(6) NULL,PhoneNumber char(12) NULL,DepartmentID char(3) NOT NULL REFERENCES Departments(DepartmentID))tablespace users;图1-10 使用SQL语句创建Employees表2.创建Departments表create table Departments(DepartmentID char(3) NOT NULL PRIMARY KEY, Departmentname char(20) NOT NULL,Note varchar2(100) NULL)tablespace users;图1-11 使用SQL语句创建Departments表3.创建Salary表create table Salary(EmployeeID char(6) NOT NULL PRIMARY KEY, InCome number(8,2) NOT NULL,OutCome number(8,2) NOT NULL)tablespace users;图1-11 使用SQL语句创建Salary表本科实验报告课程名称:ORACLE大型数据库系统实验项目:表数据插入、修改和删除实验地点:迎西校区4506机房专业班级:软件工程学号:学生姓名:指导教师:2012年5月实验二表数据插入、修改和删除目的与要求(1)学会使用PL/SQL语句对数据表进行插入、修改和删除数据的操作。
太原理工大学数据库实验报告
本科实验报告课程名称:数据库系统概论实验项目:交互式SQL、数据完整性、用户鉴别与数据控制实验地点:致远楼B503专业班级:软件1229班学号:29学生姓名:***指导教师:***2014年3 月18 日一、实验目的和要求熟悉通过SQL 对数据库进行操作。
二、实验内容和原理1.在RDBMS 中建立一个学生-课程数据库,进行实验所要求的各种操作,所有的SQL 操作均在此建立的新库里进行。
2.根据以下要求认真进行实验,记录所有的实验用例及执行结果。
数据定义:基本表的创建、修改及删除;索引的创建和删除。
数据操作:完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询);完成各类更新操作(插入数据,修改数据,删除数据)。
视图的操作:视图的定义(创建和删除),查询,更新(注意更新的条件)。
三、主要仪器设备操作系统:Windows 7。
数据库管理系统:SQL Server2008。
四、操作方法与实验步骤实验数据记录实验结果(一)数据定义:一.基本表的操作1.建立基本表1)创建学生表Student,由以下属性组成:学号Sno(char 型,长度为9,主码),姓名Sname(char 型,长度为20,唯一),性别Ssex(char 型,长度为2),年龄(smallint),所在系(char 型,长度为20)。
create table Student(Sno char(9) primary key,Sname char(20) unique,Ssex char(2),Sage smallint,Sdept char(20));2)创建课程表Course,由以下属性组成:课程号Cno(char 型,主码,长度为4),课程名Cname(char 型,长度为40),先行课Cpno(char型,长度为4,外码),学分Ccredit(smallint)。
create table Course(Cno char(4) primary key,Cname char(40),Cpno char(4),Ccredit smallint);若设置Cpno 外码,插入数据时会提示违反外码约束。
太原理工大学 数据库系统概论 实验报告 数据的完整性
本科实验报告课程名称:数据库系统原理B 实验项目:数据的完整性实验地点:专业班级:学号:学生姓名:指导教师:201 年月日一目的与要求(1)了解SQL Serer数据库系统中数据完整性控制的基本方法(2)熟练掌握常用CREATE 或ALTER 在创建或修改表时设置约束(3)了解触发器的机制和使用(4)验证数据库系统数据完整性控制二实验设备与环境使用SQL Server数据库管理系统提供的SSMS和查询编辑器三实验内容、实验记录及实验结果与分析结合ST数据库中的各个表,设置相关的约束,要求包括主键约束、外键约束、唯一约束、检查约束、非空约束等,掌握各约束的定义方法。
设置一个触发器,实现学生选课总学分的完整性控制,了解触发器的工作机制。
设计一些示例数据,验证完整性检查机制。
要求包括如下方面的内容:1.创建基本表及约束Student表Course表SC表如下图所示表创建成功:2.插入数据(1)插入学生信息到Student表(2).插入课程信息到Course表(3)插入到SC表(4)检查插入表中的数据二、检查完整性约束1.检查主键约束(1)INSERT INTO Student VALUES('','李斌','男',20,'CS','1001',0) INSERT INTO Student VALUES('','李斌','男',20,'CS','1001',0)UPDATE Student SET Sno='' WHERE Sname = '张立'无法正确运行因为:违反了PRIMARY KEY 约束'PK__Student__CA1FE4647F60ED59'。
不能在对象'dbo.Student' 中插入重复键。
太原理工数据库_实验报告
本科实验报告课程名称:数据库系统原理B实验项目:交互式SQL、数据完整性实验地点:专业班级:学号:学生姓名:指导教师:2015年 6 月 24 日检查数据是否被修改:检查数据是否删除:单表查询:查询学生基本信息,结果集属性名使用查询信息系且年龄大于23岁同学的学号汉字无结果查询年龄是17、18、20、23岁同学的查询年龄不在21~24岁之间的学生的姓名、学号、姓名、年龄和所在系系别和年龄分组统计:统计每个同学的学号、选课数、平均成绩统计每个班的每门课的选课人数、平均成绩连接查询:查询选修了2号课程的同学的学号和姓名查询各门课程的课程号、课程名称以及选课学生的学号查询选修了数据库系统原理课程的同学的学号六、实验结果与分析StudentCourse Sc比较使用视图查询和直接从基表查询的优点1.视图可以简化用户的操作视图机制使用户可以将注意力集中在所关心的数据上,而从基本表直接得来则显得复杂,定义了视图则可以简化查询操作。
2.视图使用户能以多种角度看待同一数据视图可以让用户从不同的方式看待同一数据,适当利用视图可以比基本表更清晰地表达。
3.视图对重构数据库提供了一定程度的逻辑独立性逻辑结构改变,不影响程序使用。
4.视图能够对机密数据提供安全保护视图可以让特定的用户查询特定的内容,把用户限制在数据不同的子集,保证安全性。
七、讨论、心得这个实验是对数据库基本操作的熟悉,花费了大量的时间去进行测试,有时候是出错不是因为代码错误,而是因为插入数据是不能一一对应,或是在连接时出现问题,与表的定义也有一定的关系。
总之编写的时候遇到不少问题,通过解决问题来熟悉了操作,更是要耐心的解决问题,有时候出错的问题非常简单,只要认真的检查一下代码就能发现,希望自己可以在编写代码时更加认真。
实验三:数据完整性一、实验目的(1)了解 SQL Serer数据库系统中数据完整性控制的基本方法(2)熟练掌握常用 CREATE 或 ALTER 在创建或修改表时设置约束(3)了解触发器的机制和使用(4)验证数据库系统数据完整性控制二、实验内容和要求结合 ST数据库中的各个表,设置相关的约束,要求包括主键约束、外键约束、唯一约束、检查约束、非空约束等,掌握各约束的定义方法。
太原理工大学数据库实验报告概要
本科实验报告课程名称:数据库系统概论实验项目:交互式SQL、数据完整性、用户鉴别与数据控制实验地点:致远楼B503专业班级:软件1229班学号:2012005829学生姓名:田亚鹏指导教师:李雪梅2014年3 月18 日一、实验目的和要求熟悉通过SQL 对数据库进行操作。
二、实验内容和原理1.在RDBMS 中建立一个学生-课程数据库,进行实验所要求的各种操作,所有的SQL 操作均在此建立的新库里进行。
2.根据以下要求认真进行实验,记录所有的实验用例及执行结果。
数据定义:基本表的创建、修改及删除;索引的创建和删除。
数据操作:完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询);完成各类更新操作(插入数据,修改数据,删除数据)。
视图的操作:视图的定义(创建和删除),查询,更新(注意更新的条件)。
三、主要仪器设备操作系统:Windows 7。
数据库管理系统:SQL Server2008。
四、操作方法与实验步骤实验数据记录实验结果(一)数据定义:一.基本表的操作1.建立基本表1)创建学生表Student,由以下属性组成:学号Sno(char 型,长度为9,主码),姓名Sname(char 型,长度为20,唯一),性别Ssex(char 型,长度为2),年龄(smallint),所在系(char 型,长度为20)。
create table Student(Sno char(9) primary key,Sname char(20) unique,Ssex char(2),Sage smallint,Sdept char(20));2)创建课程表Course,由以下属性组成:课程号Cno(char 型,主码,长度为4),课程名Cname(char 型,长度为40),先行课Cpno(char型,长度为4,外码),学分Ccredit(smallint)。
create table Course(Cno char(4) primary key,Cname char(40),Cpno char(4),Ccredit smallint);若设置Cpno 外码,插入数据时会提示违反外码约束。
数据结构实验报告 图
数据结构实验报告图一、实验目的本次实验的主要目的是深入理解和掌握图这种数据结构的基本概念、存储结构和相关算法,并通过实际编程实现来提高对图的操作和应用能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验内容(一)图的存储结构1、邻接矩阵邻接矩阵是用一个二维数组来表示图中顶点之间的关系。
如果顶点i 和顶点 j 之间有边相连,则数组中对应的元素值为 1;否则为 0。
这种存储结构简单直观,适用于顶点数较少且边数较多的稠密图。
2、邻接表邻接表是为图的每个顶点建立一个单链表,链表中存储的是与该顶点相邻的顶点信息。
这种存储结构在存储空间上比较节省,适用于顶点数较多且边数较少的稀疏图。
(二)图的遍历算法1、深度优先遍历(DepthFirst Search,简称 DFS)从图中的某个顶点出发,沿着一条路径尽可能深地访问顶点,直到无法继续前进,然后回溯到上一个未完全访问的顶点,继续进行深度优先搜索。
2、广度优先遍历(BreadthFirst Search,简称 BFS)从图中的某个顶点出发,先访问其所有相邻的顶点,然后再依次访问这些相邻顶点的相邻顶点,以此类推,逐层向外扩展。
(三)图的最短路径算法1、迪杰斯特拉(Dijkstra)算法用于求解单源最短路径问题,即从一个给定的源顶点到图中其他所有顶点的最短路径。
2、弗洛伊德(Floyd)算法用于求解任意两个顶点之间的最短路径。
四、实验步骤(一)邻接矩阵的实现```cppinclude <iostream>using namespace std;const int MAX_VERTEX_NUM = 100;class Graph {private:int vertexNum;int edgeNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;edgeNum = 0;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = 0;}}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = 1;adjMatrixji = 1;edgeNum++;}}void printGraph(){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){cout << adjMatrixij <<"";}cout << endl;}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gprintGraph();return 0;}```(二)邻接表的实现```cppinclude <iostream>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void printGraph(){for (int i = 0; i < vertexNum; i++){cout << i <<":";for (int j = 0; j < adjListisize(); j++){cout << adjListij <<"";}cout << endl;}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gprintGraph();return 0;}```(三)深度优先遍历的实现```cppinclude <iostream>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100;class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM;bool visitedMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){visitedi = false;}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void DFS(int v) {visitedv = true;cout << v <<"";for (int i = 0; i < adjListvsize(); i++){int u = adjListvi;if (!visitedu) {DFS(u);}}}void DFSTraversal(){for (int v = 0; v < vertexNum; v++){if (!visitedv) {DFS(v);}}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gDFSTraversal();return 0;}```(四)广度优先遍历的实现```cppinclude <iostream>include <queue>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM; bool visitedMAX_VERTEX_NUM; public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){visitedi = false;}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void BFS(int v) {queue<int> q;visitedv = true;qpush(v);while (!qempty()){int u = qfront();qpop();cout << u <<"";for (int i = 0; i < adjListusize(); i++){int w = adjListui;if (!visitedw) {visitedw = true;qpush(w);}}}}void BFSTraversal(){for (int v = 0; v < vertexNum; v++){if (!visitedv) {BFS(v);}}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gBFSTraversal();return 0;}```(五)迪杰斯特拉算法的实现```cppinclude <iostream>include <climits>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; const int INFINITY = INT_MAX; class Graph {private:int vertexNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;int distanceMAX_VERTEX_NUM;bool visitedMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = INFINITY;}distancei = INFINITY;visitedi = false;}}void addEdge(int i, int j, int weight) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = weight;adjMatrixji = weight;}}int minDistance(){int min = INFINITY;int minIndex =-1;for (int v = 0; v < vertexNum; v++){if (!visitedv && distancev <= min) {min = distancev;minIndex = v;}}return minIndex;}void dijkstra(int src) {distancesrc = 0;for (int count = 0; count < vertexNum 1; count++){int u = minDistance();visitedu = true;for (int v = 0; v < vertexNum; v++){if (!visitedv && adjMatrixuv!= INFINITY && distanceu!=INFINITY && distanceu + adjMatrixuv < distancev) {distancev = distanceu + adjMatrixuv;}}}for (int i = 0; i < vertexNum; i++){cout <<"源点"<< src <<"到顶点"<< i <<"的最短距离为: "<< distancei << endl;}}};int main(){Graph g(5);gaddEdge(0, 1, 2);gaddEdge(0, 2, 4);gaddEdge(1, 2, 1);gaddEdge(1, 3, 7);gaddEdge(2, 3, 3);gaddEdge(3, 4, 5);gdijkstra(0);return 0;}```(六)弗洛伊德算法的实现```cppinclude <iostream>include <climits>using namespace std;const int MAX_VERTEX_NUM = 100; const int INFINITY = INT_MAX; class Graph {private:int vertexNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;int distanceMAX_VERTEX_NUMMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = INFINITY;}}}void addEdge(int i, int j, int weight) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = weight;}}void floyd(){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){distanceij = adjMatrixij;}}for (int k = 0; k < vertexNum; k++){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){if (distanceik!= INFINITY && distancekj!= INFINITY &&distanceik + distancekj < distanceij) {distanceij = distanceik + distancekj;}}}}for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){if (distanceij == INFINITY) {cout <<"顶点"<< i <<"到顶点"<< j <<"的距离为: 无穷大" << endl;} else {cout <<"顶点"<< i <<"到顶点"<< j <<"的距离为: "<< distanceij << endl;}}}}};int main(){Graph g(4);gaddEdge(0, 1, 5);gaddEdge(0, 3, 10);gaddEdge(1, 2, 3);gaddEdge(2, 3, 1);gfloyd();return 0;}```五、实验结果分析(一)邻接矩阵和邻接表的比较邻接矩阵的优点是可以快速判断两个顶点之间是否有边相连,时间复杂度为O(1)。
太原理工大学数据库实验报告
本科实验报告课程名称:数据库系统概论实验项目:交互式SQL、数据完整性、用户鉴别与数据控制实验地点:致远楼B503专业班级:软件1229班学号:**********学生姓名:***指导教师:***2014年3 月18 日一、实验目的和要求熟悉通过SQL 对数据库进行操作。
二、实验内容和原理1.在RDBMS 中建立一个学生-课程数据库,进行实验所要求的各种操作,所有的SQL 操作均在此建立的新库里进行。
2.根据以下要求认真进行实验,记录所有的实验用例及执行结果。
数据定义:基本表的创建、修改及删除;索引的创建和删除。
数据操作:完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询);完成各类更新操作(插入数据,修改数据,删除数据)。
视图的操作:视图的定义(创建和删除),查询,更新(注意更新的条件)。
三、主要仪器设备操作系统:Windows 7。
数据库管理系统:SQL Server2008。
四、操作方法与实验步骤实验数据记录实验结果(一)数据定义:一.基本表的操作1.建立基本表1)创建学生表Student,由以下属性组成:学号Sno(char 型,长度为9,主码),姓名Sname(char 型,长度为20,唯一),性别Ssex(char 型,长度为2),年龄(smallint),所在系(char 型,长度为20)。
create table Student(Sno char(9) primary key,Sname char(20) unique,Ssex char(2),Sage smallint,Sdept char(20));2)创建课程表Course,由以下属性组成:课程号Cno(char 型,主码,长度为4),课程名Cname(char 型,长度为40),先行课Cpno(char型,长度为4,外码),学分Ccredit(smallint)。
create table Course(Cno char(4) primary key,Cname char(40),Cpno char(4),Ccredit smallint);若设置Cpno 外码,插入数据时会提示违反外码约束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告课程名称:数据结构B实验项目:图实验地点:实验楼110专业班级:计科1301班学号:********** 学生姓名:**指导教师:**2015年1 月1 日一、实验目的和要求熟悉图的存储结构,掌握有关算法的实现,了解图在计算机科学及其他工程技术中的应用。
二、实验内容和原理1.采用邻接表存储结构,编写一个求无向图的连通分量个数的算法。
2.试基于图的深度优先搜索策略编写一程序,判别以邻接表方式存储的有向图中是否存在有顶点V i到V j顶点的路径(i≠j)。
3.在上述例题中,如改用邻接表的方式存储图,试编一程序实现上述算法。
顶点表nodelist的每个元素包含四个字段:其中mark mark字段为false,每访问过一个顶点,则mark字段置为true。
info为顶点值,pre为访问路径上该顶点的前驱顶点的序号,out指向该顶点的出边表。
三、主要仪器设备1.设备: PC微机;2.实验环境: windows操作系统;VC++6.0,四、实验结果与分析(必填)(1)程序代码://————————*********用邻接矩阵实现#include <stdio.h>#define OK 1#define ORROR 0#define max 10 // a function to build adjacency matrix of a graphtypedef int Status;void buildadjm(int adj[][max], int n){int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){printf("enter 1 if there is an edge from %d to %d, otherwise enter 0 \n",i,j);scanf("%d",&adj[i][j]);}}// a function to visit the nodes in a depth-first ordervoid dfs(int x,int visited[],int adj[][max],char adjc[], int n){int j;visited[x] = 1;printf("%c结点被访问\n",adjc[x]);for(j=0;j<n;j++)if(adj[x][j] ==1 && visited[j] ==0)dfs(j,visited,adj,adjc, n);}void buildadjm_1(int adj[][max], char adjc[], int n){int visited[max];int i;printf("\n请输入你要建立图的结点数(<= %d)\n",max);scanf("%d",&n);buildadjm(adj,n);for(i=0; i<n; i++)visited[i] =0;for(i=0; i<n; i++)if(visited[i] ==0)dfs(i,visited,adj,adjc, n);}Status JudgeNodei_jgraph(int x,int y,int visited[],int adj[][max],char adjc[],int n) {int i,j;visited[x]=1;//printf("%c结点被访问\n",adjc[x]);for(i=0;i<n;i++)if(adj[x][i] ==1 && visited[i] ==0)JudgeNodei_jgraph(i,y,visited,adj,adjc,n);if(visited[y] == 0)return ORROR;elsereturn OK;Status AccountConnectComponent_Undigraph(int visited[],int adjj[][max],char adjc[],int n) {int i,j=0;for(i=0; i<n; i++){//printf("i=%d",i);if(visited[i] ==0){j++;dfs(i,visited,adjj,adjc,n);//printf("j=%d\n",j);}}return j;}Status AccountConnectComponent_Undigraph_1(int adjj[][max],char adjc[],int n){int node;int visited[max];int i;for(i=0; i<n; i++)visited[i] =0;node = AccountConnectComponent_Undigraph(visited,adjj,adjc,n);printf("\n该图的联通分量为%d",node);return OK;}Status find_char_num(char adjc[],char a){int i;for(i=0;i<max;i++)if(a == adjc[i])return i;}Status JudgeNodei_jgraph_1(int adjj[][max],char adjc[],int n){char a,b;int x,y;int visited[max];int i;for(i=0; i<n; i++)visited[i] =0;printf("\n请输入你要判断的两个结点,用空格隔开");scanf("%c %c",&a,&b);x = find_char_num(adjc,a);y = find_char_num(adjc,b);if(JudgeNodei_jgraph(x,y,visited,adjj,adjc,n))printf("两点联通");elseprintf("两点不联通");return OK;}char adjc[10] = {'a','b','c','d','e','f','g','h','k','?'};int adjj[10][10] ={{0,0,1,1,1, 1,0,0,0,0}, // a{0,0,0,0,0, 0,1,0,0,0}, // b{1,0,0,0,0, 0,0,1,0,0}, // c{1,0,0,0,0, 0,0,1,0,0}, // d{1,0,0,0,0, 0,0,1,0,0}, // e{1,0,0,0,0, 0,0,1,0,0}, // f{0,1,0,0,0, 0,0,0,0,0}, // g{0,0,1,1,0, 1,0,0,1,0}, // h{0,0,0,0,1, 1,0,1,0,0}, // k{0,0,0,0,0, 0,0,0,0,0} // ?};Status menu_select(){int sn;for(;;){printf("\n请输入您要进行的功能选项");scanf("%d",&sn);getchar();if(sn<1||sn>4)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}void main(){int adj[max][max],n;n = 9;printf("1.现有图并判断现有图的联通分量;\n2.判断现有图中两个点是否联通;\n3.建立一个新图,遍历并打印;\n4.结束;\n");while(1){switch(menu_select()){case 1:AccountConnectComponent_Undigraph_1(adjj,adjc,n);printf("\n");break;case 2:JudgeNodei_jgraph_1(adjj,adjc,n);getchar;printf("\n");break;case 3:buildadjm_1(adj,adjc,n);getchar;printf("\n");break;case 4:printf("\nend\n");return;}}}//————————*********用邻接表实现#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define MAX_VERTEX_NUM 20#define OK 1#define ERROR 0typedef int Status;typedef int VRType;typedef int InfoType;typedef char VertexType;/*------------------------图的邻接表存储表示-----------------*/typedef struct ArcNode //每个结点由三个域构成{int adjvex; //adjvex邻接点域该弧所指向的顶点的位置struct ArcNode *nextarc; //nextarc链域指向下一条弧的指针InfoType *info; //info数据域该孤相关信息的指针}ArcNode;typedef struct VNode //每个链表上附一个表头结点存储顶点名以及有关信息域{int mark; //标记该图是否被访问过VertexType data; //数据域顶点信息ArcNode *firstarc; //链域指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arcnum; //图的当前顶点数int kind; //图的种类标志}ALGraph;///元素在图中的位置int LocateNode__ALGraph(ALGraph g,VertexType v){for(int i=0;i<g.vexnum;i++){if(g.vertices[i].data == v)return i;}return -1;}//当前有向图中是否存在边<i,j>Status Exist_Graph(ALGraph G,int i,int j){ArcNode *s;//printf("i=%d j=%d\n",i,j);s=G.vertices[i].firstarc;while(s && s->adjvex!=j)s=s->nextarc;if(s)return OK;elsereturn ERROR;}//图是否存在Status ExistG(ALGraph g){if(g.vexnum < 0){printf("图不存在,请先创建图\n");return 0;}return OK;}//创建一个图Status Create_ADG(ALGraph &g){int i,j,k,l;ArcNode *p;VertexType v1,v2;char c;printf("请输入有向图的顶点数:");scanf("%d",&g.vexnum);//printf("%d",g.vexnum);while(g.vexnum>MAX_VERTEX_NUM){printf("\n请输入有向图的顶点数:");scanf("%d",&g.vexnum);}i=g.vexnum*(g.vexnum-1);printf("请输入有向图的边数:");scanf("%d",&g.arcnum);while(g.arcnum > i){printf("\n请输入有向图的边数:");scanf("%d",&g.arcnum);}printf("请依次输入有向图的各个顶点(用回车分隔):");for(i=0;i<g.vexnum;i++) //输入顶点信息{//printf("&&&&&%d",g.vexnum);//printf("i=%d",i);scanf("%c",&c); scanf("%c",&c); ////什么情况为什么写两个才能通过——————原因:回车也是一个字符,所以出错l=LocateNode__ALGraph (g,c);if(l>=0){printf("输入的顶点重复,请重新输入\n");i--;continue;}g.vertices[i].data=c;g.vertices[i].firstarc=NULL;}for(k=0;k<g.arcnum;k++) //输入边的信息{printf("\n请输入第%d条弧的起点与终点(用逗号分隔):",k+1);scanf("%c,%c",&v1,&v2);i=LocateNode__ALGraph(g,v1);j=LocateNode__ALGraph (g,v2);if( i<0 || j<0 || i==j || Exist_Graph(g,i,j) ){k--;continue;}p=(ArcNode*)malloc(sizeof(ArcNode)); //建立结点if(!p)return ERROR;p->adjvex=j;p->nextarc=g.vertices[i].firstarc; //顶点i的链表g.vertices[i].firstarc=p; //添加到最左边}printf("有向图的邻接表创建成功\n");return OK;}/*------------------------------输出图的信息-------------------*/void Print_Gra(ALGraph G){ArcNode *p;int i;printf("图中有%d个顶点,%d条弧:\n",G.vexnum,G.arcnum);for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;printf("%c\t",G.vertices[i].data);while(p){printf("<%c,%c>",G.vertices[i].data,G.vertices[p->adjvex].data);p=p->nextarc;}printf("\n");}}/*----------------------------判断联通分量————————*/Status Dfs(ALGraph G,int visited[],int i) //深度遍历{int j;visited[i] = 1;printf("%c结点被访问\n",G.vertices[i].data);for(j=0;j<G.vexnum;j++)if( (Exist_Graph(G, i, j) ==1 || Exist_Graph(G,j,i)) && visited[j] == 0) Dfs(G,visited,j);return 0;}Status AccountConnectComponent(ALGraph G){int i,j=0;int visited[MAX_VERTEX_NUM-1];for(i=0; i<G.vexnum; i++)visited[i] =0;for(i=0; i<G.vexnum; i++){//printf("i=%d",i);if(visited[i] ==0){j++;Dfs(G,visited,i);//("+++++++j=%d\n",j);}}printf("该图联通分量的个数为%d",j);return OK;}Status JudgeNodei_jgraph_1( ALGraph G,int i,int j,int visited[],int &ok) {int k,m;for(k=0;k<G.vexnum;k++){if((Exist_Graph(G,i,k) || Exist_Graph(G,k,i)) && i != k){//printf("%d被访问",i);visited[i]=1;if(visited[k] == 0 && k != j)JudgeNodei_jgraph_1(G,k,j,visited,ok);}if(Exist_Graph(G,k,j))ok=1;if(Exist_Graph(G,i,j))ok=1;}return OK;}Status find_Node_num(char a,ALGraph G){int i;for(i=0;1<G.vexnum;i++)if(G.vertices[i].data == a)return i;}Status JudgeNodei_jgraph (ALGraph G){int i,j;char a,b;int visited[MAX_VERTEX_NUM-1],ok=0;for(i=0; i<G.vexnum; i++)visited[i] =0;printf("\n请输入你要判断的两个结点,用,隔开:");scanf("%c,%c",&a,&b);i = find_Node_num(a,G)+1;j = find_Node_num(b,G)+1;//printf("i=%d,j=%d",i,j);JudgeNodei_jgraph_1(G,i,j,visited,ok);if(ok==0)printf("两个结点联通");elseprintf("两个结点不联通");return OK;}Status menu_select(){int sn;for(;;){printf("\n请输入您要进行的功能选项");scanf("%d",&sn);getchar();if(sn<1||sn>5)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}void main(){ALGraph g;printf("1.创建一个图;\n2.打印您创建的图;\n3.计算图的联通分量;\n4.判断两点是否联通;\n5.结束;\n");while(1){switch(menu_select()){case 1:printf("1*");Create_ADG(g);printf("\n");break;case 2:printf("2*");Print_Gra(g);printf("\n");break;case 3:printf("3*");AccountConnectComponent(g);getchar();printf("\n");break;case 4:printf("4*");JudgeNodei_jgraph (g);printf("\n");break;case 5:printf("\n5* end\n");return;}}}(2)运行结果邻接矩阵:邻接表:四、实验感想1、无向图和联通图在实际储存中是一样的2、图的两种存储方式中邻接矩阵和邻接表,邻接表不如邻接矩阵方便。