数据结构实验答案Word文件下载.docx
- 文档编号:20319537
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:47
- 大小:232.24KB
数据结构实验答案Word文件下载.docx
《数据结构实验答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验答案Word文件下载.docx(47页珍藏版)》请在冰豆网上搜索。
intlast;
/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/
}SeqList;
#include"
common.h"
seqlist.h"
voidpx(SeqList*A,intj);
voidmain()
{SeqList*l;
intp,q,r;
inti;
l=(SeqList*)malloc(sizeof(SeqList));
printf("
请输入线性表的长度:
"
);
scanf("
%d"
&
r);
l->
last=r-1;
请输入线性表的各元素值:
\n"
for(i=0;
i<
=l->
last;
i++)
{
scanf("
l->
elem[i]);
}
px(l,i);
请输入要插入的值:
i++;
px(l,i);
last++;
{printf("
%d"
l->
}
voidpx(SeqList*A,intj)
{inti,temp,k;
i<
j;
i++)
{for(k=0;
k<
j-1;
k++)
{if(A->
elem[i]<
A->
elem[k])
{temp=A->
elem[i];
A->
elem[i]=A->
elem[k];
elem[k]=temp;
}}
2.
intDelList(SeqList*L,inti,SeqList*e,intj)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。
i的合法取值为1≤i≤L.last+1*/
{intk,a,b,c;
if((i<
1)||(i>
L->
last+2))
{printf("
删除位置不合法!
return(ERROR);
if(j>
last-i)
for(b=0,a=i-1;
a<
i+j-1;
b++,a++)
{e->
elem[b]=L->
elem[a];
}
e->
last=b;
/*将删除的元素存放到e所指向的变量中*/
for(k=i;
k+j-1<
=L->
{L->
elem[k-1]=L->
elem[k+j-1];
}/*将后面的元素依次前移*/
L->
last=L->
last-j;
printf("
删除的元素值为:
for(c=0;
c<
b;
c++)
{printf("
e->
elem[c]);
return(OK);
{SeqList*l,*q;
intp,r;
inti,j,m;
l=(SeqList*)malloc(sizeof(SeqList));
q=(SeqList*)malloc(sizeof(SeqList));
{scanf("
for(i=0;
=r-1;
{printf("
请输入要删除的元素位置(位置+个数):
%d%d"
p,&
j);
m=DelList(l,p,q,j);
if(m==0)
无法删除"
exit(0);
elseif(m==1)
线性表内余下元素为:
=r-j-1;
voidpx(SeqList*A,intj)
{inti,temp,k;
{for(k=0;
printf("
排序完成!
3.#include<
string.h>
/*#defineElemTypechar*/
typedefstructNode/*结点类型定义*/
{intnum;
charname[10];
intage;
structNode*next;
}Node,*LinkList;
/*LinkList为结构指针类型*/
LinkListCreateFromTail()
/*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/
{LinkListL;
Node*r,*s;
inta;
charb[10];
intc;
intflag=1;
/*设置一个标志,初值为1,当输入"
-1"
时,flag为0,建表结束*/
L=(Node*)malloc(sizeof(Node));
next=NULL;
/*为头结点分配存储空间,建立空的单链表L*/
r=L;
/*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
/*循环输入表中元素值,将建立新结点s插入表尾*/
输入学生的信息:
学号姓名年龄\n"
while(flag)
a);
if(a==-1)
flag=0;
else
{scanf("
%s%d"
b,&
c);
s=(Node*)malloc(sizeof(Node));
s->
num=a;
strcpy(s->
name,b);
age=c;
r->
next=s;
r=s;
}
}r->
returnL;
voidReverseList(LinkListL)
{Node*p,*q;
p=L->
next;
while(p!
=NULL)
{q=p->
/*q指针保留p->
next得值*/
p->
next=L->
L->
next=p;
/*将p结点头插入到单链表L中*/
p=q;
/*p指向下一个要插入的结点*/
}
{LinkListl;
Node*p;
请输入链表数据,以-1结束!
l=CreateFromTail();
输入的单链表为:
p=l->
%d%s%d\n"
p->
num,p->
name,p->
age);
p=p->
ReverseList(l);
逆置后的单链表为:
结
果
分
析
1.实验结果:
实验分析:
我做了三次实验,分别插入数列前,中,后的数字,实验证明代码没有错误,能正常运行、排序、输出。
存在的问题:
我不明白为什么我写的是降序排序,计算机运行后就是升序排序了。
希望老师能帮我修改一下。
2.实验结果
我通过三次实验(正常删除、删除个数超出、删除位置不正确)证明代码的正确性。
改代码可实现派讯,删除,读取删除的内容和输出的功能。
4.实验结果
我做了两次测试,测试证明代码没有错误。
教
师
评
阅
教师签名:
年月日
2
实验二栈和队列基本操作
2013年05月13日
1.利用栈的运算实现数制转换—--分别将十进制转换为八进制和十六进制。
2.编程判断一个字符序列是否是回文序列。
输入形式为“*****#*****”,*为输入的字符,#为两序列的分隔符。
3.实现链队列管理---输入一个整数,如果是奇数就入队,如果是偶数就让队头出队,直到输入0就结束,最后输出队列的所有元素。
(代码)
1.
#include<
windows.h>
#defineNULL0
typedefstructNumber
{intnum;
structNumber*next;
}Num;
voidConversion(intiNum,inti);
//转换数字,进栈,iNum为待转换的数,i代表进制
voidPop(structNumber*top,inti);
//显示结果,出栈,top为栈顶指针,i代表进制
{intm=8,n=2,j=16;
intiNum;
charchoose,c;
数制转换\n\n"
请输入一个十进制数:
"
iNum);
转换后结果为:
\n八进制:
Conversion(iNum,m);
十六进制:
Conversion(iNum,j);
\n转换完毕!
voidConversion(intiNum,inti)//进栈
{structNumber*top=NULL,*NewP;
while(iNum!
=0)
NewP=(structNumber*)malloc(sizeof(structNumber));
if(top==NULL)
{NewP->
top=NewP;
top->
num=iNum%i;
else
next=top;
iNum=iNum/i;
}//while
Pop(top,i);
voidPop(structNumber*top,inti)//出栈
{if(top==NULL)
栈空!
{charcell[]="
0123456789ABCDEF"
;
structNumber*temp,*q;
switch(i)
{case8:
//输出八进制
case16:
//输出十六进制
{temp=top;
while(temp!
%c"
cell[temp->
num]);
q=temp;
temp=temp->
free(q);
break;
}//switch
}//else
2.
conio.h>
inthuiWen(constchar*p);
intmain()
{chartest[225];
请输入序列:
gets(test);
if(huiWen(test))
是回文!
else{printf("
不是回文!
getch();
return0;
inthuiWen(constchar*p)
{inti=0,n=strlen(p);
while(p[i]==p[n-i-1]&
&
n-i-1)//只要相等且还未相遇则继续循环
{i++;
return((i<
n-i-1)?
0:
1);
}//若i<
n-i-1表示中途遇到不相等的字符而退出循环
3.
#defineMAXSIZE50/*队列的最大长度*/
{intelement[MAXSIZE];
/*队列的元素空间*/
intfront;
/*头指针指示器*/
intrear;
/*尾指针指示器*/
}SeqQueue;
/*初始化操作*/
voidInitQueue(SeqQueue*Q)
{/*将*Q初始化为一个空的循环队列*/
Q->
front=Q->
rear=0;
/*入队操作*/
intEnterQueue(SeqQueue*Q,intx)
{
/*将元素x入队*/
if((Q->
rear+1)%MAXSIZE==Q->
front)/*队列已经满了*/
return(FALSE);
element[Q->
rear]=x;
rear=(Q->
rear+1)%MAXSIZE;
/*重新设置队尾指针*/
return(TRUE);
/*操作成功*/
/*出队操作*/
intDeleteQueue(SeqQueue*Q)
{/*删除队列的队头元素,用x返回其值*/
if(Q->
front==Q->
rear)/*队列为空*/
front=(Q->
front+1)%MAXSIZE;
/*重新设置队头指针*/
intoutput(SeqQueue*Q)
{intx,i=Q->
front;
/*提取队列的队头元素,用x返回其值*/
while(i!
=Q->
rear)
{x=Q->
element[i];
x);
i++;
seqqueue1.h"
{intc;
SeqQueueQ;
InitQueue(&
Q);
请输入整数:
while(c!
{if(c%2==1)
EnterQueue(&
Q,c);
DeleteQueue(&
scanf("
output(&
(每道题的运行结果及分析总结)
我测视了两组数据,均正确,证明我的代码没有错误。
该代码可实现将一个十进制数转换为八进制和十六进制的数。
我做了四次实验有不同长度的回文序列、长度相同的非回文序列和长度不同的非回文序列。
实验正经代码正确。
测试了3组不同的数据,均能满足实验要求,证明代码是正确的。
3
实验三二叉树基本操作
2013年05月27日
1.统计一棵二叉树中每种类型结点数(度为0、1、2的结点数)。
2.分别输入一棵有6个结点和8个结点的二叉树,编程序输出先序、中序和后序的遍历结果。
3.哈夫曼树及哈夫曼编码。
1.#include<
typedefcharDataType;
intLeafCount,onecount,twocount;
typedefstructNode
{DataTypedata;
structNode*LChild;
structNode*RChild;
}BiTNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{charch;
ch=getchar();
if(ch=='
.'
)*bt=NULL;
else
{*bt=(BiTree)malloc(sizeof(BiTNode));
//生成一个新结点
(*bt)->
data=ch;
CreateBiTree(&
((*bt)->
LChild));
//生成左子树
RChild));
//生成右子树
voidleaf_a(BiTreeroot)
{if(root!
{leaf_a(root->
LChild);
leaf_a(root->
RChild);
if(root->
LChild==NULL&
root->
RChild==NULL)
LeafCount++;
elseif(((root->
LChild!
=NULL)&
(root->
RChild==NULL))||((root->
LChild==NULL)&
RChild!
=NULL)))
onecount++;
elseif((root->
=NULL))
twocount++;
#include"
head.h"
{BiTreeT;
inttreeleaf;
LeafCount=0;
按扩展先序遍历序列建立二叉树,请输入序列:
T);
leaf_a(T);
求得的叶子结点数目为:
%d\n"
LeafCount);
求得的度为1的结点数目为:
onecount);
求得的度为2的结点数目为:
twocount);
2.#include<
((
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 答案