《数据结构》上机实验一资料

合集下载

数据结构上机报告

数据结构上机报告

课程实验报告课程名称:数据结构专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1 课程实验概述 (1)2 实验一基于顺序结构的线性表实现2.1 问题描述 (2)2.2 系统设计 (2)2.3 系统实现 (3)2.4 效率分析 (12)3 实验二基于链式结构的线性表实现3.1 问题描述 (14)3.2 系统设计 (14)3.3 系统实现 (15)3.4 效率分析 (26)4 实验三基于二叉链表的二叉树实现4.1 问题描述 (27)4.2 系统设计 (27)4.3 系统实现 (29)4.4 效率分析 (45)5 实验总结与评价 (47)附录附录1 顺序线性表 (48)附录2 链式线性表 (61)附录3 二叉树 (75)1 课程实验概述线性表是最常用且最简单的一种数据结构。

简言之,一个线性表是n个数据元素的有限序列。

至于每个数据元素的具体含义,在不同的情况下各不相同。

线性表的长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可进行插入和删除等操作。

树型结构是一类重要的非线性数据结构。

其中以树和二叉树最为重要,直观看来,树是以分支关系定义的层次结构。

本实验将通过C语言来实现线性表顺序储存结构、线性表链式储存结构以及二叉树链表的基本的、常见的运算。

2 实验一基于顺序结构的线性表实现2.1 问题描述基于顺序储存结构,实现线性表的构造、销毁、置空、插入、删除等运算。

2.2 系统设计(1)IntiaList(SqList * L)操作结果:构造一个空的线性表L(2)DestroyList(SqList * L)初始条件:线性表L己存在操作结果:销毁线性表L(3)ClearList(SqList *L)初始条件:线性表L己存在操作结果:将L重置为空表(4)ListEmpty(SqList L)初始条件:线性表已存在操作结果:若L为空表,则返回TRUE,否则返回FALSE(5)ListLength(SqList L)初始条件:线性表L已经存在操作结果:返回L中数据元素个数(6)GetElem(SqList L,int i,Elemtype * e)初始条件:线性表L己经存在,1<=i<=Listlength(L)操作结果:用e返回L中第(i-1)个元素的值(7)LocatElem(SqList L,Elemtype e,status (* compare)(Elemtype ,Elemtype ))初始条件:线性表L已存在,compare()是元素判定函数操作结果:返回L中第1个与e满足关系的数据元素的次序。

数据结构上机指导书_实验一

数据结构上机指导书_实验一

数据结构与算法实验指导书中国石油大学(北京)计算机科学与技术系前言《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。

它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。

这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。

通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。

学习这门课程,习题和实验是两个关键环节。

学生理解算法,上机实验是最佳的途径之一。

因此,实验环节的好坏是学生能否学好《数据结构》的关键。

为了更好地配合学生实验,特编写实验指导书。

一、实验目的更好的理解算法的思想、培养编程能力。

二、实验要求1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。

2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。

3、实验结束后总结实验内容、书写实验报告。

4、遵守实验室规章制度、不缺席、按时上、下机。

5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。

6、实验报告有一次不合格,扣5分,两次以上不合格者,平时成绩以零分记。

三、实验环境 VC++6.0或者VC2010四、说明1、本实验的所有算法中元素类型可以根据实际需要选择。

2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成70%,否则实验不合格)。

3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。

五、实验报告的书写要求1.明确实验的目的及要求;2.记录实验的输入数据和输出结果;3.说明实验中出现的问题和解决过程;4.写出实验的体会和实验过程中没能解决的问题;六、参考书目《数据结构》(C++语言描述)王红梅等清华大学出版社《DATA STRUCTURE WITH C++》 William Ford,William Topp清华大学出版社(影印版)实验平台控制台程序1、启动Microsoft VC6.0集成开发环境如图所示:2、单击“文件”菜单,选择“新建”项。

数据结构《数据结构》上机实验

数据结构《数据结构》上机实验
数据结构
上机实验
主讲教师:袁凌
数据结构
实验目的
1.加深对数据结构和算法的理解,进一步 提高学生编程能力; 2.培养和提高学生分析问题与解决问题的 综合能力; 3.整理资料,撰写规范的实验报告。
华中科技大学计算机学院
2
数据结构
实验要求
1. 独立完成,完全雷同者记0分;
2. 撰写实验报告,每个实验报告如下内容: 一、问题描述 二、算法和数据结构设计 三、C语言程序实现 四、程序测试 五、复杂度分析
华中科技大学计算机学院 8
实验题目
第二次上机试验
实验(三) 基于二叉链表,实现二叉树的下列运算。 ① 二叉树生成; ② 前序、中序和后序遍历; ③ 计算叶子数目; ④ 按层次遍历; ⑤ 求二叉树高度; 提示: ⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定 ⑶ ②、③和⑤运算分别采用递归和非递归算法实现
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
6
数据结构
实验题目
第一次上机试验
实验(二) 基于链式存储结构,实现线性表的基本的、常见 的运算。
提示:
⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
7Байду номын сангаас
数据结构
3. 《实验报告》和《源程序》,以班为单位提交光盘。
华中科技大学计算机学院
3
数据结构
报告格式
华中科技大学计算机学院
4
数据结构
报告格式
华中科技大学计算机学院
5
数据结构
实验题目

数据结构实验一 约瑟夫环问题实验报告电子版

数据结构实验一  约瑟夫环问题实验报告电子版
pri = head ;
for(i = 1;i<length;i++){
tmp = (Node *)malloc(sizeof(Node));
tmp->number = num[i];
tmp->pass = pas[i];
pri->next = tmp;
pri = tmp;
pri->next = head;
for(i=0;i<time;i++){ //找到要删除的结点
tmp = tmp->next;
}
printf("%d ",tmp->number);
timeห้องสมุดไป่ตู้= tmp->pass - 1;
deleteFromList(&head,tmp);//删除结点
tmp = tmp->next;//从下一个结点又开始计算
initList(head);
createFromTail(head,num,pas,sizeof(num)/sizeof(num[0]));
p = head;
printf("\n约瑟夫计数前,每个数和他的密码:\n");
for(i = 0;i<sizeof(num)/sizeof(num[0]);i++){
}
}
// 从链表中删除
void deleteFromList(List *head,Node *tmp)
{
Node *tmp1;
Node *tmp2;
tmp1 = *head;
tmp2 = tmp1;
//如果链表剩了一个元素

数据结构上机实验

数据结构上机实验

数据结构上机实验本课程实验中已知的预定义常量和类型如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;实验一顺序表(一)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。

二、 实验内容已知:线性表的动态分配顺序存储结构为#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int *elem;int length;int listsize;}SqList;在主程序中调用如下函数实现构造线性表,在线性表中插入数值,最后输出线性表。

1. 编写函数,Status InitList(SqList *L) 实现构造一个空的线性表,若构造成功则返回OK,否则返回ERROR。

2. 编写函数,Status ListInsert(SqList *L , int i , int e) 实现在线性表L中第i个位置之前插入新的数据元素e,L的长度加1。

若插入成功返回OK,否则返回ERROR。

(提示:i的合法值为:i>=1&&i<=L—>length+1)3. 编写函数,void ListPrint(SqList *L)实现将线性表中的元素依次输出到屏幕上。

4.编写函数,int Menu(),输出菜单项请选择你要进行的操作(请输入1-4中的任一个数字):输入1:InitList2:ListInsert3:ListPrint4:Exit实验二顺序表(二)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。

二、 实验内容在实验一的基础上,继续完成如下实验内容。

1.编写函数,Status ListDelete(Splist *L ,int i ,int *e),实现删除L的第i个数据元素,并用e返回其值,L的长度减1。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 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、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重复的元素),并求这样的两个集合的并、交和源程序://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

实验1(线性表):任意输入一串字符,将该字符串看成一个线性表,以链式存储结构(或者静态链表)实现这个线性表,并进行线性表的查找、插入、删除和就地逆置等操作1.需求分析意输入一串字符,将该字符串看成一个线性表,以链式存储结构(或者静态链表)实现这个线性表,并进行线性表的查找、插入、删除和就地逆置等操作2.详细设计1.主函数{输入字符串;生成线性表;调用函数,实现操作;}2.调用函数{ 查找函数;插入函数;删除函数;逆置函数;}3.调用关系图为:void main(){ list_search(); list_insert;list_delete; list_turn()}ADT List{数据对象:D={a i|a i=ElemSet,i=1,2,……,n,n≧0}数据关系:R1={<a i-1,a i>| a i-1,a i€D, i=1,2,……,n }基本操作:list_search (&l); //查找函数list_insert (&l); //插入函数list_delete (&l) ; //删除函数list_turn (&l) //就地逆置}3.用户使用说明先输入一个字符串,回车键结束,程序会自动生成一个线性链表;接着会出现操作选择界面,输入所要进行的操作:输入1进行查找操作,输入要查找元素就会输出元素位置;程序如下:#include<stdio.h>#include<stdlib.h>#include<string.h>struct node{ char data;struct node* prior;struct node* next;};void list_search(struct node* head);void list_insert(struct node* head,int lenth);void list_delete(struct node* head,int lenth);void list_turn(struct node *head);//主函数void main(){struct node head;head.data=0;head.next=NULL;head.prior=NULL;struct node* p=&head;struct node* q=&head;int i=0;char c;printf("请输入字符串:\t");scanf("%c",&c);while(c!='\n'){i++;q=(struct node*)malloc(sizeof(struct node));q->prior=p;q->next=NULL;q->data=c;p->next=q;p=q;scanf("%c",&c);}fflush(stdin);int number=i;p=&head;printf("生成的线性表为:\n");while(p->next){p=p->next;printf("%c",p->data);}int flag=1;char choose;char judge[4];while(flag){printf("\n");printf("请输入你想进行的操作:\n");printf("1---查找\t");printf("2---插入\t");printf("3---删除\t");printf("4---就地逆置\n");int flag1=1;while(flag1){scanf("%c",&choose);fflush(stdin);if(choose=='1'){list_search(&head);flag1=0;} if(choose=='2'){list_insert(&head,number);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}if(choose=='3'){list_delete(&head,number);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}if(choose=='4'){list_turn(&head);flag1=0;p=&head;printf("线性表现在变为:\n");while(p->next){p=p->next;printf("%c",p->data);}}}int i=number;fflush(stdin);printf("\n继续请输入yes,退出请输入no\n");gets(judge);if(strcmp(judge,"yes")) flag=0;if(strcmp(judge,"no"));}//whileprintf("谢谢使用~\n");}//main//查找函数void list_search(struct node* head){char temp;printf("请输入你要查找的元素:\n");fflush(stdin);scanf("%c",&temp);struct node* p=head;struct node* q=head;int i=0;int flag=1;while(p->next){p=p->next;i++;if(p->data==temp){printf("所查元素的位置是:\t");printf("%d\n",i);flag=0;printf("\n");}}if(flag) printf("所查元素不在线性表内!\n"); }//list_search//插入函数void list_insert(struct node* head,int number){char temp;int pos;printf("请输入你要插入的元素:\n");fflush(stdin);scanf("%c",&temp);int flag=1;while(flag){printf("请输入所插入元素的位置\n");fflush(stdin);scanf("%d",&pos);if(pos>=number||pos<=0) {printf("输入错误,请重新输入!\n");continue;} else flag=0;}struct node* p=head;struct node* q=head;int i=0;while(i<pos-1){p=p->next;i++;}q=(struct node*)malloc(sizeof(struct node));q->data=temp;p->next->prior=q;q->next=p->next;q->prior=p;p->next=q;}//list_insert//删除函数void list_delete(struct node* head,int number){int temp;int flag=1;while(flag){printf("请输入所要删除元素的位置:\n");fflush(stdin);scanf("%d",&temp);if(temp>=number||temp<=0) {printf("输入错误,请重新输入!\n");continue;} else flag=0;}struct node* p=head;struct node* q=head;while(temp){p=p->next;temp--;}q=p->prior;q->next=p->next;if(p->next)p->next->prior=q;free(p);}//list_delete//逆置函数void list_turn(struct node *head) {struct node* p=head;struct node* q=head;struct node* r=q->next;while(r){p=r;r=r->next;q=p->prior;p->prior=p->next;p->next=q;}p->prior=head;head->next->next=NULL;head->next=p;p=head;}//list_inverse set调试结果:。

数据结构上机实验报告

数据结构上机实验报告

数据结构实验报告课程数据结构 _ 院系专业班级实验地点姓名学号实验时间指导老师数据结构上机实验报告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)

数据结构上机实验指导(1)

数据结构上机实验指导(1)《数据结构》课程上机实验指导书实验一【实验名称】顺序表的基本算法【实验目的】创建一个顺序表,掌握线性表顺序存储的特点。

设计和验证顺序表的查找、插入、删除算法。

【实验要求】(1)从键盘读入一组整数,按输入顺序形成顺序表。

并将创建好的顺序表元素依次打印在屏幕上。

(2)设计一个带选择菜单的主函数,菜单中具备任意选择删除、插入、查找数据元素的功能。

(3)当选择删除功能时,从键盘读入欲删除的元素位置或元素值,按指定方式删除;当选择插入功能时,从键盘读入新元素值和被插入位置,在指定位置插入;当选择查找功能时,从键盘读入欲查找的元素值,返回其位置序号。

(4)每种操作结束后,都能在屏幕上打印出此时顺序表元素的遍历结果。

【实验步骤】1、实验前先写好算法。

2、上机编写程序。

3、编译。

4、调试。

例程:书上参考算法2-1,2-4,2-5,2-6,2-8!带菜单的主函数参考书上2.5综合实例!注意:顺序表的结构体!typedef struct{datatype items[listsize];int length;}SpList;实验二【实验名称】单链表的基本算法【实验目的】创建一个单链表,掌握线性表链式存储的特点。

设计和验证链表的查找、插入、删除、求表长的算法。

【实验要求】(1)从键盘读入一组整数,按输入顺序形成单链表。

并将创建好的单链表元素依次打印在屏幕上。

(注意:选择头插法或者尾插法!)(2)设计一个带选择功能菜单的主函数,菜单中至少具备任意选择删除、插入、查找数据元素,和求单链表表长等几项功能。

(3)当选择删除功能时,从键盘读入欲删除的元素位置,按指定位置删除;当选择插入功能时,从键盘读入新元素值和被插入位置,在指定位置插入;当选择查找功能时,从键盘读入欲查找的元素值,返回其位置序号;当选择求表长功能时,返回该单链表表长的数值。

(4)每种操作结束后,都能在屏幕上打印出此时单链表元素的遍历结果。

数据结构上机实验任务书一和二

数据结构上机实验任务书一和二

目录实验1 顺序表的应用 (2)实验2 链表的应用 (5)实验3 栈的应用 (6)实验4 队列的应用 (7)实验5 树的应用 (9)实验6 图的应用 (10)实验7 图的应用 (11)实验8 查找与排序 (12)0 实验要求一、实验步骤⒈问题分析充分地分析和理解问题本身,弄清要求做什么,包括功能要求、性能要求、设计要求和约束以及基本数据特性,数据间的联系等。

⒉数据结构设计针对要求解决的问题,考虑各种可能的数据结构,并且力求从中找出最佳方案(必须连同算法一起考虑),确定主要的数据结构及全局变量。

对引入的每种数据结构和全局变量要详细说明其功能、初值和操作特点。

⒊算法设计算法设计分概要设计和详细设计,概要设计着重解决程序的模块设计问题,这包括考虑如何把被开发的问题程序自顶向下分解成若干顺序模块,并决定模块的接口,即模块间的相互关系以及模块之间的信息交换问题.详细设计则要决定每个模块内部的具体算法,包括输入、处理和输出,采用类C语言描述。

⒋测试用例设计准备典型测试数据和测试方案,测试数据要有代表性、敏感性,测试方案包括模块测试和模块集成测试。

⒌上机调试对程序进行编译,纠正程序中可能出现的语法错误,测试前,先运行一遍程序看看究竟将会发生什么,如果错误较多,则根据事先设计的测试方案并结合现场情况进行错误跟踪,包括打印执行路径或输出中间变量值等手段。

二、实验报告每次实验结束后,均应撰写实验报告。

实验报告应包括如下内容:1、问题描述:简述题目要解决的问题是什么。

2、设计:概要设计采用抽象数据类型描述,详细设计包括存储结构的定义、主要操作算法设计等。

用类C语言或用框图描述。

3、调试报告:调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、运行结果。

可以贴相应的运行结果截图。

5、算法分析与改进:算法的时间复杂度和空间复杂度分析;算法改进的设想。

6、经验和体会所有实验做完后,上交上机实验源程序和相应的运行结果截图。

数据结构上机实验报告

数据结构上机实验报告

实验名称:数据结构实验实验时间: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. 实现概要设计中的数据结构 ADT :无 2. 核心函数伪码 : Find(string S, string P, int linenumb)
{ 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)把自己使用的单链表结构明确的表达出来.3)要求都是带头结点的单链表.分组要求:可单独完成,也可两人一组。

实验目的:1)熟悉C/C++基本编程,培养动手能力.2)通过实验,加深对链表的理解.评分标准:1) 第一题必做;2)其它题为选做,不设上限。

3)上机结束后,由助教检查结果并适当提问,根据情况给出成绩。

上机题目:一)建立单链表+求长度+显示(3分)(1) 由键盘逐个输入正整数,建立相应的链表,输入-1时,链表结束;(2) 显示链表中的元素 (要求在显示器可见);(3) 求链表的长度;(4)求链表的第i个元素;(i为参数)二)查找+插入+删除+显示(1分)在题目(一)的单链表中:(1)在链表中第i个位置插入新的数据元素,显示链表;(2)删除链表的第i个元素,输出该元素,显示链表;三)就地置逆+求最大最小值(1分)在题目(一)的单链表中:(1)将链表就地逆置,显示链表;(2)求链表中的最大,最小值,显示结果;#include<stdio.h>#include<malloc.h>typedef struct Lnode{int data;struct Lnode *next;}LNode, *LinkList;LinkList CreatList_L(void){LinkList head;LinkList p1,p2;head=p1=p2=(LinkList)malloc(sizeof(LNode));scanf("&d",&p1->data);head->next=p1;while(p1->data!=-1){p2->next=p1;p2=p1;p1=(LinkList)malloc(sizeof(LNode));scanf("%d",&p1->data);}p2->next=NULL;return head;}void ShowList(LinkList L){printf("\nHere is the list:\n");LinkList p;p=L->next;while(p!=NULL){printf("%d\n",p->data);p=p->next;}printf("\n");}int LenList(LinkList L){LinkList p;p=L->next;int n=0;while(p!=NULL){n++;p=p->next;}return n;}LinkList InsertList(LinkList L,LinkList InsertNode,int i){ LinkList p0,p1,p2,p3;int n=1;p3=p1=L;p0=InsertNode;while(n<=i){p2=p1;p1=p1->next;n++;}p0->next=p1;p2->next=p0;return p3;}LinkList DeleteList(LinkList L,int i){LinkList p1,p2,p3;int n=1;p3=p1=L;while(n<=i){p2=p1;p1=p1->next;n++;}p1=p1->next;p2->next=p1;return p3;}int GetElem(LinkList L,int i){LinkList p;int n=1,m;p=L;while(n<=i){p=p->next;n++;}m=p->data;return m;}void InverseList(LinkList L){LinkList p,q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;p=q;}}void MostList(LinkList L){LinkList p;int i,j;p=L->next;i=j=p->data;while(p){if(i<p->data)i=p->data;if(j>p->data)j=p->data;p=p->next;}printf("The maximum is:%d\n",i);printf("The minimum is:%d\n",j); }void main(){int n,i,j,k;LinkList L,InsertNode;printf("Input the list:");L=CreatList_L();ShowList(L);n=LenList(L);printf("\nThe length of List is %d\n",n);InsertNode=(LinkList)malloc(sizeof(LNode));printf("Input the inertnode(data and location):");scanf("%d,%d",&InsertNode->data,&i);L=InsertList(L,InsertNode,i);ShowList(L);printf("Input the deletenode(location):");scanf("%d",&j);k=GetElem(L,j);printf("The delete elem is %d\n",k);DeleteList(L,j);ShowList(L);printf("The inverselist is:");InverseList(L);ShowList(L);MostList(L);}四) 链表的合并(1分)(1)创建两个链表LA,LB(各链表按升序排列),分别显示两链表;(2)将两个链表合并成一个新的有序表(升序排列),显示链表. #include<stdio.h>#include<malloc.h>typedef struct Lnode{int data;struct Lnode *next;}LNode, *LinkList;LinkList CreatList_L(void){LinkList head;LinkList p1,p2;head=p1=p2=(LinkList)malloc(sizeof(LNode));scanf("&d",&p1->data);head->next=p1;while(p1->data!=-1){p2->next=p1;p2=p1;p1=(LinkList)malloc(sizeof(LNode));scanf("%d",&p1->data);}p2->next=NULL;return head;}void ShowList(LinkList L){printf("\nHere is the list:\n");LinkList p;p=L->next;while(p!=NULL){printf("%d\n",p->data);p=p->next;}printf("\n");}int LenList(LinkList L){LinkList p;p=L->next;int n=0;while(p!=NULL){n++;p=p->next;}return n;}LinkList SortList(LinkList L){LinkList first,last,head,min,p,q;first=NULL;head=L->next;while(head){for(p=head,min=head;p->next!=NULL;p=p->next){if (p->next->data < min->data){q=p;min=p->next;}}if (first == NULL){first=min;last=min;}else{last->next=min;last=min;}if (min == head)head = head->next;else q->next=min->next;last->next=NULL;}head=first;return head;}LinkList MergeList(LinkList La,LinkList Lb){ LinkList L3,p1,p2,p3;p1=La->next;p2=Lb->next;L3=p3=La;while(p1&&p2){if(p1->data<=p2->data){p3->next=p1;p3=p1;p1=p1->next;}else{p3->next=p2;p3=p2;p2=p2->next;}}if(p1)p3->next=p1;else p3->next=p2;return L3;}void main(){LinkList L1,L2,L3;printf("Input List1:");L1=CreatList_L();printf("Input List2:");L2=CreatList_L();printf("L1\n");ShowList(L1);printf("L2\n");ShowList(L2);L1->next=SortList(L1);L2->next=SortList(L2);printf("The new L1\n");ShowList(L1);printf("The new L2\n");ShowList(L2);L3=MergeList(L1,L2);printf("The new merge list\n");ShowList(L3);}五)单循环链表(2分)(1)建两个带头结点的循环单链表LA,LB单循环链表,(2)将两个循环单链表合并为一个循环单链表,其头指针为LA。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告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个

数据结构上机报告1个

《数据结构》实验报告一题目:编写程序删除表中的重复结点班级:浦计0806学号:P1401080634 姓名:袁一博日期:程序名:一、上机实验的问题和要求:已知单链表H,编写程序删除表中的重复结点。

二、程序设计的基本思想,原理和算法描述:算法思路:用指针p指向第一个数据结点,从它的后继结点开始到表的尾结点,查找与之相同的结点并删除之;p再指向下一个结点,依此类推,直至p指向尾结点时,算法结束。

三、源程序及注释:void purLinkList(LinkList h)//删除重复结点{LinkList p, q, r;p=h->next;if(p==NULL) return;while(p->next){q=p;while(q->next)//从p的后继结点开始查找{if(q->next->data==p->data){r=q->next;//找到重复结点,用r指向,删除rq->next=r->next;free(r);}elseq=q->next;}p=p->next;}}void main(){LinkList h=createLinkList3();printf("从键盘输入的单链表h为:");printLinkList(h);purLinkList(h);printf("删除重复结点后的单链表h为:");printLinkList(h);}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:六、对算法的程序的讨论、分析,改进设想,其它经验教训:七、对实验方式、组织、设备、题目的意见和建议:。

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

青岛理工大学数据结构课程实验报告课程名称数据结构班级软件131 实验日期 4.15姓名学号实验成绩实验名称线性表的顺序表示与链式表示实验目的及要求实验目的1.加深理解线性表的顺序表示与链式表示的意义和区别,掌握用它们表示时各基本操作的设计与实现。

2.学会定义线性表的顺序存储类型和链式存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。

3.掌握线性表的基本操作(初始化、建立、插入、删除、遍历等)。

4.掌握对多函数程序的输入、编辑、调试和运行过程。

5.进一步熟练C语言的使用,特别是指针和链表的使用。

能在实际应用背景下恰当选择顺序存储和链式存储。

实验要求1.预习C语言中的结构的定义和基本操作方法2.对线性表的每个基本操作用单独的函数实现3.编写完整程序完成下面的实验内容并上机运行4.整理并上交实验报告实验环境硬件平台:普通的PC机软件平台:Windows 2003操作系统编程环境:VisualC++实验内容1.分别建立包含10个数据元素的顺序线性表和链式线性表;2.从键盘输入一个数据元素和插入位置k,将元素插入到线性表中第k(包含0号位置)个位置;3.从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;4.能完成查找功能;5.给出程序及插入、删除前和插入、删除后线性表结果。

//创建顺式线性表struct number *creat(void){struct number *head,*p1;p1=head=(struct number*)malloc( SIZE * sizeof(struct number));scanf("%ld",&p1->num);for(;p1->num!=0;L++){算法描述及实验步骤p1++;scanf("%ld",&p1->num);}return(head);}//输出顺式线性表中的元素void print(struct number*head){struct number *p;int s=L;p=head;if(p!=0){printf("\n您输入的数据为:\n");for(;s>0;p++,s--)printf("%ld ",p->num);}}//查找顺式线性表中的元素void search(struct number *head){struct number *p;long num1;int n=0,s=0;p=head;printf("\n请输入您要查找的数据:\n");scanf("%ld",& num1);if(head!=0)for(;p->num!=0;p++){n++;if(p->num==num1){s=1;break;}}if(s==0)printf("\n没有您所要查找的数据\n");elseprintf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n); }//插入顺式线性表的元素struct number *insert(struct number*head){struct number *p1,*p2;int n=1;long num1;p1=p2=head;p2=p2+L-1;printf("\n请输入您要插入的数据:\n");scanf("%ld",&num1);if(num1<p2->num){for(p1=head;p1->num<num1;p1++)n++;for(;p2>=p1;p2--)(p2+1)->num=p2->num;}(p2+1)->num=num1;L++;return(head);}//删除顺式线性表的元素struct number *del(struct number*head){struct number *p1,*p2;long num1;int n=1;p1=p2=head;printf("\n请输入要删除的数据:\n");scanf("%ld",&num1);p2=p2+L-1;for(;p1->num!=num1 && n<=L;p1++) n=n+1;if(n>L){printf("\n没有您要删除的数据\n");return(0);}else{for(;p1<=p2;p1++)p1->num=(p1+1)->num;L--;return(head);}}struct list *creat_n()//创建有n个元素的链表{struct list *q,*p,*head=NULL;printf("\n输入你所要创建的结点数: ");scanf("%d",&length);head=p=(list*)malloc(sizeof(list)); //创建一个新结点并用头指针指向它printf("输入该结点的值: ");scanf("%d", &p->data);p->next=NULL;for(int i=length-1;i>=1;i--){q=p;p=(list*)malloc(sizeof(list)); //创建新结点printf("输入该结点的值: ");scanf("%d", &p->data);q->next=p;}printf("输入完毕\n\n");p->next=NULL;return head;}struct list * output()//输出表长与结点值函数{struct list *p;p=head;printf("\n当前链表中存有的元素:\n");while(p!=NULL){printf("%d\n",p->data);p=p->next;}printf("当前的表长是: %d\n\n",length);//输出当前表长return head;}void insert()//插入结点函数{struct list *k,*p,*q;int x;printf("请输入你要在哪个结点值之前插入新结点: ");scanf("%d",&x);k=(list*)malloc(sizeof(list));//创建新结点printf("请输入新结点的值: ");scanf("%d",&k->data);k->next=NULL;if(head==NULL)//若链表为空,则直接入链表{head=k;length=length+1;printf("插入成功\n\n");}else if(head->data==x)//在第一个结点前插入新结点{k->next=head;head=k;printf("插入成功\n\n");length=length+1;}else{q=head;p=head->next;while((p != NULL) && (p->data != x))//找出值为X的结点的位置{q = p;p = p->next;}if (p == NULL){q->next=k;//在链表末插入新结点printf("插入成功\n");length=length+1;}else if(p->data == x)//在要求的X结点前插入新结点{k->next=p;q->next=k;printf("插入成功\n\n");length=length+1;}}output();}int delet()//删除结点函数{struct list *q,*p;int x,y;printf("请输入你所要删除的结点值: ");scanf("%d",&x);if(head==NULL)//表空{printf("表空\n");return 0 ;}else if(x==head->data)//第一个结点为删除的结点{q=head;head=head->next;y=q->data;free(q);printf("删除成功\n\n");length=length-1;output();return(y);}else{q=head;p=head->next;while((p != NULL) && (p->data != x))//找出值为X的结点{q=p;p=p->next;}if(p==NULL)printf("没有删除对象\n");}if(x==p->data)//删除值为X的结点{q->next=p->next;y=p->data;free(p);printf("删除成功\n\n");length=length-1;output();return (y);}else{printf("表中没有指定的结点\n");output();return 0;}}return 0;}void find(){struct list *p;int k,x,i=1;char y,n;LOOP:p=head;printf("请输入你要查找的结点值: ");scanf("%d",&x);while(p->data!=x){p=p->next;i++;}printf("你所查找的结点是表中第%d 个结点!\n\n",i);printf("是否要继续查找,请输入y/n\n\n");k=getch();if(k=='y'){i=1;goto LOOP;}elsereturn;}调试过程及实验结果程序运行过程中输入了顺序表,结果输出结果符合情况,程序成功。

相关文档
最新文档