数据结构实训报告111222Word格式文档下载.docx
- 文档编号:22535513
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:30
- 大小:143.15KB
数据结构实训报告111222Word格式文档下载.docx
《数据结构实训报告111222Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实训报告111222Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
next;
//插入到表头;
L->
next=p;
}
returnOK;
}//InputList_L//创建链表,
(2),线性链表查找的算法:
StatusGetElem_L(LinkListL,inti,ElemType&
e)//查找,L为带头结点的单链表的头指
针,当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR;
intj;
p=L->
//初始化,p指向第一个结点,j为计数器;
j=1;
while(p&
&
j<
i)//顺时针向后查找,直到p指向第i个元素或p为空
{
p=p->
++j;
}
if(!
p||j>
i)
{
printf("
查找结果错误,请重新查找!
\n"
);
returnERROR;
}
e=p->
data;
//取第i个元素,赋给e;
printf("
第%d个元素为:
e=%d\n"
j,e);
returnOK;
}//GetElem_L查找操作
(3)线性操作插入操作:
StatusListInsert_L(LinkList&
L,inti,ElemTypee)//在带头结点的单链线性表L中第i个位置之前插入元素e;
LinkListp,s;
//类型
p=L;
intj;
j=0;
while(p&
j<
i-1)//寻找第i-1个结点
{
p=p->
++j;
if(!
i-1)
插入的位置不正确,请重新插入!
s=(LinkList)malloc(sizeof(LNode));
//生成新结点
s->
data=e;
//s的数据存放在e中,
next=p->
//将s的指针指向p的后继,
next=s;
//p的指针指向s;
请输入插入的元素数值:
"
scanf("
e);
在线性链表L中第%d个元素前插入e=%d\n"
i,e);
}//ListInsert_L插入操作
(4),线性链表删除操作:
StatusListDelete_L(LinkList&
L,inti,ElemType&
e)
{//在带头结点的单链表L中,删除第i个元素,并由e返回其值;
LinkListp,q;
intj=0;
while(p->
next&
i-1)//寻找第i个结点,并令p指向其前驱;
p=p->
(p->
next||j>
i-1))
删除的位置不合理,请重新输入!
//returnERROR;
q=p->
//q指向p的后继
next=q->
//p的指针指向q的后继(即删除q)
e=q->
//q保存到e
free(q);
//释放结点;
删除线性链表中第%d个元素e=%d\n"
//ListDelete_L删除操作
(5),线性链表计数操作:
StatusCountList_L(LinkList&
L)//计数
LinkListp;
//p指向L的后继(ai)
while(p->
next!
=NULL)
p=p->
//顺时针向后查找;
线性链表%d个元素\n"
j);
}//CountList_L计数操作
(6)线性链表排序操作:
StatusListSort_L(LinkList&
L)//排序
ElemTypetemp;
for(p=L->
p!
=NULL;
p=p->
next)
for(q=p->
q!
q=q->
if(p->
data>
q->
data)
{
temp=p->
p->
data=q->
q->
data=temp;
}
}
}//ListSort_L排序操作
(7)逆值操作:
StatusNizhiList_L(LinkList&
L)//逆值
LinkListp,q;
p=L->
q=p->
next=NULL;
p=q;
while(p!
q=q->
next=L->
next=p;
}//NiZhi_L逆值操作
(8)输出操作:
StatusOutputList_L(LinkList&
L)//输出链表
p=L->
输出链表为:
while(p!
printf("
%4d"
p->
}//OutputList_L输出操作
四,程序源代码:
程序的代码区域分为
(1)包含的头文件
(2)宏定义#define定义一些标识符号
(3)typedef定义ElemType类型
(4)typedef定义数据结构的类型
(5)函数的申明;
(6)main()函数
(7)函数的定义。
#include<
stdio.h>
//文件包含
stdlib.h>
#defineOK1//宏定义
#defineERROR0
#defineNULL0
typedefintStatus;
//类型定义,status状态
typedefintElemType;
//数据元素类型定义
typedefstructLNode//LNode链表结点
ElemTypedata;
//数据元素类型
structLNode*next;
//指向结点地址的指针
}LNode,*LinkList;
//LNode为结构体类型,后一个为指向LNode的结构体类型的指针;
StatusInputList_L(LinkList&
L,intn)//头插法建表,逆位序输入n个元素的值,建立带表头结点的单链线性表L;
inti;
//LinkList类型变量;
请输入%d个线性链表元素:
n);
}//InputList_L
StatusGetElem_L(LinkListL,inti,ElemType&
e)//查找,L为带头结点的单链表的头指针,
{//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR;
//LinkList变量
{
}//ListInsert_L
//ListDelete_L
}//CountList_L
}//ListSort_L
}//OutputList_L
voidmenu()
\n$$$$$$$$$$$程序主菜单$$$$$$$$$$$\n"
\n*************1创建链表***********\n"
\n*************2查找元素***********\n"
\n*************3插入元素***********\n"
\n*************4删除元素***********\n"
\n*************5元素计数***********\n"
\n*************6元素排序***********\n"
\n*************7元素输出***********\n"
\n*************8元素逆值***********\n"
\n*************9退出程序***********\n"
voidmain()
inti,n,e,m;
LinkListL;
menu();
while(m)
请输入要执行的功能序号:
scanf("
m);
switch(m)
{
case1:
请输入要创建链表的长度:
n);
InputList_L(L,n);
//创建链表
OutputList_L(L);
//输出
break;
case2:
请输入需要查找的元素序列数:
i);
GetElem_L(L,i,e);
//线性链表已存在,用e返回L中第i个元素的值
case3:
请输入插入元素的位置:
ListInsert_L(L,i,e);
//线性链表已存在,用e返回L中第i个元素的值
case4:
请输入删除元素的位置:
"
ListDelete_L(L,i,e);
case5:
单链表元素个数为:
CountList_L(L);
case6:
排序后的"
ListSort_L(L);
case7:
OutputList_L(L);
break;
case8:
逆置后的"
NizhiList_L(L);
case9:
exit(0);
五,运行结果分析:
六,实训总结:
通过这次对线性链表的实训,知道了线性链表的有关算法,与C语言结合写出程序,在写程序的时候,遇到了很多的错误,最后改正了错误,程序才运行了出来,以前C语言就学得不好,现在发现很难再提高了,以后还得继续努力。
数据结构实训课程设计项目二:
二叉树的基本操作:
一、设计目的
1.掌握二叉树的概念和性质
2.掌握任意二叉树存储结构。
3.掌握任意二叉树的基本操作。
二、设计内容和要求
1.对任意给定的二叉树(顶点数自定)建立它的二叉链表存储结构,并实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。
2.求二叉树高度、结点数、度为1的结点数和叶子结点数。
三,二叉树算法设计及分析:
1,二叉树的创建:
StatusCreateBiTree(BiTree&
T)//按先序输入二叉树中结点的值(一个字符),空格字符表示空树
charch;
//定义字符型;
%c"
ch);
if(ch=='
'
)
T=NULL;
else{
//if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T=(BiTNode*)malloc(sizeof(BiTNode));
//开辟空间,生成新结点;
T->
data=ch;
//生成根结点
CreateBiTree(T->
lchild);
//构造左子树
CreateBiTree(T->
rchild);
//构造右子树
2,二叉树先序遍历:
StatusPreOrderTraverse(BiTreeT)//先序遍历二叉树
if(T)
{printf("
T->
//输出根节点
PreOrderTraverse(T->
//递归调用
}//PreOrderTraverse
3,二叉树中序遍历:
StatusInOrderTraverse(BiTreeT)//中序遍历二叉树
InOrderTraverse(T->
//递归调用
4,二叉树后续遍历:
StatusPostOrderTraverse(BiTreeT)//后序遍历二叉树
PostOrderTraverse(T->
}//PostOrderTraverse
5,求二叉树叶子结点的个数:
intLeaves(BiTreeT)//求叶子结点的个数
intnum1,num2;
if(T==NULL)
return(0);
if(T->
lchild==NULL&
rchild==NULL)//左右子树均为空
return
(1);
num1=Leaves(T->
num2=Leaves(T->
return(num1+num2);
}//Leaves
6,求二叉树的深度:
StatusBiTreedepth(BiTreeT,intlevel,int&
depth)//求树的深度
{//level为T所指结点所在层次,其初值为1//depth为当前求得的最大层次,其初值为0。
if(T)//depth为当前求得的最大层次,其初值为0
{
if(level>
depth)depth=level;
//
BiTreedepth(T->
lchild,level+1,depth);
rchild,level+1,depth);
returndepth;
}//BiTreedepth
7,求二叉树的结点数;
intBTNodeCount(BiTreeT)//求二叉树的结点数;
intm=0,b=0;
//初始化
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告 111222