数据结构实验报告1310300Word文档下载推荐.docx

上传人:b****5 文档编号:20380472 上传时间:2023-01-22 格式:DOCX 页数:29 大小:23.66KB
下载 相关 举报
数据结构实验报告1310300Word文档下载推荐.docx_第1页
第1页 / 共29页
数据结构实验报告1310300Word文档下载推荐.docx_第2页
第2页 / 共29页
数据结构实验报告1310300Word文档下载推荐.docx_第3页
第3页 / 共29页
数据结构实验报告1310300Word文档下载推荐.docx_第4页
第4页 / 共29页
数据结构实验报告1310300Word文档下载推荐.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

数据结构实验报告1310300Word文档下载推荐.docx

《数据结构实验报告1310300Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1310300Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。

数据结构实验报告1310300Word文档下载推荐.docx

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

内容:

1、顺序表的插入和删除

SqList.OVERFLOW;

L->

listsize=100;

length=0;

returnOK;

}

intCreateList(SqList*L,intn)

{

inti;

length=n;

printf("

请输入%d个整数:

\n"

L->

length);

for(i=0;

i<

L->

length;

i++)

scanf("

%d"

&

elem[i]);

voidTravelList(SqList*L)

printf("

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

%d\n"

i+1,L->

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;

listsize=100+50;

}

p=&

elem[i-1];

for(q=&

elem[L->

length-1];

q>

=p;

q--)

*(q+1)=*q;

*p=e;

length++;

intDelList(SqList*L,inti,ElemType&

x)

ElemType*p,*q;

1||i>

length||L->

length==0)

x=*p;

p;

p++)

*p=*(p+1);

length--;

.cpp

#include<

stdio.()

intn,i;

ElemTypee,x;

SqListsq;

SqList*l=&

sq;

***顺序表的基本操作***\n"

);

计算机12117张航\n\n\n"

***初始化顺序表***\n"

InitList(l);

成功初始化顺序表!

\n\n"

***建立顺序表***\n"

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

scanf("

n);

CreateList(l,n);

成功建立顺序表!

TravelList(l);

***顺序表的插入***\n"

输入插入位置及插入元素:

%d%d"

i,&

e);

InsertList(l,i,e);

成功插入顺序表!

***顺序表的删除***\n"

输入删除位置:

i);

DelList(l,i,x);

成功删除顺序表第%d个元素%d\n"

i,x);

2、有序单链表的合并

LinkList.)

LinkListp,q;

p=L;

for(i=1;

=n;

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

printf("

输入第%d个元素:

i);

q->

data);

q->

next=p->

next;

p->

next=q;

p=p->

voidTravelList(LinkListL)

inti=1;

LinkListp;

p=L->

while(p)

第%d个元素为:

i,p->

i++;

voidMergeList(LinkListLa,LinkListLb,LinkListLc)

LinkListpa,pb,pc;

pa=La->

pb=Lb->

Lc=pc=La;

while(pa&

&

pb)

if(pa->

data<

=pb->

data)

{

pc->

next=pa;

pc=pa;

pa=pa->

}

else

next=pb;

pc=pb;

pb=pb->

pc->

next=pa?

pa:

pb;

free(Lb);

LinkListLa,Lb,Lc;

intn1,n2;

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

La->

next=NULL;

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

Lb->

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

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

n1);

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

n1);

CreateList(La,n1);

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

TravelList(La);

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

n2);

n2);

CreateList(Lb,n2);

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

TravelList(Lb);

正在执行合并操作......\n\n\n"

Lc=La;

MergeList(La,Lb,Lc);

合并后单链表的元素为:

TravelList(Lc);

3、数制转换的算法实现

SqStack.OVERFLOW;

S->

top=S->

base;

stacksize=20;

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;

base+S->

stacksize;

stacksize=20+10;

*(S->

top++)=e;

intPop(SqStack*S,ElemType&

top==S->

x=*(--S->

top);

stdio.(intn,intm)

inte;

SqStacksq;

SqStack*s=&

InitStack(s);

while(n)

Push(s,n%m);

n=nm;

while(sq.base!

=sq.top)

Pop(s,e);

e);

voidmain()

intn,m;

***数制转换***\n"

输入一个10进制整数:

输入需要转换的数制:

m);

正在进行转换......\n\n"

10进制数%d转换成%d进制数为:

n,m);

conversion(n,m);

4、快速转置算法的实现

stdio.OK;

voidDisplayMatrix(TSMatrixt)

=t.nums;

%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;

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

cpot[1]=1;

for(col=2;

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

for(p=1;

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;

ElemTypea[5][5];

TSMatrixt,t1;

inti,j;

***5*5稀疏矩阵快速转置操作***\n"

输入25个整数:

5;

for(j=0;

j<

j++)

scanf("

a[i][j]);

CreateMatrix(t,a);

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

DisplayMatrix(t);

\n\n正在进行快速转置操作......\n\n"

FastTransposeMatrix(t,t1);

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

DisplayMatrix(t1);

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

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

注:

必须认真书写)

算法1

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

算法2

pc->

等价于if(pa)pc->

next=paelsepc->

free(Lb);

这一句,返回的Lc指向了La,所以不能freeLa。

Lc中的Lb的数据是从Lb->

next开始插入的pb=Lb->

next。

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

算法3

x=*(--S->

此句第一次写成x=--S->

top;

导致编译出错。

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++)语句本来写成for(p=1;

p++),这是一个很微小的错误,误把变量搞错。

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

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

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

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

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

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

见4.程序调试。

计算机科学与技术班级:

二叉树的基本应用实验日期20131120

2.实验目的:

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

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

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

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

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

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

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

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

1、二叉树创建的算法

BiTNode.OK;

voidLevelBiTree(BiTreeT)

BiTreeQueue[20],b;

intfront,rear;

front=rear=0;

if(T)

Queue[rear]=T;

rear=(rear+1)%20;

while(front!

=rear)

b=Queue[front];

%2c"

b->

front=(front+1)%20;

if(b->

lchild!

=NULL)

{

Queue[rear]=b->

lchild;

rear=(rear+1)%20;

}

rchild!

rchild;

BiTreeT=NULL;

***二叉树的建立与输出***\n"

先序遍历顺序输入二叉树的字符序列:

CreateBiTree(T);

层次遍历输出当前二叉树:

LevelBiTree(T);

2、叶子结点统计的算法

BiTNode

stdio.;

if(T==NULL)

n=0;

elseif(T->

lchild==NULL&

T->

rchild==NULL)

n=1;

else

n=leafcount(T->

lchild)+leafcount(T->

rchild);

returnn;

***统计二叉树的叶子结点***\n"

当前二叉树的叶子结点数是:

leafcount(T));

3、二叉树深度统计算法

BiTNode.ERROR;

else

dep1=depth(T->

lchild);

dep2=depth(T->

returndep1>

dep2?

dep1+1:

dep2+1;

***二叉树深度的统计***\n"

二叉树的深度是:

depth(T));

BiTNode.()中T赋值后LevelBiTree(T)为空,原因是按值传递形参T和实参T占用不同内存单元,调用CreateBiTree()时,形参发生变化然后所在内存空间被释放,而实参至始至终没发生变化。

将函数按照按地址传递定义后,问题迎刃而解。

通过算法2、3,我对递归回溯有了更深的体会。

121班

图的基本实现与应用实验日期20121204

3.实验目的:

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

(2)掌握邻接矩阵、邻接表这种存储结构的实现方法。

(3)完成图的遍历的算法。

(1)实现图的邻接矩阵与邻接表结构的转换。

(必做)

(2)实现图遍历的算法。

(3)实现图的拓扑排序的算法。

(4)实现图的最短路径的算法

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

1、图的邻接矩阵和邻接表创建的算法

stdio."

G.vexnum,&

G.arcnum);

G.vexnum;

输入顶点%d的值:

i+1);

G.vexs[i]);

fflush(stdin);

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

当前位置:首页 > 总结汇报 > 其它

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

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