数据结构实验报告(合工大)
数据结构实验报告
实验一:栈和队列
实验目的:
掌握栈和队列特点、逻辑结构和存储结构
熟悉对栈和队列的一些基本操作和具体的函数定义。
利用栈和队列的基本操作完成一定功能的程序。
实验任务
1.给出顺序栈的类定义和函数实现,利用栈的基本操作完成十进制数N与其它d进制数的转换。(如N=1357,d=8)
实验原理:将十进制数N转换为八进制时,采用的是“除取余数法”,即每次用8除N所得的余数作为八进制数的当前个位,将相除所得的商的整数部分作为新的N值重复上述计算,直到N为0为止。此时,将前面所得到的各余数反过来连接便得到最后的转换结果。
程序清单
#include
#include
using namespace std;
typedef int DATA_TYPE;
const int MAXLEN=100;
enum error_code
{
success,overflow,underflow
};
class stack
{
public:
stack();
bool empty()const;
error_code get_top(DATA_TYPE &x)const;
error_code push(const DA TA_TYPE x);
error_code pop();
bool full()const;
private:
DA TA_TYPE data[MAXLEN];
int count;
};
stack::stack()
{
count=0;
}
bool stack::empty()const
{
return count==0;
}
error_code stack::get_top(DATA_TYPE &x)const
if(empty())
return underflow;
else
{
x=data[count-1];
return success;
}
}
error_code stack::push(const DA TA_TYPE x)
{
if(full())
return overflow;
else
{
data[count]=x;
count++;
}
}
error_code stack::pop()
{
if(empty())
return underflow;
else
{
count--;
return success;
}
}
bool stack::full()const
{
return count==MAXLEN;
}
void main()
{
stack S;
int N,d;
cout<<"请输入一个十进制数N和所需转换的进制d"<
if(N==0)
{
cout<<"输出转换结果:"< } while(N) S.push(N%d); N=N/d; } cout<<"输出转换结果:"< while(!S.empty()) { S.get_top(N); cout< S.pop(); } cout< } while(!S.empty()) { S.get_top(x); cout< S.pop(); } } 测试数据:N=1348 d=8 运行结果: 2.给出顺序队列的类定义和函数实现,并利用队列计算并打印杨辉三角的前n行的内容。(n=8) 实验原理:杨辉三角的规律是每行的第一和最后一个数是1,从第三行开始的其余的数是上一行对应位置的左右两个数之和。因此,可用上一行的数来求出对应位置的下一行内容。为此,需要用队列来保存上一行的内容。每当由上一行的两个数求出下一行的一个数时,其中 的前一个便需要删除,而新求出的数就要入队。程序清单: #include #include using namespace std; typedef int DATA_TYPE; const int MAXLEN=100; enum error_code { success,underflow,overflow }; class queue { public: queue(); bool empty()const; error_code get_front(DATA_TYPE &x)const; error_code append(const DA TA_TYPE x); error_code serve(); bool full()const; private: int front,rear; DA TA_TYPE data[MAXLEN]; }; queue::queue() { rear=0; front=0; } bool queue::empty()const { return (front%MAXLEN==rear%MAXLEN); } error_code queue::get_front(DA TA_TYPE &x)const { if(empty()) return underflow; else { x=data[front%MAXLEN]; return success; } } error_code queue::append(const DA TA_TYPE x) { if(full()) return overflow; else { data[rear%MAXLEN]=x; rear++; } } error_code queue::serve() { if(empty()) return underflow; else { front++; return success; } } bool queue::full()const { return((rear+1)%MAXLEN==front); } void main() { queue Q; int num1,num2; int i=0; cout<<1< Q.append(1); num1=0; num2=1; for(i=0;i<=7;i++) { int j=0; int k=0; num1=0; for(j=0;j<=i;j++) { Q.get_front(num2); Q.serve(); cout< Q.append(num1+num2); num1=num2; } cout<<1< Q.append(1); } } 运行结果: 3.给出链栈的类定义和函数实现,并设计程序完成如下功能:读入一个有限大小的整数n,并读入n个数,然后按照与输入次序相反的次序输出各元素的值。 实验原理:依次将栈中的元素出栈,因为栈的一个特点就是先进后出,。这样,当将原栈为空时,输出与输入次序相反,从而实现了本题的要求。 程序清单: #include #include using namespace std; typedef int DATA_TYPE; typedef struct LNode { DA TA_TYPE data; LNode *next; }LNode; enum error_code { range_error,success,underflow class linkstack { public: linkstack(); ~linkstack(); bool empty()const; error_code push(const DA TA_TYPE x); error_code get_top(DATA_TYPE &x)const; error_code pop(); private: LNode *top; int count; DA TA_TYPE data; }; linkstack::linkstack() { top=NULL; count=0; } bool linkstack::empty()const { return (count==0); } error_code linkstack::push(const DATA_TYPE x) { LNode *s=new LNode; s->data=x; s->next=top; top=s; count++; return success; } error_code linkstack::get_top(DA TA_TYPE &x)const { if(empty()) return underflow; else { x=top->data; return success; } } error_code linkstack::pop() if(empty()) return underflow; else { LNode *u=new LNode; u=top; top=top->next; delete u; count--; return success; } } linkstack::~linkstack() { while(!empty()) { pop(); } } void main() { linkstack L; int n; cout<<"请任意输入一个整数n:"< for(int i=1;i<=n;i++) { L.push(i); } while(!L.empty()) { L.get_top(i); cout< L.pop(); } } 测试数据:n=9 i=1 运行结果: 实验二:单链表 实验目的: 理解线性表的链式存储结构。 熟练掌握动态链表结构及有关算法的设计。 根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。 实验任务: 在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。 1.实验数据:链表元素为(10,20,30,40,50,60,70,80,90,100),x分别为25,85,110和8。 实验原理:给出了要插入的条件,但没有给定插入位置。因此,需要搜索满足这一条件的插入位置的前驱结点而不是序号。 程序清单: #include #include using namespace std; typedef struct snode { int data; struct snode *next; }node; enum error_code{arrange_error,success}; class list { public: list(); void create2(); int length() const; error_code get_element(const int i,int &x) const; error_code insert(const int &x); error_code delete_element(const int i); node *locate(const int x) const; node *get_head(){return head;} void print(); private: int count; node *head; }; list::list() { head=new node; head->next=NULL; count=0; } void list::create2() { int x; node *p=head; node *s; cout<<"输入一个值:"; cin>>x; while(x!=-1) { s=new node; s->data=x; s->next=NULL; p->next=s; p=s; cout<<"输入一个值:"; cin>>x; } } int list::length() const { return count; } error_code list::get_element(const int i,int &x) const { int j=1; node *p=head->next; while(p!=NULL&&j!=i) { p=p->next; j++; } if(p==NULL) return arrange_error; x=p->data; return success; node *list::locate(const int x) const { node *p=head->next; while(p!=NULL) { if(p->data==x) return p; p=p->next; } return NULL; } error_code list::insert(const int &x) { node *s; node *q=head; node *p=head->next; while(p!=NULL&&p->data { q=p; p=p->next; } if(p==NULL) { s=new node; s->data=x; s->next=NULL; q->next=s; count++; } else{ s=new node; s->data=x; s->next=q->next; q->next=s; count++; } return success; } error_code list::delete_element(const int i) { node *u; node *p=head; int j=0; while(j!=i-1&&p!=NULL) { p=p->next; j++; } if(i<1||i>count) return arrange_error; u=p->next; p->next=u->next; delete u; count--; return success; } void list::print() node *p=head->next; while(p!=NULL) { cout< p=p->next; } cout< } void main() { list l; int x; cout<<"创建一个链表(输入‘-1’结束):"< l.create2(); cout<<"输入要插入的数(输入‘-1’结束):"< cout<<"输入一个数:"; cin>>x; while(x!=-1) { l.insert(x); cout<<"输入一个数:"; cin>>x; } l.print(); } 测试数据:链表元素为(10,20,30,40,50,60,70,80,90,100),x分别为25,85,110和8。运行结果: 2.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。 实验原理:依据题目的要求,需要再创建两个新链表来存储分离后的奇偶项,而奇偶项可以根据数字来控制,把他们取出来并重新连起来。 程序清单: #include #include using namespace std; typedef struct snode { int data; struct snode *next; }node; enum error_code{arrange_error,success}; class list { public: list(); void create2(); int length() const; error_code get_element(const int i,int &x) const; error_code insert(const int &x); error_code delete_element(const int i); node *locate(const int x) const; node *get_head(){return head;} divide(list &B,list &C); void print(); private: int count; node *head; }; list::list() { head=new node; head->next=NULL; count=0; } void list::create2() { int x; node *p=head; node *s; cout<<"输入一个值:"; cin>>x; while(x!=-1) { s=new node; s->data=x; s->next=NULL; p->next=s; p=s; cout<<"输入一个值:"; cin>>x; } } int list::length() const { return count; } error_code list::get_element(const int i,int &x) const { int j=1; node *p=head->next; while(p!=NULL&&j!=i) { p=p->next; j++; } if(p==NULL) return arrange_error; x=p->data; return success; } node *list::locate(const int x) const { node *p=head->next; while(p!=NULL) { if(p->data==x) return p; p=p->next; } return NULL; } void list::divide(list &B,list &C) { node *u; node *pa=head->next; node *pb=B.get_head(); node *pc=C.get_head(); for(int i=0;pa!=NULL;i++,pa=pa->next) { u=new node; u->data=pa->data; if(i%2==0) { pb->next=u; pb=pb->next; } else { pc->next=u; pc=pc->next; } pb->next=NULL; pc->next=NULL; } } error_code list::insert(const int &x) { node *s; node *q=head; node *p=head->next; while(p!=NULL&&p->data { q=p; p=p->next; } if(p==NULL) { s=new node; s->data=x; s->next=NULL; q->next=s; count++; } else{ s=new node; s->data=x; s->next=q->next; q->next=s; count++; } return success; } error_code list::delete_element(const int i) { node *u; node *p=head; int j=0; while(j!=i-1&&p!=NULL) { p=p->next; j++; } if(i<1||i>count) return arrange_error; u=p->next; p->next=u->next; delete u; count--; return success; } void list::print() { node *p=head->next; while(p!=NULL) { cout< p=p->next; } cout< } void main() { list A,B,C; int x,y,z; A.create_R(); A.divide(B,C); cout<<"原表:"; A.output(); cout<<"奇数表:"; B.output(); cout<<"偶数表:"; C.output(); } 测试数据:第一组数据:链表元素为(1,2,3,4,5,6,7,8,9,10,20,30,40,50,60) 第二组数据:链表元素为(10,20,30,40,50,60,70,80,90,100)运行结果: 3.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。 实验原理:设置两个指针怕,pa,pb分别依次指示A,B表中的元素,其初始值分别为A.head->next和B.head->next。在pa,pb均非空时,根据其值的大小关系可能有如下三种情况。 (1).pa->data==pb->data:搜索到公共元素,应在C表表尾插入一个结点,其值为pa->data,然后继续A表中下一个元素的搜索,即pa=pa->next,同时pb也往后移。 (2). pa->data>pb->data:表明A表中这一元素可能在B表当前元素的后面,因此要往B 表的后面搜索,故而执行pb=pb->next,然后继续搜索。 (3). pa->data 反复执行上述比较,直到pa,pb至少有一个为空为止。此时,剩余的非空部分没有所需要的公共元素,因而搜索结束。 程序清单: #include #include using namespace std; typedef struct snode { int data; struct snode *next; }node; enum error_code{arrange_error,success}; class list { public: list(); void create2(); int length() const; error_code get_element(const int i,int &x) const; error_code insert(const int &x); error_code delete_element(const int i); node *locate(const int x) const; node *get_head(){return head;} void list::gongyou(list &L1,list &L2) void print(); private: int count; node *head; }; list::list() { head=new node; head->next=NULL; count=0; } void list::create2() { int x; node *p=head; node *s; cout<<"输入一个值:"; cin>>x; while(x!=-1) { s=new node; s->data=x; s->next=NULL; p->next=s; p=s; cout<<"输入一个值:"; cin>>x; } } int list::length() const { return count; } error_code list::get_element(const int i,int &x) const { int j=1; node *p=head->next; while(p!=NULL&&j!=i) { p=p->next; j++; } if(p==NULL) return arrange_error; x=p->data; return success; } void list::gongyou(list &L1,list &L2) { node *p1=L1.head->next; node *p2=L2.head->next; node *p3=head; node *u; while(p1!=NULL&&p2!=NULL) { if(p1->data==p2->data) { u=new node; u->data=p1->data; p3->next=u; p1=p1->next; p2=p2->next; p3=p3->next; } else{ if(p1->data p1=p1->next; else p2=p2->next; } } p3->next=NULL; } node *list::locate(const int x) const { node *p=head->next; while(p!=NULL) { if(p->data==x) return p; p=p->next; } return NULL; } void list::divide(list &B,list &C) { node *u; node *pa=head->next; node *pb=B.get_head(); node *pc=C.get_head(); for(int i=0;pa!=NULL;i++,pa=pa->next) { u=new node; u->data=pa->data; if(i%2==0) { pb->next=u; pb=pb->next; } else { pc->next=u; pc=pc->next; } pb->next=NULL; pc->next=NULL; } } error_code list::insert(const int &x) { node *s; node *q=head; node *p=head->next; while(p!=NULL&&p->data { q=p; p=p->next; } if(p==NULL) { s=new node; s->data=x; s->next=NULL; q->next=s; count++; } else{ s=new node; s->data=x; s->next=q->next; q->next=s; count++; } return success; } error_code list::delete_element(const int i) { node *u; node *p=head; int j=0; while(j!=i-1&&p!=NULL) { p=p->next; j++; } if(i<1||i>count) return arrange_error; u=p->next; p->next=u->next; delete u; count--; return success; } void list::print() { node *p=head->next; while(p!=NULL) { cout< p=p->next; } cout< } 《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时) 数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"< 数据结构实验报告 姓名:班级: 学号: 日期:2015年9月27日 上机环境:win7系统,mircosoft visual++ 1.实验名称:线性表 2.实验题目 编写一个程序algo2-1.cpp,实现顺序表的各种基本运算(假设顺序表的元素类型为char)并在此基础上设计一个主程序完成如下功能: (1)初始化顺序表L; (2)依次采用尾插入法插入a,b,c,d,e元素; (3)输出顺序表L; (4)输出顺序表L的长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入f元素; (9)输出顺序表L; (10)删除L的第3个元素; (11)输出顺序表L; (12)释放顺序表。 3.实验程序 #include typedef char ElemType; typedef struct { ElemType data[MaxSize]; int length; }SqList; void InitList(SqList *&L) { L= (SqList *)malloc(sizeof(SqList));//分配存放线性表的空间L->length=0;//置空线性表长度为0 } void DestroyList(SqList *L) { free(L); } bool ListEmpty(SqList *L) { return(L->length==0); } int ListLength(SqList *L) { return(L->length); } 数据结构实验报告题目:动态查找表 学院计算机 专业计算机科学与技术年级班别2009级 2 班 学号3109005935 学生姓名黄丽敏 指导教师吴伟民 成绩____________________ 2011年6月 一. 动态查找表: 抽象数据类型动态查找表的定义如下: ADT DynamicSearchTable { 数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字 数据关系R:数据元素同属一个集合。 基本操作P: InitDSTable(&DT); 操作结果:构造一个空的动态查找表DT。 DestroyDSTable(&DT) 初始条件:动态查找表DT存在。 操作结果:销毁动态查找表DT。 SearchDSTable(DT,key); 初始条件:动态查找表DT存在,key为和关键字类型相同的给定值。 操作结果:若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。 InsertDSTable(&DT,e); 初始条件:动态查找表DT存在,e为待插入的数据元素。 操作结果:若DT中不存在其关键字等于e.key的数据元素,则插入e到DT。 DeleteDSTable(&DT,key); 初始条件:动态查找表DT存在,key为和关键字类型相同的给定值。 操作结果:若DT中存在其关键字等于key的数据元素,则删除之。 TraverseDSTable(DT,visit()); 初始条件:动态查找表DT存在,visit是对结点操作的应用函数。 操作结果:按某种次序对DT的每个结点调用函数visit()一次且至多一次,一旦visit()失败,则操作失败。 }ADT DynamicSearchTable 二. 存储结构定义: 公用头文件DS0.h和宏定义: #include 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include 操作系统实验报告 学生学院____ 计算机学院______ 专业班级13级计科9 学 号 学生姓名 指导教师 李敏 2015年12月29日 实验一进程调度实验 一、实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求 设计一个有N个进程共行的进程调度程序。要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),时间片轮转算法,多级反馈队列调度算法这三种算法。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。 三、实验主要仪器设备和材料 实验环境 硬件环境:IBM-PC或兼容机 软件环境:C++、C语言编程环境 四、实验方法 1、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。 “最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。 例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。 2、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。 简单轮转法的基本思想是:所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。 3、多级反馈队列调度算法的基本思想是: 图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template #include 操作系统实验报告 学院_____计算机学院_______ 专业______软件工程________ 班级______ ________ 学号_____ _______ 姓名_______ _________ 指导教师 (2010年10 月) 学号:姓名:协作者:________ 实验__一__题目__ 进程调度___第周星期___ 一、实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求 编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。 ·每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行的时间、已用CPU时间、进程状态等。 ·进程的优先数以及需要的运行时间事先由人为指定(也可以随机数产生)。 ·如果运行一个时间片后进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果还未达到,则把它送回队尾。 三、实验主要仪器设备和材料 实验环境 硬件环境:IBM-PC 或兼容机 软件环境:C语言编程环境 四、实验原理及设计方案 1、实验原理 将程序顺序的输入进程队列后,开始执行程序,当运行了一个时间片后,如果进程所占的CPU时间达到所需的运行时间时,该进程完成,并撤销该进程,否则则把进程送回队尾。 2、设计方案 用一个进程控制块(PCB)表示进程。输入进程名称,优先级,运行时间后,通过模拟系统对进程采用“轮转法”调度,得到各个时间片进程的运行情况。 3、相关数据结构的说明 struct pcb // 定义进程控制块 PCB { 2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList [内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template 数据结构实验报告 二.程序设计相关信息 (1)实验题目:编写一个程序algo2-3.cpp,实现双链表的各种基本运算,并在此基础上设计一个主程序完成如下功能: 1.初始化双链表h; 2.依次采用尾插法插入a,b,c,d,e元素; 3.输出双链表h; 4.输出双链表h长度; 5.输出双链表h是否为空; 6.判断双链表h的第3个元素; 7.输出元素‘a’的位置; 8.在第4个元素位置上插入‘f’元素; 9.输出双链表h; 10.删除L的第3个元素; 11.输出双链表h; 12.释放双链表h。 (2)实验目的:熟悉双链表的基本操作并掌握尾插法建表。 (3)算法描述或流程图 (4)源代码 #include typedef struct DNode { char data; struct DNode *next; struct DNode *prior; }DNode,DLinkList; void initlist(DLinkList *&h) { h=(DLinkList*)malloc(sizeof(DLinkList)) ; h->next=NULL; h->prior=NULL; } void destroylist(DLinkList *&h) { DLinkList *p=h,*q=p->next; while(q!=NULL) {free(p); p=q; q=p->next; } free(p); } int getelem(DLinkList *h,int i,char &e) {int j=0; DLinkList *p=h; while(jnext; } if(p==NULL) return 0; else { e=p->data; return 1; } } int listempty(DLinkList *h) { return(h->next==NULL&&h->prior==NULL); } int listlength(DLinkList *h) { DLinkList *p=h;int n=0; while(p->next!=NULL) {n++; p=p->next; } return (n); 数据结构设计性实验报告 课程名称_____ ____ 题目名称 学生学院 专业班级 学号 学生姓名 指导教师 2010 年 7 月 6 日 抽象数据类型:树的实现 一.需求分析 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的内部结构。树的结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可以用树来形象表示。树在计算机领域中也得广泛应用,如在编译程序中,可用树来表示源程序的语法结构,又如在数据库系统中,树形结构也是信息的重要组织形式之一。 二.实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 三.实验环境 1、硬件:PC机 2、软件:Microsoft V isual C++ 6.0 四.设计说明 本程序采用树的二叉链表(孩子指针-兄弟指针-双亲指针)存储表示,以下是树的结构定义和基本操作: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3, …,Dm(m>0),对于任意j ≠k(1≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi∈Di有 重庆文理学院软件工程学院实验报告册专业:_____软件工程__ _ 班级:_____软件工程2班__ _ 学号:_____201258014054 ___ 姓名:_____周贵宇___________ 课程名称:___ 数据结构 _ 指导教师:_____胡章平__________ 2013年 06 月 25 日 步骤#define ERROR 0 #define TRUE 1 #define FALSE 0 #define ElemType int #define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/ typedef struct { ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/ }SeqList; #include "common.h" #include "seqlist.h" void px(SeqList *A,int j); void main() { SeqList *l; int p,q,r; int i; l=(SeqList*)malloc(sizeof(SeqList)); printf("请输入线性表的长度:"); scanf("%d",&r); l->last = r-1; printf("请输入线性表的各元素值:\n"); { scanf("%d",&l->elem[i]); } px(l,i); printf("请输入要插入的值:\n"); scanf("%d",&l->elem[i]); i++; px(l,i); l->last++; for(i=0; i<=l->last; i++) { printf("%d ",l->elem[i]); } printf("\n"); } void px(SeqList *A,int j) { int i,temp,k; for(i=0;i 实验目的 (1)学会用先序创建一棵二叉树。 (2)学会采用递归算法对二叉树进行先序、中序、后序遍历。 (3)学会打印输出二叉树的遍历结果。 实验内容 【问题描述】建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。 【基本要求】 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。 【测试数据】 ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA 【选作内容】 采用非递归算法实现二叉树遍历。 实验步骤 (一)需求分析 1、在这个过程中,接受遍历的二叉树是从键盘接受输入(先序),以二叉链表作为存储结构,建立的二叉树。因此,首先要创建一棵二叉树,而这棵二叉树是先序二叉树。本演示程序中,集合的元素设定为大写字母ABCDEFG,输出的先序,中序,后序遍历分别为ABCDEGF,CBEGDFA,CGBFDBA。二叉树可以表示为: 接受的输入数据在进行递归的先序,中序,后序遍历后,分别将结果打印出来。 2、在程序运行的过程中可以看到,以计算机提示用户执行的方式进行下去,即在计算机终端上提示“输入二叉树的先序序列”后,由用户在键盘上输入ABC##DE#G##F###,之后相应的选择遍历及遍历结果显示出来。 3、程序执行的命令包括:首先是二叉树的先序序列被创建输入,其次是对输入进去的先序序列有次序的进行先序,中序,后序遍历。最后是打印出二叉树的遍历结果。 4、测试数据 (1)在键盘上输入的先序序列ABC##DE#G##F### (2)先序遍历结果ABCDEGF 班级:姓名:学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // 姓名 double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; 2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨 实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。 三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;i 《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作 附源程序清单: 1. #include { return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n 数据结构实验 实验四、图遍历的演示。 【实验学时】5学时 【实验目的】 (1)掌握图的基本存储方法。 (2)熟练掌握图的两种搜索路径的遍历方法。 【问题描述】 很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示连通的无向图上,遍历全部结点的操作。 【基本要求】 以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 【测试数据】 教科书图7.33。暂时忽略里程,起点为北京。 【实现提示】 设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。 【选作内容】 (1)借助于栈类型(自己定义和实现),用非递归算法实现深度优先遍历。(2)以邻接表为存储结构,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。 (3)正如习题7。8提示中分析的那样,图的路径遍历要比结点遍历具有更为广泛的应用。再写一个路径遍历算法,求出从北京到广州中途不过郑州的所有简单路径及其里程。 【源程序】 #include 图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template 本科实验报告 课程名称:数据结构(C语言版) 实验项目:线性表、树、图、查找、内排序实验地点:明向校区实验楼208 专业班级:学号: 学生姓名: 指导教师:杨永强 2019 年 1 月10日 #include 班级: 姓名: 学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入与删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表与链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号与成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include { char num[10]; // 学号 char name[20]; // 姓名 double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; } Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到i位置的数据域,返回给 e { LinkList p; p=L->next;数据结构实验报告格式
(完整版)数据结构实验报告全集
数据结构实验报告(2)
数据结构实验报告-动态查找表实验报告
数据结构实验报告
2015广工操作系统实验报告(文档最后含源码下载地址)
数据结构实验报告图实验
广工_操作系统_实验报告
数据结构实验报告模板
数据结构实验报告2
数据结构-树的实现实验报告
数据结构实验答案(1)
数据结构实验报告.
数据结构实验一 实验报告
数据结构实验报告及心得体会
《数据结构》实验报告
数据结构实验四五六
数据结构实验报告图实验
数据结构实验报告
数据结构实验一 实验报告