北理工数据结构上机实验报告1
北京理工大学数据结构实验报告一
班级:05111451姓名:任子龙学号:1120140167
1、需求分析
1.学生成绩利用单链表存储,方便随时插入和删除学生成绩记录,实现动态管理,一个学生的成绩信息作为一个结点。
2.程序以用户和计算机对话的方式执行,即在计算机终端上显示“提示信息”之后,用户在键盘上输入规定的数据,回车后,运算结果显示在其后。
p->next=NULL;
head=p;
printf("\t输入需要录入信息的学生人数\n");
scanf("%d",&n);
for(i=0;i<n;i++)//该循环语句是用来输入录入学生的各类信息//
{ q=(student*)malloc(sizeof(student));
q->num=i+1;
//若1≤i≤n,则在L的第i个元素后面插入新元素e。
voidDeletenode(&L,i);
//若1≤i≤n,则删除L的第i个元素。
其中,部分操作的伪码算法如下:
void input(){ //输入学生成绩信息//
int i=0,j=0,n;
p=(student*)malloc(sizeof(student));//申请空间,创建带头结点的空指针
p=head;
if(!p) {printf("提示:系统尚未录入任何信息!\n");exit(0);
}
p=head->next;
while(flag&&p)
{
if(p->studentnum==stdnum)
{
printf("学生的成绩信息如下:\n");
北京理工大学计算机实验一报告表
实验一实验报告表
实验名称:图灵机模型与计算机硬件系统虚拟拆装
学号:姓名:班级:实验时间:
实验报告表1-1图灵机模型中的主要组成部分及作用
在纸带上左右移动
说明:可根据需要加行
实验报表1-2冯.诺依曼计算机体系结构的功能描述
实验报告表1-3 实验所使用的计算机硬件配置登记表
实验报告表1-4 微型计算机拆卸顺序记录表
实验报告表1-5 微型计算机安装顺序记录表
实验报告表1-6 微型计算机安装顺序调整记录表
说明:可根据需要加行
实验报告表1-7 6个指定部件的安装顺序记录表
实验报告表1-8 扩充内存
实验报告表1-9更换显卡
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】。
数据结构上机实验报告
else insert(lc,i/2,la.list[i]); //偶数位次元素插入lc
}
printf("\n您输入的线性表元素为:\n\n");
print(la);
printf("线性表的奇数位次的元素为:\n\n");
print(lb);
printf("线性表的偶数位次的元素为:\n\n");
print(lc);
}
void initial(sqlist &v)
{printf(" ****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n");
int i,a;
printf("请输入一个偶数作为线性表的长度:\n\n");
void initlist(sqlist &);
void print(sqlist); //输出线性表
void main()
{printf(" *****************本程序可以实现线性表的复制******************\n");
sqlist la,lb; //声明线性表
initial(la);
【程序设计细想】:
建立三个线性表la,lb,lc,对线性表la进行输入,然后利用循环结构对la中奇数位序的元素对lb进行插入操作,对偶数位序的元素对lc进行插入操作,从而得到线性表lb和lc。
【程序代码】:
#include<stdio.h>
#include<malloc.h>
北京理工大学计算机实验一报告表
北京理工大学计算机实验一报告表北京理工大学计算机实验一报告一、实验目的:1. 了解计算机实验室的硬件设备,熟悉计算机的组成和工作原理;2. 掌握计算机的基本操作和调试方法,熟悉计算机的操作系统和软件环境;3. 学习使用计算机进行数据输入、处理和输出。
二、实验内容:1. 硬件设备:了解计算机的主要硬件组成,包括中央处理器(CPU)、内存、硬盘、显卡等;2. 操作系统:熟悉计算机的操作系统,学习操作系统的基本功能和操作方法;3. 软件环境:了解计算机的软件环境,学习使用常用的办公软件和编程工具;4. 数据输入:学习使用键盘和鼠标进行数据输入,了解数据的输入格式和方式;5. 数据处理:学习使用计算机进行数据处理,包括数据的存储、计算和分析;6. 数据输出:学习使用计算机进行数据输出,包括打印、显示和保存等方式。
三、实验步骤:1. 硬件设备:了解计算机的主要硬件组成,包括CPU、内存、硬盘、显卡等,熟悉各个硬件的功能和作用;2. 操作系统:熟悉计算机的操作系统,学习操作系统的基本功能和操作方法,包括开机、关机、重启等;3. 软件环境:了解计算机的软件环境,学习使用常用的办公软件和编程工具,如Microsoft Office和Visual Studio等;4. 数据输入:学习使用键盘和鼠标进行数据输入,了解数据的输入格式和方式,如文本、数字、图像等;5. 数据处理:学习使用计算机进行数据处理,包括数据的存储、计算和分析,如使用Excel进行数据分析;6. 数据输出:学习使用计算机进行数据输出,包括打印、显示和保存等方式,如使用打印机打印数据报告。
四、实验结果:本次实验我们成功地熟悉了计算机的硬件设备和软件环境,掌握了计算机的基本操作和调试方法。
我们学会了使用键盘和鼠标进行数据输入,使用计算机进行数据处理和输出。
通过实验,我们进一步了解了计算机的组成和工作原理,对计算机的操作系统和软件环境有了更深入的了解。
北京理工大学数据结构实验报告1
《数据结构与算法统计》实验报告 学院: 班级: 学号: 姓名:一、实验目的 1.熟悉VC++6.0环境,学习使用C++实现链表的存储结构; 2.通过编程,上机调试,进一步理解线性表、链表、环表的基本概念。
二、实验内容采用单向环表实现约瑟夫环。
请按以下要求编程实现:① 从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,......,m。
② 从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。
则输出序列为:6,10,4,9,5,2,1,3,8,7。
三、程序设计1、概要设计应用单向环表寄存数字序列。
⑴单向环表的抽象数据类型线性表的定义如下:ADT LinkList {数据对象:D = { ai | ai ?ElemSet, i=1,...,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai ?D, i=2, ...,n }基本操作:Creat(LinkList &L,int m)操作结果:构造一个有m个结点的单向环表L。
found(LinkList L,int s)初始条件:单向环表L已经存在。
操作结果:找到单向环表L的第s个结点。
ysf(LinkList h,int n) 初始条件:单向环表L已经存在,且本次查找的起始结点h已找到。
操作结果:进行约瑟夫环的计算并输出相应值。
} ADT LinkList⑵主程序流程主程序首先调用Creat(LinkList &L,int m)函数,创建含有m个结点的单向环表L;再调用found(LinkList L,int s)函数查找第s个结点;最后调用ysf(LinkList h,int n)函数,进行约瑟夫环的计算并在屏幕上显示计算结果。
哈尔滨理工大学数据结构实验报告线性表
课程名称:数据结构实验项目:线性表姓名:zhangsan专业:网络工程班级:09-1班00000 10000计算机科学与技术学院实验教学中心20 11年 5 月17 日实验项目名称:线性表(学时)一、实验目的了解顺序表的结构特点及有关概念,掌握顺序表建立、插入、删除的基本操作算法。
2.了解单链表的结构特点及有关概念,掌握单链表建立、插入、删除的基本操作算法。
二、实验内容1.顺序表的实践。
1)建立4个元素的顺序表list[]={2,3,4,5},实现顺序表建立的基本操作。
2)在list[]={2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。
3)在list[]={2,3,4,9,5}中删除指定位置(i=3)上的元素9,实现顺序表的删除的基本操作。
2.单链表的实践。
1)建立一个包括头结点和3个结点的(4,2,1)的单链表,实现单链表建立的基本操作。
2)在已建好的单链表中的指定位置(x=2)插入一个结点3,实现单链表插入的基本操作。
3)在一个包括头结点和4个结点的(4,2,3,1)的单链表的指定位置删除一个结点,实现单链表删除的基本操作。
三、实验步骤线性表(linear list)是n(n≥0)个数据元素a1,a2,…an组成的有限序列。
其中n 称为数据元素的个数或线性表的长度,当n=0时称为空表,n>0时称为非空表。
通常将非空的线性表记为(a1,a2,…,an),其中的数据元素ai(1≤i ≤n)是一个抽象的符号, ai是第i个数据元素,称i为数据元素ai在线性表中的位置。
其具体含义在不同情况下是不同的,即它的数据类型可以根据具体情况而定,本书中,我们将它的类型设定为elemtype,表示某一种具体的已知数据类型。
顺序表也称为线性表的顺序存储结构。
其存储方式为:在内存中用一组地址连续的存储单元依次存储线性表的数据元素,但该连续存储空间的大小要大于或等于顺序表的长度。
一般让线性表中第一个元素存放在连续存储空间第一个位置,第二个元素紧跟着第一个之后,其余依此类推。
数据结构上机实验报告
数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
数据结构上机实验报告
数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。
2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。
通过实验,我们将学习如何使用这两种数据结构来解决实际问题。
3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。
3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。
该算法可以判断一个字符串中的括号是否匹配。
具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。
通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。
3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。
该算法可以模拟多个任务按照一定的优先级进行调度的过程。
具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。
通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。
4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。
数据结构上机实验报告
数据结构实验报告课程数据结构 _ 院系专业班级实验地点姓名学号实验时间指导老师数据结构上机实验报告1一﹑实验名称:实验一——链表二﹑实验目的:1.了解线性表的逻辑结构特性;2.熟悉链表的基本运算在顺序存储结构上的实现,熟练掌握链式存储结构的描述方法;3.掌握链表的基本操作(建表、插入、删除等)4. 掌握循环链表的概念,加深对链表的本质的理解。
5.掌握运用上机调试链表的基本方法三﹑实验内容:(1)创建一个链表(2)在链表中插入元素(3)在链表中删除一个元素(4)销毁链表四﹑实验步骤与程序#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"请输入一个链表:"<<endl;for(int i=0;i<j;i++){ p=(LinkList)malloc(sizeof(Lnode));cin>>p->data;p->next=q->next;q->next=p;q=p;}}int PrintLinkList(LinkList &L){//输出链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算链表L的数据元素个数。
院校资料-北理工数据结构实验报告
北理工数据结构实验报告《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:____学号:__姓名:_____一、实验目的1、熟悉VC 环境,学习使用C 语言实现栈的存储结构。
2、通过编程、上机调试,进一步理解栈的基本概念。
3、锻炼动手编程,独立思考的能力。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:① 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;② 输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计为实现上述程序功能,应使用两个栈,分别寄存操作数与运算符。
为此,需要栈的抽象数据结构。
(1)、栈的抽象数据类型定义为:ADT Stack{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,2,,}i i i i a a a a D i n --∈=约定n a 端为栈顶,1a 端为栈底。
基本操作:InitStack(&S)操作结果:创建一个空栈S。
GetTop(S,&e)初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
Push(&S,e)初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&S,&e)初始条件:栈S已存在且非空。
操作结果:删除S的栈顶元素,并用e返回其值。
In(m,a[])操作结果:若m是运算符,返回TRUE。
Precede(m, n)初始条件:m,n为运算符。
操作结果:若m优先级大于n,返回>,反之亦然。
Operation(a, theta,b)初始条件:a,b为整数,theta为运算符。
北工大数据结构上机实验报告1
实验一报告姓名:学号:完成日期: 2015年4月7日1、题目: 设有n个人坐在一个圆桌周围, 现从第s个人开始报数, 数到第m的人出列, 然后从出列的下一个人重新开始报数, 数到第m的人又出列, 如此反复直到所有的人全部出列为止。
Josephus问题是: 对于任意给定的n、s、m, 求出按出列次序得到的n个人员的序列。
试在计算机上模拟Josephus问题的求解工程。
2、需求分析输入形式、输入值的范围: 输入的值必须为正整数输出形式: 输出为一组正整数程序功能:对于任意给定的n、s、m, 求出按出列次序得到的n个人员的序列。
测试数据: 正确的输入: 6 3 2正确的输出: 4 6 2 5 3 1错误的输入: 6 3 23、错误的输出: 1 2 3 4 5 64、概要设计主程序流程:否是5、 调试分析 调试中并遇到的问题: 运行结果少一个数解决方案:在while 循环的限制条件中, 是循环次数加16、算法时空分析: O(n) 7、用户使用说明 8、 运行程序后, 用户按照提示顺序输入3个正整数, 然后按回车可得到结果9、 测试结果输入: 6 3 210、 输出: 4 6 2 5 3 111、 源程序以顺序表实现:#include<iostream>using namespace std;void JJ(int n,int s,int m){int *a=new int [10000];int i;int count=0;int t=0;for(i=0;i<n;i++){a[i]=i+1;}i=s-1;cout<<"出列次序为: ";while(count<n-1){if(a[i]!=0)t++;if(t==m){t=0;//记数归cout<<a[i]<<" ";//依次输出删除的编号a[i]=0;//给删除的数组赋0count++;//退出人数加1}i++;if(i==n)i=0;//报数到末尾后i恢复为0}cout<<endl;}void main(){int n,s,m;cout<<"请输入总人数:"<<endl;cin>>n;cout<<"请输入开始报数的人员序号:"<<endl;cin>>s;cout<<"请输入出列人员的序号:"<<endl;cin>>m;JJ(n,s,m);}以链表实现:#include<iostream>using namespace std;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void JJ(int n,int s,int m){LinkList p,r,list=NULL;int i;//建立一个循环链表for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));p->data=i+1; //存放第i个结点的编号if(list==NULL)list=p;elser->next=p;r=p;}p->next=list;p=list;for(i=1;i<s;i++){r=p;//当m!=1,但s=1时如果没有这条语句, 此时删除动作无法完成p=p->next;}//此时p指向第1个出发结点cout<<"出列次序为: ";while(p->next!=p){for(i=1;i<m;i++){r=p;p=p->next;} //p指向第m个结点,r指向第m-1个结点r->next=p->next; //删除第m个结点cout<<p->data<<" ";delete p;p=r->next;}cout<<p->data;cout<<endl;}void main(){int n,s,m;cout<<"请输入总人数:"<<endl;scanf("%d",&n);cout<<"请输入开始报数的人员序号:"<<endl;scanf("%d",&s);cout<<"请输入出列人员的序号:"<<endl;scanf("%d",&m);JJ(n,s,m);}。
数据结构上机实验报告
实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。
2. 能够运用C语言实现基本数据结构的各种操作。
3. 培养编程能力和问题解决能力。
实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。
- 在第3个位置插入一个新元素。
- 删除第5个位置的元素。
- 查找线性表中的第7个元素。
- 遍历线性表,并打印所有元素。
二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个栈。
- 向栈中依次入栈元素1、2、3、4、5。
- 判断栈是否为空。
- 求栈顶元素。
- 出栈元素,并打印出栈的元素。
三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个队列。
- 向队列中依次入队元素1、2、3、4、5。
- 判断队列是否为空。
- 求队头元素。
- 出队元素,并打印出队的元素。
四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
- 查找链表中的第4个元素。
- 遍历链表,并打印所有元素。
五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
数据结构上机实验报告
数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。
具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。
2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。
3、培养分析问题、设计算法、编写代码和调试程序的综合能力。
4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。
二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。
比较顺序表和链表在不同操作下的性能差异。
2、栈和队列的应用利用栈实现表达式求值。
用队列模拟银行排队系统。
3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。
构建哈夫曼树,并进行编码和解码操作。
4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。
四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。
数据结构上机实验报告
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {
哈尔滨理工大学数据结构第1次实践课内容
•2、已知两个链表(头指针分别为 La 和 Lb)中的数据元素均自小至大有序,编写算法将这两个链表归并为一个链表。
(顺序结构)•3、删除线性表a中第i个元素起的k个元素(链式结构)•#include <stdio.h>•#include <stdlib.h>•#define INTERLENGTH 100•#define INCREASE 10•#define OK 1•#define ERROR -1•#define OVERFLOW -2•typedef struct•{• int *List;• int length;• int size;•}Sqlist;•int cj(Sqlist &L)•{• L.List=(int *)malloc(sizeof(int)*INTERLENGTH);• if(L.List==NULL)• exit(OVERFLOW);• L.length=0;• L.size=INTERLENGTH;• return OK;•}•int insert(Sqlist &L,int a)•{• if(L.length==L.size)• {• int *newbase;• newbase=(int*)realloc(L.List,sizeof(int )*(L.size+INCREASE));• if(newbase==NULL)• exit(OVERFLOW);• L.List=newbase;• L.size+=INCREASE;• }• L.List[L.length]=a;• L.length++;• return OK;•}•void meirt(Sqlist &L1,Sqlist &L2,Sqlist &L3)•{• int i=0,j=0;• while(i<L1.length&&j<L2.length) • {• if(L1.List[i]<L2.List[j]) • {• insert(L3,L1.List[i]); • i++;• }• else• {• insert(L3,L2.List[j]); • j++;• }• }• while(i<L1.length)• {• insert(L3,L1.List[i]);• i++;• }• while(j<L2.length)• {• insert(L3,L2.List[j]);• j++;• }••}•int main()•{• Sqlist L1,L2,L3;• cj(L1);• cj(L2);• cj(L3);• int n;• printf("请输入元素个数:");• scanf("%d",&n);• for(int k=0;k<n;k++)• {• int a;• scanf("%d",&a);• insert(L1,a);• }• int b;• printf("请输入元素个数:"); • scanf("%d",&b);• for(int i=0;i<b;i++)• {• int a;• scanf("%d",&a);• insert(L2,a);• }• meirt(L1,L2,L3);• for(int i=0;i<L3.length;i++)• {• printf("%d ",L3.List[i]);• }•••••}•#include <stdio.h>•#include <stdlib.h>•#define INTERLENGTH 100•#define INCREASE 10•#define OK 1•#define ERROR -1•#define OVERFLOW -2•typedef struct•{• int *List;• int length;• int size;•}Sqlist;•int cj(Sqlist &L)•{• L.List=(int *)malloc(sizeof(int)*INTERLENGTH); • if(L.List==NULL)• exit(OVERFLOW);• L.length=0;• L.size=INTERLENGTH;• return OK;•}•int insert(Sqlist &L,int a)•{• if(L.length==L.size)• {• int *newbase;• newbase=(int*)realloc(L.List,sizeof(int )*(L.size+INCREASE));• if(newbase==NULL)• exit(OVERFLOW);• L.List=newbase;• L.size+=INCREASE;• }• L.List[L.length]=a;• L.length++;• return OK;•}•void meirt(Sqlist &L1,Sqlist &L2,Sqlist &L3) •{• int i=0,j=0;• while(i<L1.length&&j<L2.length)• {• if(L1.List[i]<L2.List[j])• {• insert(L3,L1.List[i]);• i++;• }• else• {• insert(L3,L2.List[j]);• j++;• }• }• while(i<L1.length)• {• insert(L3,L1.List[i]);• i++;• }• while(j<L2.length)• {• insert(L3,L2.List[j]);• j++;• }••}•int main()•{• Sqlist L1,L2,L3;• cj(L1);• cj(L2);• cj(L3);• int n;• printf("请输入元素个数:"); • scanf("%d",&n);• for(int k=0;k<n;k++)• {• int a;• scanf("%d",&a);• insert(L1,a);• }• int b;• printf("请输入元素个数:"); • scanf("%d",&b);• for(int i=0;i<b;i++)• {• int a;• scanf("%d",&a);• insert(L2,a);• }• meirt(L1,L2,L3);• for(int i=0;i<L3.length;i++) • {• printf("%d ",L3.List[i]); • }•••••}••。
北京理工大学数据结构实验报告 简易计算器(二叉树)
数据结构实验报告三——简易计算器(二叉树)姓名:任子龙学号:1120140167 班级:05111451一、需求分析(1)问题描述由键盘输入一算术表达式,以中缀形式输入,试编写程序将中缀表达式转换成一棵二叉表达式树,通过对该二叉树的后序遍历求出计算表达式的值。
(2)基本要求a.要求对输入的表达式能判断出是否合法,不合法要有错误提示信息。
b.将中缀表达式转换成二叉表达式树。
c.后序遍历求出表达式的值。
(3)数据结构与算法分析一棵表达式树,它的树叶是操作数,如常量或变量名字,而其他的结点为操作符。
a.建立表达式树。
二叉树的存储可以用顺序存储也可用链式存储。
当要创建二叉树时,先从表达式尾部向前搜索,找到第一个优先级最低的运算符,建立以这个运算符为数据元素的根结点。
注意到表达式中此运算符的左边部分对应的二叉绔为根结点的左子树,右边部分对应的是二叉绔为根结点的右子树,根据地这一点,可用递归调用自己来完成对左右子树的构造。
b.求表达式的值。
求值时同样可以采用递归的思想,对表达式进行后序遍历。
先递归调用自己计算左子树所代表的表达式的值,再递归调用自己计算右子树代表的表达式的值,最后读取根结点中的运算符,以刚才得到的左右子树的结果作为操作数加以计算,得到最终结果。
(4)测试a.加减运算输入:6+9-5 输出:10b.乘除运算输入:5.6*2.7/2 输出:7.56c.四则混合运算输入:(2+3)*8-3/2 输出:23.5d.非法输入输入:(5+6(*5 输出:括号不匹配!1.2问题分析与之前利用栈实现计算器功能不同,本实验采取的方法是:将中缀表达式转换成一棵二叉表达式树,通过对该树的后序遍历求出计算表达式的值。
所以,实验的重点是如何“将中缀表达式转换成一棵二叉表达式树”;如上图所示,该二叉表达式树表示的是计算式(5+2)*3。
可以看出,操作数均为叶子结点,其它结点为操作符;构建二叉树的整体思路是:(1)将中缀表达式转化为后缀表达式;(2)利用(1)中的后缀表达式,在此基础上构建二叉表达式树。
数据结构上机实验报告
数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。
2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。
b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。
记录并分析每个函数调用所消耗时间以评估算法效率。
3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。
b). 运行以上代码片段,并输出相应结果。
同时分析算法的时间复杂度和空间复杂度。
4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。
b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。
运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。
同时,在代码编写过程中也深刻理解并评估了各种算法效率。
6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。
7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。
数据结构第一次上机实验报告
数据结构第一次上机实验报告(线性表)实验要求:1、实现顺序表结构的创建、插入、删除、查找等操作;2、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重复的元素),并求这样的两个集合的并、交和源程序://C++实现//visual studi o 2010下编译通过#include<iostream>#include<vector>#include<algorithm>using namespace std;const size_t MaxSize=20;//顺序表初始分配量class SqList//顺序表类{//privata:int data[MaxSize];int length;//顺序表长度public:void InitList();//初始化void CreatList(int a[],int n);//创建void SearhList();//查找void InsertList();//插入void DeleteList(); //删除};//初始化线性表void SqList::InitList(){length=0;}//创建线性表void SqList::CreatList(int a[],int n){ cout<<"创建的顺序表:\n";for(int i=0;i<n;++i){data[i]=a[i];cout<<data[i]<<" ";}cout<<endl;length=n;}//顺序表的查找void SqList::SearhList(){int k=0;int number;//要查找的数据if(length==0)cout<<"空表"<<endl;else{cout<<"输入要查找的数据:"<<endl;cin>>number;for(int i=0;i<length;++i){if(data[i]==number){k=1;cout<<"查找成功,下标为:"<<i<<endl;break;}//if}//for}//el se}//顺序表的插入void SqList::InsertList(){int i,number;cout<<"请输入要插入的数据:"<<endl;cin>>number;cout<<"输入插入的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入插入位置:"<<endl;cin>>i;}i=i-1;for(int j=length+1;j>i;--j)data[j]=data[j-1];//插入位置后面的元素后移一位data[i]=number;//插入元素length=length+1;//表长加1cout<<"插入元素的线性表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}//顺序表的删除void SqList::DeleteList(){int i;cout<<"输入要删除的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入要删除的位置:"<<endl;cin>>i;}i=i-1;for(int j=i;j<length-1;++j)data[j]=data[j+1];length=length-1;cout<<"删¦除后的顺序表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}int main(){SqList L;L.InitList();//初始化int a[10];cout<<"向线性表输入数据(10个各不相等Ì的整数):"<<endl;for(int m=0;m<10;++m)cin>>a[m];L.CreatList(a,10);L.SearhList();L.InsertList();L.DeleteList();cout<<"线性表集合操作"<<endl;vector<int> ivec1;vector<int> ivec2;cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;//以矢量容器的形式存储线性表for(int n=0;n<10;++n){while(cin>>a[n]){ivec1.push_back(a[n]);break;}}cin.clear();cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;for(int n=0;n<10;++n){while(cin>>a[n]){ivec2.push_back(a[n]);break;}}//对线性表进行排序sort(ivec1.begin(),ivec1.end());sort(ivec2.begin(),ivec2.end());cout<<"线性表1排序后:"<<endl;for(vector<int>::iterator iter1=ivec1.begin();iter1!=ivec1.end();++iter1) cout<<*iter1<<" ";cout<<endl;cout<<"线性表2排序后¨:"<<endl;for(vector<int>::iterator iter2=ivec2.begin();iter2!=ivec2.end();++iter2) cout<<*iter2<<" ";cout<<endl;//两线性表的交void AND(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1){for(vector<int>::iterator it2=ivec2.begi n();it2!=ivec2.end();++it2){if(*it1==*it2)ivec.push_back(*it1);}}cout<<"两线性表的交:"<<endl;if(ivec.empty()) cout<<"为空";else{for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";}cout<<endl;}//两线性表的并void OR(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1)ivec.push_back(*it1);for(vector<int>::iterator it2=ivec2.begin();it2!=ivec2.end();++it2)ivec.push_back(*it2);sort(ivec.begin(),ivec.end());vector<int>::iterator end_unique=unique(ivec.begin(),ivec.end());//uni que函数将相同数据中的一个放入最后ivec.erase(end_unique,ivec.end());//erase删除unique函数返回位置到表最后的所有元素cout<<"两线性表的并:"<<endl;for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";cout<<endl;}//两线性表的差void cha(vector<int> &ivec1,vector<int> &ivec2);{vector<int>::iterator iter1;vector<int>::iterator iter2;int flag = 0;cout<<"线性表1对线性表2的差:"<<endl;for(iter1=ivec1.begin();iter1!=ivec1.end();++iter1){flag = 0;for(iter2=ivec2.begin();iter2!=ivec2.end();++iter2){if((*iter1)==(*iter2)){flag = 1;}}if(flag==0){cout << *iter1 << " ";}}if(flag==1)cout << "为空" << endl;else cout << endl;}}结果:。
北理工数据结构实验报告1
《数据结构与算法设计》实验报告——实验一学院:自动化学院班级:__学号:__姓名:____ ____一、实验目的1、熟悉VC环境,学习使用C语言实现链表的存储结构。
2、通过编程、上机调试,进一步理解线性表、链表、环表的基本概念。
3、锻炼动手编程,独立思考的能力。
二、实验内容采用单向环表实现约瑟夫环。
请按以下要求编程实现:①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。
则输出序列为:6,10,4,9,5,2,1,3,8,7。
三、程序设计1、概要设计为实现上述程序功能,应用单向环表寄存数字序列。
为此,需要单向环表的抽象数据结构。
(1)、单项环表的抽象数据类型定义为:ADT Joseph{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈=基本操作:create(&J, n)操作结果:构造一个有n 个结点的单向环表J 。
show(J)初始条件:单向环表J 已存在。
操作结果:按顺序在屏幕上输出J 的数据元素。
calculate( J,s,n)初始条件:单向环表J 已存在,s>0,n>0,s<环表结点数。
操作结果:返回约瑟夫环的计算结果。
}ADT Joseph(2)、宏定义#define OK 1#define ERROR 0(3)、主程序流程主程序首先调用create(J,m)函数创建含有m 个结点的单向环表J ,随后调用show(J)函数显示创建的环表内容,最后调用calculate(J,s,n)函数计算结果并在屏幕上打印。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上级实验报告1——采用单向环表实现约瑟夫环
一实验目的
采用单向环表实现约瑟夫环
二实验内容
请按以下要求编程实现:
①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中
的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到
第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。
则输出序列为:6,10,4,9,5,2,1,3,8,7。
三程序设计
(1)概要设计
抽象数据类型:
struct node
{ int number;
struct node * next;};
宏:无
主函数流程与各函数模块调用关系:
创建头结点=〉输入链表的长度m=〉调用create函数建立链表=〉输入首次定位的节点s 以及间隔数n=〉调用deal函数处理链表=〉结束
函数模块间无彼此调用关系
(2)详细设计
建立链表算法实现:
void create(node * head,int m)
{node * p,*q;
int i = 1;
for(;m>0;m--)
{ p = (node *)malloc(sizeof(node));
if(p == NULL) exit(0);
p->number = m;
p->next = head->next;
head->next = p;
if(i){q = p ; i--;}
}
q->next = head->next;}
处理链表算法实现:
void deal(node * head,int m,int s,int n)
{node * p,*q;
int count=1,tag=0;
p = head;
while(s--){ p = p->next;}
while(tag != m)
{if(count == n){
printf("%d->",p->number);
for(q = p->next; q->next != p; q=q->next);
q->next = p->next;
p = p->next;
q = q->next;
count = 1;
tag++;}
else {p = p->next;count++;}
}
printf("<-end\n");
}
主函数代码实现:
int main()
{ int m,s,n;
node * head, * p;
p = (node *)malloc(sizeof(node));
p->next == NULL;
head = p;
printf("please input number m:\n");
scanf("%d",&m);
create(head,m);
printf("please input number s(1<=s<=m):\n");
scanf("%d",&s);
printf("please input number n:\n");
scanf("%d",&n);
deal(head,m,s,n);
system("pause");
}
四程序调试分析
1在deal函数中进行对p节点的删除操作时出现问题,定位p的前一个节点q时,依旧采用了head指针从头遍历的方法,但是忽略了在函数操作中会删除掉头结点,
这样head指针指向位置改变不能得到正确结果。
所以改用q=p->next从p后节点遍
历的方法能够一直正确的获得p的前一节点的位置。
五用户使用说明
双击exe程序后,软件提示依次输入m,s,n的值;m为链表总长度,为任意正整数;s为第一次定位的节点位置,其值应满足1<=s<=m的正整数;n为间隔的数目,为任意正整数;输入后即可获得结果。
六程序运行结果
七程序清单
#include<stdio.h>
#include<stdlib.h>
struct node//定义链表
{ int number;
struct node * next;
};
void create(node * head,int m)//创建包含m个数字的环形表
{node * p,*q;
int i = 1;
for(;m>0;m--)
{ p = (node *)malloc(sizeof(node));
if(p == NULL) exit(0);
p->number = m;
p->next = head->next;
head->next = p;
if(i){q = p ; i--;}
}
q->next = head->next;//将最后一个节点指向头结点,实现环形表
}
void deal(node * head,int m,int s,int n)//处理链表,完成删除及输出{node * p,*q;
int count=1,tag=0;
p = head;
while(s--){ p = p->next;}//将p指向首次定位的第s个节点
while(tag != m)
{if(count == n){//如果正好数到n值,则进行输出、删除操作并重置计数器printf("%d->",p->number);
for(q = p->next; q->next != p; q=q->next);
q->next = p->next;
p = p->next;
q = q->next;
count = 1;
tag++;}
else {p = p->next;count++;}//如果没有到n值,则继续循环链表 }
printf("<-end\n");
}
int main()
{ int m,s,n;
node * head, * p;
p = (node *)malloc(sizeof(node));
p->next == NULL;
head = p;//定义头结点
printf("please input number m:\n");
scanf("%d",&m);//输入m值——链表长度
create(head,m);//创建该链表
printf("please input number s(1<=s<=m):\n");
scanf("%d",&s);//输入s值——首次定位节点
printf("please input number n:\n");
scanf("%d",&n);//输入n值——间隔数
deal(head,m,s,n);//处理链表,完成输出,删除操作
system("pause");
}。