计算机软件技术基础.docx
- 文档编号:28340386
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:28
- 大小:20.61KB
计算机软件技术基础.docx
《计算机软件技术基础.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础.docx(28页珍藏版)》请在冰豆网上搜索。
计算机软件技术基础
计算机软件技术基础
实验一:
一:
实验目的:
1:
熟悉单链表的一些操作
2:
掌握采用链表结构实现一元多项式的相加的算法
二:
实验任务:
1:
分别建立两个单链表
2:
对单链表进行插入、删除操作
3:
将两个一元多项式相加、输出结果
三:
实验方案:
算法基本原理
四:
程序清单:
#include
typedefstructpolynode
{
intexp,coef;
structpolynode*next;
}node;
classlinklist
{
node*head,*p;
intj;
public:
linklist(){head=newnode;head->next=NULL;};
linklist(inta[],intb[],intn);
voidAdd(linklist&A,linklist&B);
voidPrintlinklist(inta[],intb[],intn);
voidInsert(inti,intitem1,intitem2);
intDelete(inti);
};
linklist:
:
linklist(inta[],intb[],intn)
{
head=newnode;
p=head;
for(inti=0;i { p->exp=a[i]; p->coef=b[i]; p->next=newnode; p=p->next; } p->next=NULL; } voidlinklist: : Printlinklist(inta[],intb[],intn) { for(inti=0;i { cout< } cout< } voidlinklist: : Add(linklist&A,linklist&B) { node*p,*q,*u,*pre; intx; p=A.head->next; q=B.head->next; pre=A.head; while((p! =NULL)&&(q! =NULL)) { if(p->exp { pre=p; p=p->next; } elseif(p->exp==q->exp) { x=p->coef+q->coef; if(x! =0) { p->coef=x;pre=p; } else{ pre->next=p->next; deletep; p=pre->next; u=q; q=q->next; deleteu; } } else { u=q->next; q->next=p; pre->next=q; pre=q; q=u; } if(p=NULL) pre->next=q; deleteB.head; } } voidlinklist: : Insert(inti,intitem1,intitem2) { intj=0; node*s; p=head; while(p&&j { p=p->next; j++; } if(p=NULL) cout<<"插入位置非法"< else{ s=newnode; s->exp=item1; s->coef=item2; s->next=p->next; p->next=s; } } intlinklist: : Delete(inti) { node*q; p=head; j=0; while(p&&j { p=p->next; j++; } if(! p||! p->next) cout<<"删除位置非法"< else{ q=p->next; p->next=q->next; deleteq; return1; } } voidmain() {inta[]={-1,0,1,4,5},b[]={0,5,3,6,13},c[]={-1,1,5,8},d[]={0,-3,-6,7}; intn=5,m=4; linklistha; linklist(); linklist(a,b,n); ha.Printlinklist(a,b,n); linklisthb; linklist(); linklist(c,d,m); hb.Printlinklist(c,d,m); linklisthc; hc.Add(ha,hb); hc.Printlinklist; } 实验二: 二叉树的遍历 一: 实验目的: 1: 熟悉二叉树的一些操作 二: 实验任务: 1: 建立一个二叉树 2: 对二叉树进行先序、中序、后序遍历操作 3: 统计度为一的结点个数 三: 实验方案: 算法基本原理 四: 程序清单: #include typedefstructtreenode { chardata; structtreenode*lchild,*rchild; }JD; constintmaxsize=1000; JD*root; voidcreate() { JD*Q[maxsize]; intfront,rear; charch; JD*s; root=NULL; front=1; rear=0; cin>>ch; while(ch! ='#') { p=NULL; if(ch! ='@') { s=newJD; s->data=ch; s->lchild=NULL; s->rchild=NULL; } rear++; Q[rear]=s; if(rear==1) root=s; else { if((s! =NULL)&&Q[front]! =NULL) { if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; } if(rear%2==1) front++; } cin>>ch; } } voidpreorder(JD*p) { if(p==NULL) return; cout< preorder(p->lchild); preorder(p->rchild); } voidinorder(JD*p) { if(p==NULL) return; inorder(p->lchild); cout< inorder(p->rchild); } voidpostorder(JD*p) { if(p==NULL) return; postorder(p->lchild); postorder(p->rchild); cout< } voidlength(JD*p,int*count;) { if(p! =NULL) { if((p->lchild==NULL)||(p->lchild==NULL)) { (*count)++; return; } } else cout<<"度为1的结点为"< length(p->lchild); length(p->rchild); } voidmain() {int*i=0; create(); preorder(root); cout< inorder(root); cout< //postorder(root); length(root,i); } 实验三: 二叉排序树的操作 一.实验目的与要求 1、熟悉二叉排序树的生成、删除、查找操作 2、掌握二叉树的建立和中序遍历 二.实验任务 1、构成一个二叉排序树。 2、进行中序遍历。 3、删除值为10所在的节点。 4、进行中序遍历。 三.实验方案(算法基本原理) 二叉排序树的特点是左子树上所有结点的数据值均小于根节点的数据值;右子树上的所有结点的数据值均大于或等于根节点的数据值。 存储采用含有两个指针域一个数据域的链式结构存储。 遍历有三种,先序、中序、后序,遍历顺序分别是根左右,左根右,左右根。 四.程序清单 #include usingnamespacestd; //二叉树的链式存储结构体 structtreenode{ intdata; structtreenode*lchild,*rchild,*parent; }; //二叉排序树的生成 treenode*root=NULL; voidinsertbet(intx) { treenode*p,*s,*q; s=newtreenode; s->data=x; s->lchild=s->rchild=NULL; if(root==NULL) { root=s; return; } p=root; while(p! =NULL) { q=p; if(x p=p->lchild; else p=p->rchild; } if(x q->lchild=s; else q->rchild=s; } //二叉排序树的删除操作 voiddelnode(treenode*p,treenode*f) { treenode*q,*s; intflag=0; if(p->lchild==NULL) s=p->rchild; elseif(p->rchild==NULL) s=p->lchild; else { q=p; s=p->lchild; while(s->rchild! =NULL) { q=s; s=s->rchild; } if(q==p) q->lchild=s->lchild; else q->rchild=s->lchild; p->data=s->data; deletes; flag=1; } if(flag==0) { if(f==NULL) root=s; elseif(f->lchild==p) f->lchild=s; else f->rchild=s; deletep; } } //二叉排序树指定数据的删除操作 voiddel(treenode*p,intk) { treenode*q; if(p==NULL) return; while(p->data! =k) { if(k { q=p; p=p->lchild; } else { q=p; p=p->rchild; } } delnode(p,q); } //中序遍历算法 voidinorder(treenode*p) { if(p==NULL) return; inorder(p->lchild); cout< inorder(p->rchild); } voidmain() { cout<<"建立二叉排序树"; insertbet(10); insertbet(18); insertbet(3); insertbet(8); insertbet(12); insertbet (2); insertbet(7); insertbet(4); cout< "; inorder(root); cout< cout<<"删除值为10的节点"< del(root,10); cout<<"中序遍历: "; inorder(root); } 实验四图的遍历 实验目的与要求按 1、要求建立一张图 2、熟悉图的操作。 3、掌握图的建立,图的深度、广度遍历。 实验任务 1、对图进行深度、广度遍历。 实验方案(算法基本原理) 图的存储有邻接矩阵和邻接表两种,本实验采用邻接表存储 程序清单 #include usingnamespacestd; #defineM7 typedefstructnode { intadjvex; structnode*next; }JD; typedefstructtnode { intvexdata; structnode*firstarc; }TD; TDga[M]; intCreateGraph(tnode*g) { inti,j; structtnode*p; node*q; cout<<"请依次输入"< "; for(p=g+1;p { cin>>p->vexdata; p->firstarc=NULL; } cout<<"请输入各个顶点的邻接关系: "< for(intk=1;k<=6;k++) { cout<<"(i,j): "; cin>>i>>j; if(i! =0&&j! =0) { p=g; q=newnode; if(! p) return0; else { q->adjvex=j; q->next=(p+i)->firstarc; (p+i)->firstarc=q; } } } return1; } //深度优先遍历算法 voidTraverW(TDg[],intn) { inti; staticintvisited[M]; for(i=1;i visited[i]=0; cout< for(i=1;i if(visited[i]==0) DFS(g,i,visited); } voidDFS(TDg[],intv,intvisited[]) { JD*w; inti; visited[v]=1; w=g[v].firstarc; while(w! =NULL) { i=w->adjvex; if(visited[i]==0) { cout< DFS(g,i,visited); } w=w->next; } } //广度优先遍历算法 voidTraverL(TDg[],intn) { inti; staticintvisited[M]; for(i=1;i<=n;i++) visited[i]=0; for(i=1;i if(visited[i]==0) BFS(g,i,visited); } voidBFS(TDg[],intv,intvisited[]) { intqu[M-1],f=0,r=0; JD*p; visited[v]=1; cout< qu[0]=v; while(f { v=qu[f++]; p=g[v].firstarc; while(p! =NULL) { v=p->adjvex; if(visited[v]==0) { visited[v]=1; cout< qu[++r]=v; } p=p->next; } } } voidmain() { CreateGraph(ga); cout<<"深度优先遍历搜索: "< TraverW(ga,M); cout<<"\n广度优先遍历搜索: "< TraverL(ga,M); cout< } 实验五: 查找与排序 一: 实验目的: 1: 熟悉查找与排序的一些操作 2: 对分查找: 513174246557094 3: 堆排序: {19123683517842714} 二: 实验任务: 1: 查找12,再查找55,若找着了显示位置 2: 打印、排序数组 3: 写出程序并输出结果 三: 实验方案: 算法基本原理 四: 程序清单: 对分查找: #include intbinsearch(intr[],intn,intk) { intlow,high,mid,found; low=1; high=n; found=0; while((low<=high)&&(found==0)) { mid=(low+high)/2; if(k>r[mid])low=mid+1; elseif(k==r[mid])found=1; elsehigh=mid-1; } if(found==1) {cout< returnmid;} else {cout<<"0"< return0;} } voidmain() {intr[]={0,5,13,17,42,46,55,70,94}; binsearch(r,9,12); binsearch(r,9,55); } 堆排序: #include voidsift(intr[],intk,intn) { inti,j; intx; i=k; x=r[i]; j=2*i; while(j<=n) { if((j j++; if(x { r[i]=r[j]; i=j; j=2*i; } elsebreak; } r[i]=x; } voidbsift(intr[],intn) { inti; for(i=n/2;i>=1;i--) sift(r,i,n); } voidheapsort(intr[],intn) { inti;intx; bsift(r,n); for(i=n;i>=2;i--) { x=r[1]; r[1]=r[i]; r[i]=x; sift(r,1,i-1); } for(i=n;i>=1;i--) { cout< } } voidmain() {intr[10]={0,19,1,23,68,35,17,84,27,14}; sift(r,1,9); bsift(r,9); heapsort(r,9); } 实验六: 编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度。 最高优先数优先调度算法 程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。 进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。 用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所有进程都完成为止 #include #include usingnamespacestd; //定义一个PCB进程类 classPCB {public: charname[10];//进程的名字 intruntime;//该进程的运行时间 intpriority;//该进程的优先级 charstate;//该进程的状态 PCB*next;//指向下个进程的指针 voidprint()const//输出进程的信息 {cout<<"(name="< <<",priority="< } }; classPCBSortCriterion{//优先队列的优先准则类 public: booloperator()(constPCB&p1,constPCB&p2)const//仿函数确定优先准则,从大到小 {return(p1.priority
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 技术 基础
![提示](https://static.bdocx.com/images/bang_tan.gif)