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