c数据结构实验报告.docx

上传人:b****2 文档编号:22893479 上传时间:2023-04-28 格式:DOCX 页数:16 大小:25.37KB
下载 相关 举报
c数据结构实验报告.docx_第1页
第1页 / 共16页
c数据结构实验报告.docx_第2页
第2页 / 共16页
c数据结构实验报告.docx_第3页
第3页 / 共16页
c数据结构实验报告.docx_第4页
第4页 / 共16页
c数据结构实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

c数据结构实验报告.docx

《c数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《c数据结构实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

c数据结构实验报告.docx

c数据结构实验报告

c++数据结构实验报告

  算法与数据结构;实验报告;实验一:

栈与队列;一、实验目的;1、掌握栈和队列特点、逻辑结构和存储结构;2、熟悉对栈和队列的一些基本操作和具体的函数定义;3、利用栈和队列的基本操作完成一定功能的程序;二、实验任务;1.出顺序栈的类定义和函数实现,利用栈的基本操作;的转换;2.给出顺序队列的类定义和函数实现,并利用队列计;容;3.给出链栈的类定义和函数实现,并设计

  算法与数据结构

  实验报告

  实验一:

栈与队列

  一、实验目的

  1、掌握栈和队列特点、逻辑结构和存储结构

  2、熟悉对栈和队列的一些基本操作和具体的函数定义。

  3、利用栈和队列的基本操作完成一定功能的程序。

  二、实验任务

  1.出顺序栈的类定义和函数实现,利用栈的基本操作完成十进制数N与其它d进制数

  的转换。

(如N=1357,d=8)

  2.给出顺序队列的类定义和函数实现,并利用队列计算并打印杨辉三角的前n行的内

  容。

(n=8)

  3.给出链栈的类定义和函数实现,并设计程序完成如下功能:

读入一个有限大小的整

  数n,并读入n个数,然后按照与输入次序相反的次序输出各元素的值。

  三、实验原理

  1、将十进制数N转化为d进制时,用除去余数法,用d除N所得余数作为d进制当前个位,将相除所得的商的整数部分作为新的N值重复上述计算,直到N为0为止。

将前所得到的各余数反过来连接便得到最终结果。

将每次求出的余数入栈,求解结束后,再依次出栈。

2、在杨辉三角中可用上一行的数来求出对应位置的下一行的内容。

用队列保存上行内容,每当由上行的两个数求出下行的一个数时,其中的前一个便需要删除,而求出的数就入队。

为便于求解,在每行的第一个位置添加一个0作为辅助。

  3、输出操作应在读入所有输入的整数后才能进行,用栈来存储这些数据,调用入栈出栈函数实现相关功能。

  四、程序清单

  第一题

  #include#ifndefSTACK_H#defineSTACK_Hconstintmaxlen=256;typedefintelementtype;enumerror_code{success,underflow,overflow};classstack{public:

stack();boolempty()const;boolfull()const;error_codeget_top(elementtype&x)const;error_codepush(constelementtypex);error_codepop();private:

intcount;elementtypedata;};

  stack:

:

stack(){count=0;}

  boolstack:

:

empty()const{if(count==0)returntrue;returnfalse;}

  error_codestack:

:

get_top(elementtype&x)const{if(empty())returnunderflow;else{x=data;returnsuccess;}}

  error_codestack:

:

push(constelementtypex){if(full())returnoverflow;data=x;count++;

  returnsuccess;}

  error_codestack:

:

pop(){

  if(empty())returnunderflow;count--;returnsuccess;}

  boolstack:

:

full()const{if(count==maxlen)returntrue;returnfalse;}

  #endif

  voidDec_to_Ocx(intN,intd){stackS;intMod,x;while(N!

=0){Mod=N%d;

  第二题

  #includeconstintmaxlen=256;typedefintelementtype;enumerror_code{success,underflow,overflow};classqueue{public:

queue();boolempty()const;boolfull()const;error_codeget_front(elementtype&x)const;error_codeappend(constelementtypex);error_codeserve();private:

intcount;intfront,rear;elementtypedata;};

  queue:

:

queue(){count=0;front=rear=0;}boolqueue:

:

empty()const{if(count==0)returntrue;returnfalse;}

  boolqueue:

:

full()const{if(count==maxlen-1)returntrue;returnfalse;

  (Mod);N=N/d;}

  while(!

()){_top(x);();coutN;cin>>d;

  Dec_to_Ocx(N,d);}

  }

  error_codequeue:

:

get_front(elementtype&x)const{if(empty())returnunderflow;x=data;returnsuccess;}

  error_codequeue:

:

append(constelementtypex){if(full())returnoverflow;rear=(rear+1)%maxlen;data=x;count++;returnsuccess;}

  error_codequeue:

:

serve(){if(empty())returnunderflow;front=(front+1)%maxlen;count--;returnsuccess;}

  voidOut_Number(intn)

  {ints1,s2;queueQ;inti,j;

  error_codeEc;cout  for(i=2;in;

  s1=s2;Out_Number(n);}}

  第三题

  #include#ifndefSTACK_H#defineSTACK_Hconstintmaxlen=256;typedefstructlinklist{intdata;

  structlinklist*next;}node;

  typedefintelementtype;enumerror_code{success,underflow,overflow};classstack{

  public:

stack();~stack();

  boolempty()const;boolfull()const;error_code

  get_top(elementtype&x)const;

  error_codepush(constelementtypex);

  error_codepop();private:

intcount;node*top;};

  stack:

:

stack()

  {count=0;top=NULL;}

  boolstack:

:

empty()const

  {returncount==0;}

  boolstack:

:

full()const{returnfalse;}

  error_codestack:

:

get_top(elementtype&x)const{

  if(empty())returnunderflow;x=top->data;returnsuccess;}

  stack:

:

~stack(){

  while(!

empty())pop();}

  error_codestack:

:

push(constelementtypex){node*s;

  s=newnode;s->data=x;s->next=top;top=s;

  count++;returnsuccess;}

  error_codestack:

:

pop(){

  if(empty())returnunderflow;node*u;u=top;top=top->next; u;count--;

  returnsuccess;}

  #endif

  voidread_write(){stackS;

  intx,n,i;cout>n;

  for(i=1;i>x;(x);}while(()!

=true)

  {_top(x);

  ();cout  voidmain(){read_write();}

  五、运行结果

  1、

  2、

  3、

  实验二:

单链表

  一、实验目的:

  1、理解线性表的链式存储结构。

  2、熟练掌握动态链表结构及有关算法的设计。

  3、根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

  二、实验任务:

  1、在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。

  实验数据:

链表元素为(10,20,30,40,50,60,70,80,90,100),x分别为25,85,110和8。

2、将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后

  再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

实验测试数据基本要求:

  第一组数据:

链表元素为(1,2,3,4,5,6,;3.求两个递增有序链表L1和L2中的公共元素,并;第一个链表元素为(1,3,6,10,15,16,;第二个链表元素为(1,2,3,4,5,6,7,8;第一个链表元素为(1,3,6,10,15,16,;三、实验原理;1、给定了递增的插入条件,需要搜索满足条件的插入;2、从链表A第一项开始,第一项插入链表B,第二

  第一组数据:

链表元素为(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。

实验测试数据基本要求:

第一组数据:

  第一个链表元素为(1,3,6,10,15,16,17,18,19,20)

  第二个链表元素为(1,2,3,4,5,6,7,8,9,10,18,20,30)第二组数据:

  第一个链表元素为(1,3,6,10,15,16,17,18,19,20)第二个链表元素为(2,4,5,7,8,9,12,22)

  三、实验原理

  1、给定了递增的插入条件,需要搜索满足条件的插入位置的前驱结点。

从原表的第一个元素开始,直到某一元素A的值大于要插入元素的值为止,A的前驱结点便是插入位置。

  2、从链表A第一项开始,第一项插入链表B,第二项插入链表C,依次类推,奇数项插入链表B,偶数项插入链表C,直到无元素为止。

  3、从AB表的第一项开始,若A第一项大于B第一项,B向后搜索,如果找到共同元就将其插入表C,如无共同元素,表A从第二项搜索,依次类推。

若A的第一项小于B的第一项,则该元素没有公共项,A从第二项搜索,依次类推。

若AB第一项相同,则该数就是公共元素,插入表C,AB都从第二项搜索,依次类推。

  四、程序清单

  第一、二题

  #includestructnode{

  intdata;node*next;};

  classlist{public:

list();~list();

  intlength();

  voidinput_elem(constintn);voidprint();

  node*get_head();

  voidset_(node*L,intdata);

  voidjiou_list(node*P,node*Q,node*R);private:

intcount;node*head;};

  list:

:

list(){

  head=newnode;head->next=NULL;count=0;}

  list:

:

~list(){

  node*p,*q;p=head->next;while(p!

=NULL){q=p;

  p=p->next; q;}}

  intlist:

:

length(){

  intn=0;

  node*p=head->next;while(p!

=NULL){n++;

  p=p->next;}

  returnn;}

  voidlist:

:

input_elem(constintn){

  node*p,*pre;pre=head;

  for(inti=0;i

  p=newnode;cin>>p->data;pre->next=p;pre=p;count++;}

  pre->next=NULL;}

  voidlist:

:

print(){

  node*p;p=head;p=p->next;

  while(p!

=NULL){

  cout

  cout  cout>m;cout  case1:

{

  cout  cout>n;

  _elem(n);

  cout>data;

  _(_head(),data);();

  cout  第三题

  #include#include

  typedefintelementtype;structNode{

  elementtypedata;Node*next;};

  classlist{

  private:

Node*head;Node*real;public:

  cout  case2:

{

  cout  cout>n;

  _elem(n);_list

  (_head(),_head(),_head());cout  cout  cout  cout  list();voidcommon(list&L1,list&L2);voidcreate();friendostream&operator  list:

:

list(){head=newNode;real=head;};

  voidlist:

:

create(){Node*u;

  elementtypex;cin>>x;while(x!

=-1){u=newNode;u->data=x;real->next=u;real=u;cin>>x;}real->next=NULL;}

  ostream&operatornext;while(p!

=NULL){outnext;out  voidlist:

:

common(list&L1,list&L2){Node*pa,*pb,*u;pa=>next;pb=>next;

  while(pa!

=NULL&&pb!

=NULL){if(pa->datadata)pa=pa->next;else

  if(pa->data>pb->data)pb=pb->next;else{u=newNode;u->data=pa->data;real->next=u;real=u;pa=pa->next;pb=pb->next;}real->next=NULL;}}

  voidmain(){listL1,L2,L3;inti;elementtypex;cout  五、运行结果

  1、

  2、

  3、

  实验三:

二叉树

  一、实验目的:

  1.掌握二叉树的动态链表存储结构及表示。

  2.掌握二叉树的三种遍历算法(递归和非递归两类)。

3.运用二叉树三种遍历的方法求解有关问题。

  二、实验任务:

  1.建立一棵采用二叉链表结构存储的二叉树。

  2.分别采用递归和非递归两种方式对该二叉树进行先序、中序和后序遍历。

  3.求二叉树的高度以及二叉树中叶子结点的数目;三、实验原理;1、按先序遍历的方法建立二叉树,结点的空孩子用#;非递归中序遍历:

遇到一个结点,就把它推入栈中,并;非递归后序遍历:

遇到一个结点,把它推入栈中,遍历;3、求高度时,若T为空,则其高度为0,结束,否则;四、程序清单;递归并求叶子节点数和深度;#include

  3.求二叉树的高度以及二叉树中叶子结点的数目。

  三、实验原理

  1、按先序遍历的方法建立二叉树,结点的空孩子用#代替输入,先建立根结点在建立左右子树,依次类推。

2、对二叉树的遍历是在对各子树分别遍历的基础上进行的,借助对整个二叉树的遍历算法实现对左右子树的遍历。

在先序遍历以T为根的二叉树时,访问根结点后,分别对根结点*T的左右孩子为根的子树进行遍历,中序后序递归遍历也采用此思想。

非递归前序遍历:

遇到一个结点,就访问该结点,并把此结点入栈,然后下降去遍历它的左子树。

遍历完它的左子树后,从栈顶托出这个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。

  非递归中序遍历:

遇到一个结点,就把它推入栈中,并去遍历它的左子树。

遍历完左子树后,从栈顶托出这个结点并访问之,然后按照它的右链接指示的地址再去遍历该结点的右子树。

  非递归后序遍历:

遇到一个结点,把它推入栈中,遍历它的左子树。

遍历结束后,还不能马上访问处于栈顶的该结点,而是要再按照它的右链接结构指示的地址去遍历该结点的右子树。

遍历遍右子树后才能从栈顶托出该结点并访问之。

另外,需要给栈中的每个元素加上一个特征位,以便当从栈顶托出一个结点时区别是从栈顶元素左边回来的(则要继续遍历右子树),还是从右边回来的(该结点的左、右子树均已周游)。

特征为left表示已进入该结点的左子树,将从左边回来;特征为right表示已进入该结点的右子树,将从右边回来。

  3、求高度时,若T为空,则其高度为0,结束,否则,T不为空时,可采用递归的方式,T的左右子树的高度分别能求出来,则二叉树的高度是其左右子树高度的最大值加1.

  四、程序清单

  递归并求叶子节点数和深度

  #includetypedefstructBiTNode{

  chardata;intbit;

  structBiTNode*lchild,*rchild,*parent;}BiTNode;

  voidInitBT(BiTNode*&t){

  t=NULL;}

  intEmptyBT(BiTNode*t){

  if(t==0)

  return1;else

  return0;}

  BiTNode*creatBT(BiTNode*t,intb){

  BiTNode*p;charch;cin>>ch;

  if(ch=='#')return0;else{

  p=newBiTNode;p->data=ch;

  p->parent=t;p->bit=b;t=p;

  t->lchild=creatBT(t,0);t->rchild=creatBT(t,1);}

  returnt;}

  voidpreorder(BiTNode*t){

  if(!

EmptyBT(t)){

  coutlchild);preorder(t->rchild);}}

  voidinorder(BiTNode*t)//中序遍历{

  if(!

EmptyBT(t)){

  inorder(t->lchild);coutrchild);}}

  voidpostorder(BiTNode*t)//后序遍历{

  if(!

EmptyBT(t)){

  postorder(t->lchild);postorder(t->rchild);cout

  voidcoutBT(BiTNode*t,int&m)//计算二叉树中叶子结点{

  if(!

EmptyBT(t)){

  if((t->lchild==0)&&(t->rchild==0))m++;//叶子结点

  非递归遍历

  #include

  coutBT(t->lchild,m);coutBT(t->rchild,m);}}

  intBTdepth(BiTNode*t)//求二叉树的深度{

  inti,j;

  if(EmptyBT(t))return0;else{

  i=BTdepth(t->lchild);j=BTdepth(t->rchild);return(i>j?

i:

j)+1;}}

  voidmain(){

  BiTNode*t;intm,n,i,d,q,k;charx;InitBT(t);

  cout  cout  cout  cout  coutBT(t,m);

  cout  d=BTdepth(t);

  cout  constintMaxSize=256;

  templatestructBiNode{Tdata;BiNode*lchild,*rchild;BiNode*btr;int

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1