数据结构实验报告Word格式文档下载.docx

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

数据结构实验报告Word格式文档下载.docx

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

数据结构实验报告Word格式文档下载.docx

//初始化线性表

voidinsert(sqlist&

int,char);

//在线性表中插入元素voidinitlist(sqlist&

voidprint(sqlist);

//显示线性表中所有元素voidmain()

{sqlistla,lb,lc;

//la,lb,lc是线性表

initial(la);

initlist(lb);

initlist(lc);

inti;

for(i=0;

i&

la.length;

i++)

{if(i%2==0)insert(lb,i/2,la.list[i]);

//奇数位插入lb

elseinsert(lc,i/2,la.list[i]);

}//偶数位插入lc

printf(\n您输入的线性表元素为:

\n\n);

print(la);

printf(线性表的奇数位次的元素为:

print(lb);

printf(线性表的偶数位次的元素为:

print(lc);

}

v)

inti,a;

printf(请输入一个偶数作为线性表的长度:

scanf(%d,&

a);

while(a%2!

=0)

{printf(您输入的数是奇数,请重新输入一个偶数:

}

v.length=a;

printf(\n请输入线性表元素:

v.length;

scanf(%c,&

v.list[i]);

//对la进行赋值

voidinitlist(sqlist&

v)//构造一个空的线性表

v.elem=(char)malloc(max*sizeof(char));

v.length=0;

v,intj,charc)

v.list[j]=c;

//插入c

v.length++;

voidprint(sqlistv)

{printf(%c,v.list[i]);

}//输出线性表元素

printf(\n\n);

调试通过后运行结果如下:

2.已知线性表la的数据元素(n个),现要求将la的数据元素复制到另一个线性表lb中。

#definemax100//定义线性表的最大长度

typedefstruct

voidprintf(sqlist);

//显示线性表中所有元素

voidmain()

i++)//复制{

lb.list[i]=la.list[i];

lb.length++;

printf(lb);

voidinitial(sqlist&

v)//{

printf(请输入一个线性表的长度(最大为100):

\n);

v.length);

printf(请输入线性表元素:

v)//{

voidprintf(sqlistv)

printf(\n复制得到的线性表为:

printf(%c,v.list[i]);

printf(\n);

构造线性表构造空线性表

3.设有一个线性表采用顺序存储结构,表中的数据元素值为正整数(n个)。

设在o(n)时间内,将线性表分成两为两部分,其中左半部分每个元素都小于原表的第一个元素,而右半部分则相反。

intelem;

intlist[max];

int,int);

//显示线性表中所有元素voidmain()

sqlistla,lb,lc;

inti=1,j=0,k=0,x=la.list[0];

for(;

i++)if(la.list[i]&

x){insert(lb,j,la.list[i]);

j++;

}else{insert(lc,k,la.list[i]);

k++;

}printf(\n将输入的线性表以首元素为中心分成两部分:

printf(%d\n\n,x);

printf(请输入线性表长度:

v)//

v.elem=(int)malloc(max*sizeof(int));

v,intj,intc)

//

{printf(%d,v.list[i]);

}//

构造一个空的线性表插入输出线性表元素

4.设线性表la=(a1,a2,…,am),lb=(b1,b2,…,bn)。

试编写一个算法,将la、lb合并为线性表lc,使

?

?

a1,b1,...,am,bm,bm?

1,...,bn?

当m?

n时lc=?

a1,b1,...,an,bn,an?

1,...,am?

当m?

n时

要求la、lb和lc均以单链表为存储结构,且lc表利用la和lb中结点空间,这里m和n的值没有保存在头结点中,并分析算法时间复杂度。

stdlib.h&

typedefstructnode{

}s;

charx;

structnode*next;

s*s_create(s*head){

charch;

s*h,*p,*q;

h=(s*)malloc(sizeof(s));

h-&

x=;

p=h;

fflush(stdin);

//这一句必须加,不然第二次使用该函数时,ch读到的值是回车scanf(%c,&

ch);

while(ch!

=0){

q=(s*)malloc(sizeof(s));

q-&

x=ch;

p-&

next=q;

p=q;

next=null;

returnh;

}

voids_union(s*head1,s*head2){

//s*p=head1-&

next,*q=head2-&

next,*r=head1;

//实现两个链表交叉合并为head1

s*h1,*h2;

s*upre;

h1=head1;

h2=head2;

upre=h1;

//puts(合并);

//一比一比例交叉合并

if(null==h1){

upre=h2;

printf(表1为空);

else

if(null==h2){

printf(表2为空);

}else

while(null!

=(h1-&

next)&

&

null!

=(h2-&

next)){

//插入h1节点,并在插入后把upre移到h2节点h1=h1-&

next;

//h1下移一个节点

upre-&

next=h2;

//插入h1节点,并转而对h2进行操作upre=h2;

//插入h2节点,并在插入后把upre移到h1节点h2=h2-&

next=h1;

//末尾补齐,在上面的情况,最终upre=h1

if(null==(h1-&

else{

h1=h1-&

h2-&

while(p!

=null&

q!

=null){

r-&

next=p-&

r=p;

p=p-&

next=q-&

r=q;

q=q-&

if(p){

next=p;

else{

*/

voidprintf_s(s*head){

s*p=head-&

=p){

printf(%c,p-&

x);

intmain(){

}return0;

s*head1,*head2;

//intlength1=0,length2=0;

head1=(s*)malloc(sizeof(s));

//为head1申请空间head2=(s*)malloc(sizeof(s));

printf(\n输入线性表一(遇0结束):

head1=s_create(head1);

printf(\n线性表一:

printf_s(head1);

printf(\n输入线性表二(遇0结束):

head2=s_create(head2);

printf(\n线性表二:

printf_s(head2);

printf(\n合并后的线性表为:

s_union(head1,head2);

5.约瑟夫问题:

设编号为1,2,…,n的n(n&

0)个人按顺时针方向围坐一圈,每人持有一正整数密码。

开始时任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。

如此下去,直到所有人全部出列为止。

令n最大值取30。

要求设计一个程序模拟此过程,求出出列编号序列(采用循环单链表结构)。

typedefstructnode

intnum,code;

structnode*next;

}linklist;

for(i=1;

n;

i++)//依次出列{s=(linklist*)malloc(sizeof(linklist));

//分配地址scanf(%d,&

s-&

code);

s-&

num=i+1;

intm=0,n=0,i=0,j=0;

linklist*head,*s,*r,*p;

//声明printf(\n请输入一个正整数作为第一个报数上限值m:

m);

printf(\n请输入一个正整数作为人数n(n最大30):

n);

printf(\n请输入%d个正整数作为每个人的密码:

\n,n);

head=(linklist*)malloc(sizeof(linklist));

//分配地址scanf(%d,&

head-&

head-&

num=1;

r=head;

}s-&

next=s;

r=r-&

next=head;

printf(\n输出出列序号:

//输出一次出列的序号for(j=n;

j&

0;

j--)

if(m==1)

printf(%d,r-&

num);

next=r-&

m=r-&

code;

m-1;

{r=r-&

p=r;

s=r-&

printf(%d,s-&

next=s-&

r=s-&

m=s-&

free(s);

释放s

四、总结

通过上面五个实验对线性表和链表的使用有了初步的了解。

通过程序实现了线性表的拆分,合并,复制,和单链表循环。

要注意的是线性表在使用之前都要先初始化,不用的空间最后要释放掉。

实验中还涉及到了时间复杂度的计算,提高时间复杂度可以缩短程序运行的时间。

实验二栈的基本操作

1、定义栈的结点类型。

2、掌握栈插入和删除元素在操作上的特点。

3、熟悉栈的基本操作。

4、加深对栈的理解,逐步培养解决实际问题的编程能力。

1、试编写算法,在顺序存储结构下实现堆栈的下列运算:

(1)initstk(s)。

初始化操作,建立一个空栈s;

stayusinitstack(sqstack&

s)个空栈

s.base=(selemtype*)malloc(stackinitsize*sizeof(selemtype));

if(!

s.base)exit(overflow);

分配失败

s.top=s.base;

s.stacksize=stackinitsize;

returnok;

}//initstack

//构造一//存储

(2)emptystk(s)。

判定栈是否为空;

statusstackempty(sqstacks)

if(s.top==s.base)returntrue;

elsereturnfalse;

}//stackempty

(3)pushstk(s)。

如果栈s不满,在栈顶插入x;

statuspush(sqstack&

s,selemtype)//插入元素e为新的栈顶元素

if(s.top-s.base&

=s.stacksize)//栈满,追加存储空间

s.base=(selemtype*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(selemtype));

//存储分配失败

s.top=s.base+s.stacksize;

s.stacksize+=stackincrement;

*s.top++=e;

}//push

(4)popstk(s)。

如果栈s不空,删除栈顶元素,并返回该元素的值;

statuspop(sqstack&

s,selemtype&

e)//若栈不空,则删除s的栈顶元素,用e返回其值,并返回ok;

否则返回error)

if(s.top==s.base)

returnerror;

e=*--s.top;

}//pop

(5)getstk(s)。

如果栈s不空,返回栈顶元素。

statusgettop(sqstacks,selemtype&

e)//若栈不空,则用e返回s的栈顶元素,并返回ok;

否则返回error

e=*(s.top-1);

}//gettop

2、试编写算法,实现数制转换:

对于输入的任意一个非负十进制

整数,打印输出与其等值的八进制数。

voidconversion()

{//对于输入的任意一个非负十进制整数,打印、出与其等值的八进制数

initstack(s);

//构造空栈

scanf(%d,n);

while(n)

push(s,n%8);

n=n/8;

while(!

stackempty(s))

pop(s,e);

printf(%d,e);

}//conversion

五、总结

本实验复习了课本上栈这一章的基本算法和内容。

栈的操作除了初始化,判断是否为空,插入,删除,返回值之外,还有清空栈,删除栈等等。

操作时要注意入栈和出栈的顺序。

实验三赫夫曼树

一、实验目的

1、熟悉二叉树的结点类型和二叉树的基本操作。

2、掌握建立赫夫曼树的操作。

3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。

二、实验环境

三、实验内容

完成huffman编码的译码过程。

即输入一个码串,请翻译成相应的字符串。

要求有编码过程和解码过程。

(1)构造哈夫曼树;

(2)求哈夫曼编码。

include&

iostream.h&

#include&

iomanip.h&

string.h&

//typedefinttelemtype;

constintuint_max=1000;

intweight;

intparent,lchild,rchild;

}htnode,*huffmantree;

typedefchar**huffmancode;

//-----------全局变量-----------------------

huffmantree

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

当前位置:首页 > 考试认证 > 其它考试

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

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