数据结构实验报告1310300.docx

上传人:b****1 文档编号:10425800 上传时间:2023-05-25 格式:DOCX 页数:43 大小:25.47KB
下载 相关 举报
数据结构实验报告1310300.docx_第1页
第1页 / 共43页
数据结构实验报告1310300.docx_第2页
第2页 / 共43页
数据结构实验报告1310300.docx_第3页
第3页 / 共43页
数据结构实验报告1310300.docx_第4页
第4页 / 共43页
数据结构实验报告1310300.docx_第5页
第5页 / 共43页
数据结构实验报告1310300.docx_第6页
第6页 / 共43页
数据结构实验报告1310300.docx_第7页
第7页 / 共43页
数据结构实验报告1310300.docx_第8页
第8页 / 共43页
数据结构实验报告1310300.docx_第9页
第9页 / 共43页
数据结构实验报告1310300.docx_第10页
第10页 / 共43页
数据结构实验报告1310300.docx_第11页
第11页 / 共43页
数据结构实验报告1310300.docx_第12页
第12页 / 共43页
数据结构实验报告1310300.docx_第13页
第13页 / 共43页
数据结构实验报告1310300.docx_第14页
第14页 / 共43页
数据结构实验报告1310300.docx_第15页
第15页 / 共43页
数据结构实验报告1310300.docx_第16页
第16页 / 共43页
数据结构实验报告1310300.docx_第17页
第17页 / 共43页
数据结构实验报告1310300.docx_第18页
第18页 / 共43页
数据结构实验报告1310300.docx_第19页
第19页 / 共43页
数据结构实验报告1310300.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构实验报告1310300.docx

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

数据结构实验报告1310300.docx

数据结构实验报告1310300

(此文档为word格式,下载后您可任意编辑修改!

 

《数据结构》实验报告

 

专业计算机科学与技术

班级121班

姓名张航

学号

学期第1学期

指导老师刘勇

成绩:

实验

1

2

3

4

总分

成绩

教师评语:

数据结构上机实验报告

学号:

姓名:

张航所在系:

计算机科学与技术班级:

121班

实验名称:

线性结构基本算法的实现实验日期2013/11/6

实验指导教师刘勇实验机房4号机房

------

1.实验目的:

(1)掌握线性表顺序存储结构的基本操作:

插入、删除、查找;

(2)掌握线性表链式结构的基本操作:

插入、删除、合并等运算;

(3)掌握栈和队列基本运算的算法;

(4)掌握稀疏矩阵的压缩存储的算法。

2.实验内容:

(1)实现顺序表的创建、插入、删除和查找的操作;

(2)实现单链表插入、删除、合并的操作;

(3)实现2个有序线性表的合并;

(4)利用顺序栈实现括号匹配的算法;

(5)实现顺序队列各种基本运算的算法;

(6)实现链栈各种基本运算的算法;(选做)

(7)实现链队列各种基本运算的算法;(选做)

(8)实现稀疏矩阵压缩存储的算法。

3.算法设计(编程思路或流程图或源代码)

内容:

1、顺序表的插入和删除

//SqList.h

#include

#include

#include

#defineElemTypeint

#defineOK1

#defineERROR0

#defineOVERFLOW0

typedefstruct

{

ElemType*elem;

intlength;

intlistsize;

}SqList;

intInitList(SqList*L)

{

L->elem=(ElemType*)malloc(100*sizeof(ElemType));

if(!

L->elem)

returnOVERFLOW;

L->listsize=100;

L->length=0;

returnOK;

}

intCreateList(SqList*L,intn)

{

inti;

L->length=n;

printf("请输入%d个整数:

\n",L->length);

for(i=0;ilength;i++)

scanf("%d",&L->elem[i]);

returnOK;

}

voidTravelList(SqList*L)

{

inti;

for(i=0;ilength;i++)

printf("当前顺序表第%d个元素为:

%d\n",i+1,L->elem[i]);

}

intInsertList(SqList*L,inti,ElemTypee)

{

ElemType*newbase,*p,*q;

if(i<0||i>(L->length+1))

returnERROR;

if(L->length>=L->listsize)

{

newbase=(ElemType*)realloc(L->elem,(100+50)*sizeof(ElemType));

if(!

newbase)

returnERROR;

L->elem=newbase;

L->listsize=100+50;

}

p=&L->elem[i-1];

for(q=&L->elem[L->length-1];q>=p;q--)

*(q+1)=*q;

*p=e;

L->length++;

returnOK;

}

intDelList(SqList*L,inti,ElemType&x)

{

ElemType*p,*q;

if(i<1||i>L->length||L->length==0)

returnERROR;

p=&L->elem[i-1];

x=*p;

for(q=&L->elem[L->length-1];q>p;p++)

*p=*(p+1);

L->length--;

returnOK;

}

//.cpp

#include

#include

#include"SqList.h"

voidmain()

{

intn,i;

ElemTypee,x;

SqListsq;

SqList*l=&sq;

printf("***顺序表的基本操作***\n");

printf("计算机12117张航\n\n\n");

printf("***初始化顺序表***\n");

InitList(l);

printf("成功初始化顺序表!

\n\n");

printf("***建立顺序表***\n");

printf("输入要建立顺序表的长度:

\n");

scanf("%d",&n);

CreateList(l,n);

printf("成功建立顺序表!

\n");

TravelList(l);

printf("\n\n");

printf("***顺序表的插入***\n");

printf("输入插入位置及插入元素:

\n");

scanf("%d%d",&i,&e);

InsertList(l,i,e);

printf("成功插入顺序表!

\n");

TravelList(l);

printf("\n\n");

printf("***顺序表的删除***\n");

printf("输入删除位置:

\n");

scanf("%d",&i);

DelList(l,i,x);

printf("成功删除顺序表第%d个元素%d\n",i,x);

}

2、有序单链表的合并

//LinkList.h

#include

#include

#include

#defineElemTypeint

#defineNULL0

typedefstructLNode

{

ElemTypedata;

LNode*next;

}*LinkList;

voidCreateList(LinkListL,intn)

{

inti;

LinkListp,q;

p=L;

for(i=1;i<=n;i++)

{

q=(LinkList)malloc(sizeof(LNode));

printf("输入第%d个元素:

\n",i);

scanf("%d",&q->data);

q->next=p->next;

p->next=q;

p=p->next;

}

}

voidTravelList(LinkListL)

{

inti=1;

LinkListp;

p=L->next;

while(p)

{

printf("第%d个元素为:

%d\n",i,p->data);

i++;

p=p->next;

}

}

voidMergeList(LinkListLa,LinkListLb,LinkListLc)

{

LinkListpa,pb,pc;

pa=La->next;

pb=Lb->next;

Lc=pc=La;

while(pa&&pb)

{

if(pa->data<=pb->data)

{

pc->next=pa;

pc=pa;

pa=pa->next;

}

else

{

pc->next=pb;

pc=pb;

pb=pb->next;

}

}

pc->next=pa?

pa:

pb;

free(Lb);}

//.cpp

#include

#include

#include

#include"LinkList.h"

voidmain()

{

LinkListLa,Lb,Lc;

intn1,n2;

La=(LinkList)malloc(sizeof(LNode));

La->next=NULL;

Lb=(LinkList)malloc(sizeof(LNode));

Lb->next=NULL;

printf("***两个有序单链表的合并操作***\n");

printf("计算机12117张航\n\n\n");

printf("输入第一个单链表的长度:

\n");

scanf("%d",&n1);

printf("非递减顺序输入%d个整数:

\n",n1);

CreateList(La,n1);

printf("第一个单链表中的元素为:

\n");

TravelList(La);

printf("\n\n");

printf("输入第二个单链表的长度:

\n");

scanf("%d",&n2);

printf("非递减顺序输入%d个整数:

\n",n2);

CreateList(Lb,n2);

printf("第二个单链表中的元素为:

\n");

TravelList(Lb);

printf("\n\n");

printf("正在执行合并操作......\n\n\n");

Lc=La;

MergeList(La,Lb,Lc);

printf("合并后单链表的元素为:

\n");

TravelList(Lc);

}

3、数制转换的算法实现

//SqStack.h

#include

#include

#include

#defineOK1

#defineERROR0

#defineOVERFLOW0

#defineElemTypeint

typedefstruct

{

ElemType*base;

ElemType*top;

intstacksize;

}SqStack;

intInitStack(SqStack*S)

{

S->base=(ElemType*)malloc(20*sizeof(ElemType));

if(!

S)

returnOVERFLOW;

S->top=S->base;

S->stacksize=20;

returnOK;

}

intPush(SqStack*S,ElemTypee)

{

if(S->top-S->base>=S->stacksize)

{

S->base=(ElemType*)realloc(S->base,(20+10)*sizeof(ElemType));

if(!

S->base)

returnOVERFLOW;

S->top=S->base+S->stacksize;

S->stacksize=20+10;

}

*(S->top++)=e;

returnOK;

}

intPop(SqStack*S,ElemType&x)

{

if(S->top==S->base)

returnERROR;

x=*(--S->top);

returnOK;

}

//.cpp

#include

#include

#include

#include"SqStack.h"

voidconversion(intn,intm)

{

inte;

SqStacksq;

SqStack*s=&sq;

InitStack(s);

while(n)

{

Push(s,n%m);

n=n/m;

}

while(sq.base!

=sq.top)

{

Pop(s,e);

printf("%d",e);

}

}

voidmain()

{

intn,m;

printf("***数制转换***\n");

printf("计算机12117张航\n\n\n");

printf("输入一个10进制整数:

\n");

scanf("%d",&n);

printf("输入需要转换的数制:

\n");

scanf("%d",&m);

printf("正在进行转换......\n\n");

printf("10进制数%d转换成%d进制数为:

\n",n,m);

conversion(n,m);

printf("\n");

}

4、快速转置算法的实现

//.cpp

#include

#include

#include

#defineOK1

#defineERROR0

#defineOVERFLOW0

#defineElemTypeint

#defineMAXSIZE12500

typedefstruct

{

intr,c;

ElemTypee;

}Triple;

typedefstruct

{

Tripledata[MAXSIZE];

introws,cols,nums;

}TSMatrix;

intCreateMatrix(TSMatrix&t,ElemTypea[5][5])

{

inti,j;

t.rows=5;

t.cols=5;

t.nums=0;

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

{

if(a[i][j]!

=0)

{

t.data[t.nums+1].r=i+1;

t.data[t.nums+1].c=j+1;

t.data[t.nums+1].e=a[i][j];

t.nums++;

}

}

}

t.data[0].r=t.rows;

t.data[0].c=t.cols;

t.data[0].e=t.nums;

returnOK;

}

voidDisplayMatrix(TSMatrixt)

{

inti;

for(i=0;i<=t.nums;i++)

printf("%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].e);

}

intFastTransposeMatrix(TSMatrixt,TSMatrix&t1)

{

intcol,i,p,q;

intnum[6];

intcpot[6];

t1.rows=t.cols;

t1.cols=t.rows;

t1.nums=t.nums;

if(t.nums)

{

for(col=1;col<=t.cols;col++)

num[col]=0;

for(i=1;i<=t.nums;i++)

num[t.data[i].c]++;

cpot[1]=1;

for(col=2;col<=t.cols;col++)

cpot[col]=cpot[col-1]+num[col-1];

for(p=1;p<=t.nums;p++)

{

col=t.data[p].c;

q=cpot[col];

t1.data[q].r=t.data[p].c;

t1.data[q].c=t.data[p].r;

t1.data[q].e=t.data[p].e;

cpot[col]++;

}

}

t1.data[0].r=t1.rows;

t1.data[0].c=t1.cols;

t1.data[0].e=t1.nums;

returnOK;

}

voidmain()

{

ElemTypea[5][5];

TSMatrixt,t1;

inti,j;

printf("***5*5稀疏矩阵快速转置操作***\n");

printf("计算机12117张航\n\n\n");

printf("输入25个整数:

\n");

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

scanf("%d",&a[i][j]);

}

CreateMatrix(t,a);

printf("当前稀疏矩阵的三元组顺序表表示为:

\n");

DisplayMatrix(t);

printf("\n\n正在进行快速转置操作......\n\n");

FastTransposeMatrix(t,t1);

printf("转置后矩阵的三元组顺序表表示为:

\n");

DisplayMatrix(t1);

}

4.程序调试(实验数据记录——根据程序要求输入几组不同数据,记录程序运行结果,并分析结果,分析程序运行中出现的主要错误。

或对其他程序环境的使用情况的记录。

注:

必须认真书写)

算法1

realloc函数原型是externvoid*realloc(void*mem_address,unsignedintnewsize);

算法2

pc->next=pa?

pa:

pb;等价于if(pa)pc->next=paelsepc->next=pb;

free(Lb);这一句,返回的Lc指向了La,所以不能freeLa。

Lc中的Lb的数据是从Lb->next开始插入的pb=Lb->next。

Lb这个指针还指向一个链表头,所以需要free。

算法3

x=*(--S->top);此句第一次写成x=--S->top;导致编译出错。

S->top还是一个指针,*(--S->top)才是指针所指的内容,才可以赋值给整形变量x。

算法4

调试过程中第一个大错误是将intCreateMatrix(TSMatrix&t,ElemTypea[5][5])写成intCreateMatrix(TSMatrixt,ElemTypea[5][5]),区别在于按值传递和按地址传递。

按照错误的写法,导致程序DisplayMatrix(t)时,输出为空。

因为在main()中CreateMatrix(t,a)时,按值传递不改变参数t的状态,t还是保持TSMatrixt时的未赋值状态,所以输出为空。

修改为按地址传递后,CreateMatrix(t,a)运行一系列操作,形参t发生变化就是实参t发生变化,进而输出正确结果。

调试过程中intFastTransposeMatrix(TSMatrixt,TSMatrix&t1)函数中

for(p=1;p<=t.nums;p++)语句本来写成for(p=1;p<=t.cols;p++),这是一个很微小的错误,误把变量搞错。

但是这个小错误却导致FastTransposeMatrix(t,t1)运行结果不正确:

执行DisplayMatrix(t1),只有t1.data[0]~t1.data[5]正确输出,其余t1.data[]都是未知。

经过长时间分析检查发现这个错误并改正。

这说明写代码一定要认真仔细,这样才能尽可能避免话费大量的时间来发现小错误。

另外写本算法时还有若干小错误。

5.讨论(通过实验的一些体会、学会的知识和技能等)

见4.程序调试。

数据结构上机实验报告

学号:

姓名:

张航所在系:

计算机科学与技术班级:

121班

实验名称:

二叉树的基本应用实验日期2013/11/20

实验指导教师刘勇实验机房4号机房

------

2.实验目的:

(1)理解树这种数据结构。

(2)掌握二叉树二叉链表这种存储结构。

(3)完成二叉树各种基本运算的算法。

2.实验内容:

(1)实现二叉树创建的算法。

(2)实现二叉树各种遍历算法。

(3)实现二叉树其他操作的算法,包括:

统计叶子结点的个数、求二叉树的深度、线索二叉树等。

3.算法设计(编程思路或流程图)

1、二叉树创建的算法

//BiTNode.h

#include

#include

#include

#defineOK1

#defineERROR0

#defineOVERFLOW0

#defineNULL0

#defineElemTypechar

typedefstructBiTNode

{

ElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

intCreateBiTree(BiTree&T)

{

ElemTypech;

scanf("%c",&ch);

if(ch=='#')

T=NULL;

else

{

T=(BiTNode*)malloc(sizeof(BiTNode));

if(!

T)

exit(OVERFLOW);

T->data=ch;

CreateBiTree(T->lchild);

CreateBiTree(T->rchild);

}

returnOK;

}

voidLevelBiTree(BiTreeT)

{

BiTreeQueue[20],b;

intfront,rear;

front=rear=0;

if(T)

{

Queue[rear]=T;

rear=(rear+1)%20;

while

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

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2