山东科技大学泰山科技学院.docx
- 文档编号:6342869
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:136.90KB
山东科技大学泰山科技学院.docx
《山东科技大学泰山科技学院.docx》由会员分享,可在线阅读,更多相关《山东科技大学泰山科技学院.docx(18页珍藏版)》请在冰豆网上搜索。
山东科技大学泰山科技学院
一、设计题目…………………………………………………………2
二、设计目的…………………………………………………………2
三、数据结构及算法设计……………………………………………2
四、源代码……………………………………………………………2
五、运行结果分析……………………………………………………14
六、实训总结…………………………………………………………17
七、参考资料…………………………………………………………18
一、设计题目
课程设计题一:
链表操作
利用链表的插入运算建立线性链表,然后实现链表的查找、插入、删除、计数、输出、排序、逆置等运算(查找、插入、删除、查找、计数、输出、排序、逆置要单独写成函数),并能在屏幕上输出操作前后的结果。
课程设计题二:
二叉树的基本操作
1.对任意给定的二叉树(顶点数自定)建立它的二叉链表存储结构,并实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。
2.求二叉树高度、结点数、度为1的结点数和叶子结点数。
二、设计目的
通过课程实训掌握线性链表的建立及线性链表的基本操作,进一步了解链表时如何进行创建,在创建时是运用什么思想,了解输出链表、查找、插入、删除、计数、排序等基本操作的算法的实质及运用。
掌握二叉树的概念和性质,掌握任意二叉树存储结构及任意二叉树的基本操作,通过设计二叉树的遍历,进一步了解二叉树的遍历,并进一步了解递归的实质,并且计算了结点数,叶子数,更加了解其算法的实质。
三、数据结构及算法设计
链表的各种功能,例如创建,输出,查找,插入,删除,计数,排序;
以上这些功能都是先建立子函数,然后再主函数main中进行调用,而不是直接在主函数中生成,调用过程中主要的就是实参,形参之间的传递,同时运用case语句构造主菜单,使可以对各种方法进行选择。
二叉树的各种功能,例如创建,先序,中序,后序三种遍历,高度,结点数,叶子结点数等.
对于二叉树的遍历,是运用的递归的思想,求高度,结点数,叶子结点数等方法和链表一样,都是先建立子函数,再进行调用。
四、源代码
对于链表
#include
#include
#defineERROR0
#defineOK1
typedefintElemType;
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
structLNode*L;
intx;
voidCreat_L(LinkList&L)//建立单链表
{LinkListp,q;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=L;
printf("建立单链表,输入0则退出.\n");
scanf("%d",&x);
while(x!
=0)
{
q=(LinkList)malloc(sizeof(LNode));
q->data=x;
q->next=NULL;
p->next=q;
p=q;
scanf("%d",&x);
}
}
voidCount_L(LinkList&L,intn)//计数
{LinkListp;
n=0;
p=L->next;
while(p)
{n++;p=p->next;}
printf("数据元素个数:
%d",n);
}
voidPrint_L(LinkList&L)//输出
{LinkListp;
p=L->next;
printf("创建的链表为:
\n");
if(L!
=NULL)
do{printf("%d",p->data);
p=p->next;
}while(p);
}
voidGetelem_L(LinkList&L)//查找单链表中的元素
{LinkListp;
inti=1;
printf("输入一个要查找的数据:
\n");
scanf("%d",&x);
p=L->next;
while(p!
=NULL)
{
if(p->data==x)
{printf("该元素位置:
%d",i);break;}
else
{
p=p->next;
i++;
if(p==NULL){printf("未找到元素");}
}
}
}
voidInsert_L(LinkList&L,inti,inte)//在单链表中插入新元素
{LinkListp,q;
intj;
printf("输入要插入的数据位置和数据:
\n");
scanf("%d%d",&i,&e);
p=L;
j=0;
while(p&&j { p=p->next; ++j; } if(! p||j>i-1) { printf("输入位置有误\n"); } else { q=(LinkList)malloc(sizeof(LNode)); q->data=e; q->next=p->next; p->next=q; } p=L; while(p->next! =NULL) { printf("%d",p->next->data); p=p->next; } } voidDelete_L(LinkList&L,inti,inte)//删除元素 { LinkListp,q; intj=0; p=L; printf("输入要删除第几个数据: \n"); scanf("%d",&i); while(p->next&&j { p=p->next; ++j; } if(! (p->next)||j>i-1) { printf("输入有误! \n"); } else { q=p->next; p->next=q->next; e=q->data; } p=L; while(p->next! =NULL) { printf("%d",p->next->data); p=p->next; } } voidSort_L(LinkList&L)//冒泡排序 { LinkListp,q; intt; for(p=L->next;p! =NULL;p=p->next)//p指向第一个结点 { //q为下一个结点(第二个结点) for(q=p;q;q=q->next)//比较第一和第二个元素大小 { if(p->data>q->data) { t=p->data; p->data=q->data; q->data=t; } } } p=L->next; while(p) { printf("%d",p->data); p=p->next; } } voidReverse_L(LinkList&L)//逆置 {LinkLists,p,q; p=L->next;q=p->next;s=q->next;p->next=NULL; while(s) {q->next=p; p=q; q=s; if(s->next! =NULL)//s后面还有结点,则逆置继续 s=s->next; else break; } s->next=p; L->next=s;//头结点指向最后一个结点 p=L->next; while(p! =NULL) { printf("%d",p->data); p=p->next; } } voidmain()//主程序 {LinkLists; intmenu; menu=1; inti,e,n; while(menu! =0) {printf("..............\n"); printf("1.建立链表\n"); printf("2.输出\n"); printf("3.查找\n"); printf("4.插入\n"); printf("5.删除\n"); printf("6.计数\n"); printf("7.排序\n"); printf("8.逆置\n"); printf("0.退出\n"); printf("\n"); printf("select[0—8]: "); scanf("%d",&menu); switch(menu) { case1: Creat_L(s);break;//建立链表 case2: Print_L(s);break;//输出 case3: Getelem_L(s);break;//查找 case4: Insert_L(s,i,e);break;//插入 case5: Delete_L(s,i,e);break;//删除 case6: Count_L(s,n);break;//计数 case7: Sort_L(s);break;//排序 case8: Reverse_L(s);break;//逆置 case0: menu=0;break; default: printf("Error! \n"); } } } 对于二叉树 #include #include #include typedefstructBiTNode/*定义结点*/ { chardata; structBiTNode*lchild,*rchild; }BiTNode,*BiTree; BiTreeCreateBiTree()/*用先序递归建树*/ { charp; BiTreeT; scanf("%c",&p); if(p=='')T=NULL; else { T=(BiTNode*)malloc(sizeof(BiTNode));/*开辟存储空间*/ T->data=p; T->lchild=CreateBiTree(); T->rchild=CreateBiTree(); } return(T); } /*先序遍历*/ voidPreOrderTraverse(BiTreeT) { if(T) { printf("%c",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } /*中序遍历*/ voidInOrderTraverse(BiTreeT) { if(T) { InOrderTraverse(T->lchild); printf("%c",T->data); InOrderTraverse(T->rchild); } } /*后序遍历*/ voidPostOrderTraverse(BiTreeT) { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c",T->data); } } /*二叉树的深度*/ intTreeDepth(BiTreeT) { inthl,hr,h,max; if(T==NULL) return(0); else { hl=TreeDepth(T->lchild); hr=TreeDepth(T->rchild); h=max(hl,hr)+1; return(h); } } /*二叉树的结点数*/ intNodeCount(BiTreeT) { intnum1=0,num2=0; if(T==NULL) { return(0); } if(T->lchild! =NULL) { num1=NodeCount(T->lchild); } if(T->rchild! =NULL) { num2=NodeCount(T->rchild); } return(num1+num2+1); } /*度为1的结点数*/ intDeg1NodCount(BiTreeT) { intdl,dr,count; if(T==NULL) return(count=0); if(T->lchild! =NULL||T->rchild! =NULL) return(count=1); dl=Deg1NodCount(T->lchild); dr=Deg1NodCount(T->rchild); return(count=dl+dr); count++; } /*叶子结点个数*/ intLeafCount(BiTreeT) { intnum1,num2; if(T==NULL) return(0); if(T->lchild==NULL&&T->rchild==NULL) return (1); num1=LeafCount(T->lchild); num2=LeafCount(T->rchild); return(num2+num1); } voidmain()/*主函数*/ { BiTreeT; intheight,numN,numD,numL; printf("先序建立二叉链表: \n"); T=CreateBiTree(); printf("\n先序遍历输出: \n"); PreOrderTraverse(T); printf("\n中序遍历输出: \n"); InOrderTraverse(T); printf("\n后序遍历输出: \n"); PostOrderTraverse(T); height=TreeDepth(T); printf("\n二叉树的深度: %d",height); numN=NodeCount(T); printf("\n结点数: %d",numN); numD=Deg1NodCount(T); printf("\n度为1的结点数: %d",numD); numL=LeafCount(T); printf("\n叶子结点数: %d",numL); } 四、运行结果分析 <一>.链表 链表操作程序实现了链表的八个基本功能: 当运行程序时,屏幕会出现一个选择菜单,如图: (1).链表的创建 当选择1便会出现: 输入数据,用空格分开,并以0为数据结尾。 如图: 然后随机输入一串数据,例如6831290,回车然后便会出现生成的链表683129。 如图: (2)链表的输出操作 (3)链表的查找 选择3,输入查找的数据为6,显示该元素位置为1,如图: (4)链表的插入 插入的数据位置为5,数据为5,如图: (5)删除链表中数据 选5,删除第二个数据,如图: (6)计数操作 选6,数据元素个数为6个,如图: (7)排序 选7,冒泡排序,如图: (8)逆置 (9)退出 按0则退出,至此整个链表的各种功能运算完成。 <二>.二叉树 对于二叉树,共实现了先,中,后序三种遍历及结点数,叶子数,深度等。 (1).创建二叉树 当运行程序时,会出现按照先序遍历创建二叉树,例如输入ABC。 如图: (2)先序、中序、后序遍历 (3)二叉树的深度、结点数、度为1的结点数、叶子结点数 二叉树的各项操作完成。 六、实训总结 通过两周的数据结构实训,进一步加深了对数据结构整体的理解,明白了链表的各种操作的实质,并且对老师课上讲的各种算法进行了实际的运用,更加掌握了各种算法的使用方法,例如链表的创建,查找,插入,二叉树的遍历等算法。 而且,通过这一次的实训,不仅加深了对数据结构知识的了解,更复习了以前学习过的C语言,重新复习了排序等经典算法,而且对于以前不懂得地方,例如主函数与子函数之间的实参,形参之间的传递,并且在二叉树的遍历部分复习了递归算法的使用。 这一周的实训,我深刻的领悟到,遇到困难,一定不要畏惧,自己多动脑思考思考,所联系自己以前学过的知识,便会有很大的进展,还有就是,往往一些错误都不是编写的逻辑错误,而是一些小错误点,例如忘记另外一部分的大括号,忘记分号等等,这提醒自己以后要细心,不要错在一些小问题上。 总之,这一次的实训让我受益匪浅。 七.参考资料 数据结构: C语言版/严蔚敏,吴伟民编著清华大学出版社 C语言程序设计谭浩强著清华大学出版社 (注: 可编辑下载,若有不当之处,请指正,谢谢! )
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 科技大学 泰山 科技学院
![提示](https://static.bdocx.com/images/bang_tan.gif)