数据结构实验报告Word格式文档下载.docx
《数据结构实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
//初始化线性表
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