实验.docx
- 文档编号:5213120
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:50
- 大小:30.41KB
实验.docx
《实验.docx》由会员分享,可在线阅读,更多相关《实验.docx(50页珍藏版)》请在冰豆网上搜索。
实验
实验一:
链表
//程序名:
link.cpp
//程序功能:
带表头结点单向链表类的实现,包括单向链表的初始化,
//插入,删除,查找,输出表长及链表的元素的逆置操作的实现.
//link1.h带表头结点的单链表类的头文件
//link1.cpp带表头结点单链表类成员函数的实现文件
//链表.cpp包含有main函数的主程序
//程序名:
link1.h
//程序功能:
带表头结点的单链表类的头文件
//对应类实现文件:
link1.cpp
//对应主程序文件:
链表.cpp
typedefintDataType;//为本程序定义所使用的具体数据类型
structLinkNode{//定义单向链表的结点结构
DataTypedata;
structLinkNode*next;
};
classLink{//定义单向链表类
public:
Link(void);//定义构造函数,初始化为带表头结点的空链
voidHeadCreate(intn);//头插入建立单向链表
voidTailCreate(intn);//尾插入建立单向链表
intInsert(inti,DataTypex);//插入
intDelete(inti);//删除
intLocate(DataTypex);
intListSize(void);//输出表长(即表长元素个数)
voidReserse(void);//逆置链表元素
voidPrint();//输出整个单向链表中的数据
~Link(void);//析构函数
private:
structLinkNode*head;//链头结点
};
//程序名:
link1.cpp
//程序功能:
带表头结点单向链表类中成员函数的实现,包括单向链表的初始化,插入,删除,查找,输出表长及链表的元素的逆置操作的实现。
//对应类头文件:
link1.h
//对应主程序文件:
链表.cpp
#include
#include
#include"link1.h"
//构造函数//函数功能:
将链头指针初始化为带表头结点的空链
//函数参数:
无//参数返回值:
无
Link:
:
Link(void)
{
head=newLinkNode;
head->next=NULL;
}
//析构函数//函数功能:
将链表所有结点的空间释放(包括表头结点)//函数参数:
无
//参数返回值:
无
Link:
:
~Link(void)
{
structLinkNode*p;
while(head!
=NULL)
{
p=head;
head=head->next;
deletep;
}
}
//头插入建立链表函数//函数功能:
用头插入建立链表方法生成一个具有n个结点的链表
//函数参数:
n表示结点个数//参数返回值:
无
voidLink:
:
HeadCreate(intn)
{
structLinkNode*p,*h=NULL;
for(inti=0;i { p=newLinkNode; cout<<"请输入元素值: "; cin>>p->data; p->next=h; h=p; }; head->next=h; } //尾插入建立链表函数//函数功能: 用尾插入建立链表方法生成一个具有n个结点的链表 //函数参数: n表示结点个数//参数返回值: 无 voidLink: : TailCreate(intn) { structLinkNode*r,*p; r=head; for(inti=0;i { p=newLinkNode; cout<<"请输入元素值: "; cin>>p->data; p->next=NULL; r->next=p; r=p; }; } //插入函数 //函数功能: 将一个新值插入到某个位置的结点之后上,如果超过总结点个数,则做尾插入 //函数参数: i表示插入位置//x表示待插入的元素值 //参数返回值: 1: 表示插入成功0: 表示插入失败 intLink: : Insert(inti,DataTypex) { structLinkNode*t,*p,*q; if(i<=0) { cout<<"\n输入的位置错误\n"; return0; } intj=1; q=head; p=head->next;//q从表头结点开始走,p则从链表的第一结点开始 while(j =NULL) { q=p; p=p->next; j++; } t=newLinkNode; t->data=x; t->next=p; q->next=t; return1;} //删除函数//函数功能: 将链表中某个位置上的结点删除 //函数参数: i表示删除位置//参数返回值: 1: 表示删除成功 //0: 表示删除失败 intLink: : Delete(inti) { structLinkNode*q,*p; intj=1; p=head;q=head->next; if(i<=0){ cout<<"\n输入的位置错误\n"; return0;} while(j =NULL) { p=q; q=q->next; j++; } if(q==NULL) {cout<<"输入的位置超出范围\n"; return0;} p->next=q->next; deleteq; return1; } //按元素值进行查找的函数//函数功能: 按输入的元素值查找其对应的结点 //函数参数: x: 表示输入的元素值//参数返回值: 1: 表示查找成功0: 表示查找失败 intLink: : Locate(DataTypex) { structLinkNode*p; cout<<"\n请输入需要查找的元素值: \n"; cin>>x; p=head->next; while((p->data! =x)&&(p! =NULL)) {p=p->next;}; if(p==NULL)return0; elsereturn1; } //输出表长的函数//函数功能: 输出表长(即表中元素个数) //函数参数: 无//参数返回值: sum表示表长 intLink: : ListSize(void) { structLinkNode*p; p=head->next; intsum=0; while(p! =NULL) { sum++; p->next=p;} returnsum; } //逆置链表元素的函数//函数功能: 逆置链表元素 //函数参数: 无//参数返回值: 无 voidLink: : Reserse(void) { LinkNode*p=head->next;//不包括表头结点 structLinkNode*p1,*h=NULL; p1=p->next; while(p1! =NULL) { p->next=h; h=p; p=p1; p1=p->next; } p->next=h; head->next=NULL; head=newLinkNode;//创造一个头结点 head->next=p; } //输出链表中元素序列的函数 //函数功能: 从头到尾的将链表中的所有结点一个一个输出来(不包括表头结点) //函数参数: 无//参数返回值: 无 voidLink: : Print(void) { structLinkNode*p=head->next; cout<<"\n链表中的元素序列是: \n"; while(p! =NULL) { cout< p=p->next; } cout<<"\n"; } //程序名: 链表.cpp //程序功能: 带表头结点单向链表类应用主程序,包括单向链表的初始化,插入,删除,查找,输出表长及链表的元素的逆置操作的实现. //对应类头文件: link1.h //对应类实现文件: link1.cpp //主函数 //参数返回值: 无 #include #include #include"link1.h" voidmain() { Linklink2; intfinished=0; intchoice,n,pos; DataTypex; while(! finished) { cout<<"*********菜单*********\n"; cout<<"1: 链表初始化\n"; cout<<"2: 头插入建链\n"; cout<<"3: 尾插入建链\n"; cout<<"4: 插入\n"; cout<<"5: 删除\n"; cout<<"6: 查找\n"; cout<<"7: 输出链表中元素的个数(即表长)\n"; cout<<"8: 链表元素的逆置\n"; cout<<"9: 退出\n"; cout<<"请选择你要执行的选项(1-9): "; cin>>choice; switch(choice) { case1: case2: cout<<"\n请输入要建立的链表的元素的个数: ";//调用头插入建立链表 cin>>n; link2.HeadCreate(n); link2.Print(); break; case3: cout<<"\n请输入要建立的链表的元素的个数: ";//调用尾插入建立链表 cin>>n; link2.TailCreate(n); link2.Print(); break; case4: cout<<"\n插入前的元素序列是: "; link2.Print(); cout<<"\n请输入要插入的位置: "; cin>>pos; cout<<"\n请输入要插入的元素值: \n"; cin>>x; if(link2.Insert(pos,x)==1)//调用链表插入函数 link2.Print(); break; case5: cout<<"\n删除前的元素序列是: "; link2.Print(); cout<<"\n请输入要删除的位置: "; cin>>pos; if(link2.Delete(pos)==1)//调用链表删除函数 link2.Print(); break; case6: link2.Locate(x);//调用按元素值进行查找的函数 break; case7: link2.ListSize();//调用输出表长的函数 break; case8: link2.Reserse();//调用链表逆置函数 link2.Print(); break; case9: finished=1;//结束程序 break; }//switch }//while }//main 实验二: 栈 //程序名称: math.cpp //程序功能: 使用栈来实现: 输入一个十进制数n和对应的转换进制d,在屏幕上输出转换结果。 #include classstack{ public: int*vec; intms; inttop; public: stack(intsize) { vec=newint[size]; ms=size; top=-1; } ~stack(){delete[]vec;}//析构函数 voidpush(intx);//把元素x压入栈 intpop();//使栈顶元素出栈 intgettop();//取出栈顶元素 voidclear() {top=-1;} intisempty()//判断栈是否为空 { if(top=-1)return1; elsereturn0; } }; voidstack: : push(intx) { if(top==ms-1)cout<<"overflow"; else{ top++; vec[top]=x; } } intstack: : pop() { inttemp; if(top==-1)cout<<"underflow"; else{ temp=vec[top]; top--; returntemp; } } intmain() { stacks1=stack(100);//开辟一个容量为100的栈 intn,d;//定义两个数,分别为转换的数和转换进制 cout<<"请输入一个十进制数: "; cin>>n; cout<<"请输入你想转换的进制(2-9): "; cin>>d; cout<<""< intt;//定义一个临时参数 while(n>0)//建立一个循环,把每次的余数压入栈 { t=n%d; s1.push(t); n=n/d; } while(s1.top>-1){ cout< cout< return0; } //程序名: tree.cpp //程序功能: 选择二叉链式存储结构作为二叉树的存储结构, //实现二叉树的基本操作,包括二叉树的建立、输出、前序 //遍历、中序遍历、后序遍历、求树高、统计叶子总数等 //tree.h二叉树类的头文件 //tree.cpp二叉树类成员函数的实现文件,其对应的头文件是tree.h,主函数文件是main.h //main.cpp包含有main函数的主程序 //程序名: tree.h //程序功能: 二叉树类的头文件 //对应类实现文件: tree.cpp //对应主程序文件: main.cpp #include #include usingnamespacestd; typedefchardatatype;//定义date类型 structBTreeNode { datatypedata; structBtreeNode*lchild;//建立左孩子 structBtreeNode*rchild;//建立右孩子 }; classBLinkTree{ public: structBTreeNode*t; BTreeNode*head; intfirst; public: BLinkTree(void) { t=NULL; };//构造函数 BTreeNode*CreateBTree(intfirst);//建立二叉树 voidPreOrder(BTreeNode*t);//递归前序遍历 voidInOrder(BTreeNode*t);//递归中序遍历 voidPostOrder(BTreeNode*t);//递归后序遍历 voidFPreOrder(BTreeNode*t);//非递归前序遍历 voidFInOrder(BTreeNode*t);//非递归中序遍历 voidFPostOrder(BTreeNode*t);//非递归后序遍历 intBTreeDepth(BTreeNode*t,intfirst);//求树高 intLeaves(BTreeNode*t);//求叶子总数 voidGetBTree(BTreeNode*t,intfirst);//输出二叉树 }; //程序名: tree.cpp //程序功能: 二叉树类的成员函数的实现,实现二叉树的基本操作,包括二叉树的建立、输出、前序遍历、中序遍历、后序遍历、求树高、统计叶子总数等 //tree.h二叉树类的头文件 //tree.cpp二叉树类成员函数的实现文件,其对应的头文件是tree.h,主函数文件是main.h //main.cpp包含有main函数的主程序 //程序名: tree.cpp //程序功能: 二叉树类的成员函数的实现,实现二叉树的基本操作,包括二叉树的建立、输出、前序遍历、中序遍历、后序遍历、求树高、统计叶子总数等 //对应类头文件: tree.h //对应主程序文件: main.cpp #include #include #include"tree.h" usingnamespacestd; //建立二叉树//函数功能: 建立一棵二叉树 //函数参数: first//参数返回值: current表示二叉树结点 BTreeNode*BLinkTree: : CreateBTree(intfirst) { charch; BTreeNode*current; cin>>ch; if(ch=='.') { current=NULL; } else { current=newBTreeNode; current->data=ch; if(first) { head=current; first=0; } current->lchild=CreateBTree(first); current->rchild=CreateBTree(first); } returncurrent; } //二叉树的前序遍历//函数功能: 对二叉树进行前序遍历 //函数参数: intfirst//参数返回值: 无 voidBLinkTree: : PreOrder(BTreeNode*t) { if(t! =NULL) { cout< PreOrder(t->lchild); PreOrder(t->rchild); } } //二叉树的非递归前序遍历//函数功能: 实现前序遍历非递归算法的实现 //函数参数: 无//参数返回值: 无 voidBLinkTree: : FPreOrder(BTreeNode*t) { stack while((! s.empty())||(t! =NULL)) { while(t! =NULL) { cout< s.push(t); t=t->lchild; } if(! s.empty()) { t=s.top(); s.pop(); t=t->rchild; } } } //二叉树的中序遍历//函数功能: 对二叉树进行中序遍历 //函数参数intfirst//参数返回值: 无 voidBLinkTree: : InOrder(BTreeNode*t) { if(t! =NULL) { InOrder(t->lchild); cout< InOrder(t->rchild); } } //二叉树的非递归中序遍历//函数功能: 实现中序遍历非递归算法的实现 //函数参数: 无//参数返回值: 无 voidBLinkTree: : FInOrder(BTreeNode*t) { stack while((! s.empty())||(t! =NULL)) { while(t! =NULL) { s.push(t); t=t->lchild; } if(! s.empty()) { t=s.top(); s.pop(); cout< t=t->rchild; } } } //二叉树的后序遍历//函数功能: 对二叉树进行后序遍历 //函数参数: intfirst//参数返回值: 无 voidBLinkTree: : PostOrder(BTreeNode*t) { if(t! =NULL) { PostOrder(t->lchild); PostOrder(t->rchild); cout< } } //二叉树的非递归后序遍历//函数功能: 实现后序遍历非递归算法的实现 //函数参数: 无//参数返回值: 无 voidBLinkTree: : FPostOrder(BTreeNode*t) { intflag; stack stack while((! s1.empty())||(t! =NULL)) { while(t! =NULL) { s1.push(t); s2.push(0); t=t->lchild;//左孩子 } if(! s1.empty()) { t=s1.top(); s1.pop(); flag=s2.top(); s2.pop(); if(flag==1) { cout< t=NULL; } else { s1.push(t); s2.push (1); t=t->rchild; } } } } //求树高//函数功能: 求二叉树的树高 //函数参数: 表示访问的结点intfirst//参数返回值: CDepth树的深度 intBLinkTree: : BTreeDepth(BTreeNode*t,intfirst) { intCDepth,LDepth,RDepth; structBTreeNode*current; if(first==1) { current=head; first=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)