计算机软件技术报告.docx
- 文档编号:5261403
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:21
- 大小:155.60KB
计算机软件技术报告.docx
《计算机软件技术报告.docx》由会员分享,可在线阅读,更多相关《计算机软件技术报告.docx(21页珍藏版)》请在冰豆网上搜索。
计算机软件技术报告
实验一线性表的基本操作
一、实验目的与基本要求
1.掌握数据结构中的一些基本概念。
数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。
2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。
3.掌握线性表的基本操作:
插入、删除、查找以及线性表的合并等运算。
4.掌握运用C语言上机调试线性表的基本方法。
二、实验条件
1.硬件:
一台微机
2.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试实现线性表的基本运算。
四、实验内容
1.试编写在无头结点的单链表上实现线性表基本运算LOCATE(L,X),INSERT(L,X,1)和DELETE(L,1)的算法。
2.假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作为存储结构。
编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)结点空间存放表C。
3.将一个线性表中的值就地逆置。
4.在线性表的顺序存储结构的第一个位置上插入一个元素。
(注意区分链表和顺序表)
五、实验提示
编写一个可运行的程序,建立链表与顺序表,并由用户输入递增有序排列的链表A、链表B、顺序表的内容。
最好有一定的容错功能和友好的界面。
实现实验内容的各项操作并输出操作后的表的内容。
选做:
链表的排序,以实现输入非有序表也可进行内容2的要求。
六遇到的问题及解决方法
1指针的用法,由于C语言学习的时间已经是两年前的事了,有一些基本的用法用起来显得很生涩。
解决办法:
重新复习C语言指针部分,参考教材(《C语言程序设计》-谭浩强)和现学教材。
2线性表的删除运算,不知道具体的编写流程。
解决办法:
参考现学教材,通过与同学之间的沟通解决了这个问题。
六、代码
/*ElemType替换为需要的变量名*/
#include
typedefintElemType
typedefstructnode
{
ElemTypedata;
structnode*next;
}SLink;
/**********初始化线性表**********/
voidInitList(SLink*sq)
{
sq=(SLink*)malloc(sizeof(SLink));
sq->next=NULL;
}
/**********求线性表长度运算**********/
intGetLength(SLink*sq)
{
inti=0;
SLink*p=sq->next;
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
/**********求线性表中第i个元素运算**********/
SLink*GetElem(SLink*sq,inti)
{
intj=1;
SLink*p=sq->next;
if(iGetLength(sq))
returnNULL;
while(j
{
p=p->next;
j++;
}
returnp;
}
/**********按值查找运算**********/
SLink*Locate(SLink*sq,ElemTypex,inti)
{
SLink*p=sq->next;
if(i<1||i>GetLength(sq))
returnNULL;
while(p!
=NULL&&p->data!
=x)
p=p->next;
returnp;
}
/**********插入结点运算**********/
intInsElem(SLink*sq,ElemTypex,inti)
{
intj=1;
SLink*p=sq,*s;
s=(SLink*)malloc(sizeof(SLink));
s->data=x;
s->next=NULL;
if(i<1||i>GetLength(sq)+1)
return0;
while(j
{
p=p->next;
j++;
}
s->next=p->next;
p->next=s;
return1;
}
/**********删除结点运算**********/
intDelElem(SLink*sq,inti)
{
intj=1;
SLink*p=sq,*q;
if(i<1||i>GetLength(sq))
return0;
while(j
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
return1;
}
/**********输出元素值运算**********/
voidDispList(SLink*sq)
{
SLink*p=sq->next;
while(p!
=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
return;
}
/*ha和hb市带头结点非递减有序单链表表头指针,合并为一个非递增有
序单链表。
结果链表仍使用原来两个链表的存储空间,允许有重复数据*/
SLink*Connect(SLink*ha,SLink*hb)
{
SLink*pa=ha->next,*pb=hb->next,*hc,*tc;
hc=pa;
hc->next=NULL;
while(pa!
=NULL&&pb!
=NULL)
{
if(pa->data
{
tc->next=pa;
tc=pa;
pa=pa->next;
}
elseif(pa->data>pb->data)
{
tc->next=pb;
tc=pb;
pb=pb->next;
}
else//pa->data==pb-data
{//*pa和*pb两个结点都链接到hc中
tc->next=pa;
tc=pa;
pa=pa->next;
tc->next=pb;
tc=pb;
pb=pb->next;
}
}
tc->next=NULL;
if(pa!
=NULL)
tc->next=pa;
if(pb!
=NULL)
tc->next=pb;
returnhc;
}
intmain()
{
intn,i,j,k;
SLink*L;
/*在主函数中添加内容调用自定义函数,并添加适当的函数以完成功能。
*/
}
显示截图:
实验2栈和队列的基本操作
一、实验目的与基本要求
1.掌握栈和队列的顺序存储和链式存储结构
1.掌握栈和队列的特点。
2.掌握栈和队列的基本运算。
二、实验条件
5.硬件:
一台微型计算机
6.软件:
操作系统和C语言系统。
三、实验方法
确定存储结构后,上机调试实现栈和队列的基本运算。
四、实验内容
1.写出栈的入栈和出栈的算法
2.写出队列的入队和出队算法。
五、实验提示
编写一个可运行的程序,建立栈与队列,实现入栈、出栈,入队、出队的算法,并由用户选择操作,输出栈与队列的内容。
六:
实验中遇到的问题及解决办法
1这一方面自己学的不是很好,关于出栈和入栈的算法编写的基本思想感到很模糊,不知道从什么地方下手,后来通过自己与同学之间的沟通,以及对老师的求教,是自己大致掌握了编写的方法,编写过程中遇到很多困难,这里不再赘述,花费了大量的时间用于代码的调试。
解决办法:
与同学沟通,求教于老师。
七、参考代码
/**********建栈**********/
int*init_stack(s,m,top)
int*s;intm,*top;
{
if(s!
=NULL)
free(s);
s=malloc(m*sizeof(int));
*top=0;
flag1=1;
returns;
}
/**********入栈**********/
voidpush(s,m,top,x)
ints[],x;intm,*top;
{
if(flag1==0)
{
printf("尚未建栈\n");
return;
}
if(*top==m)
{
printf("栈满\n");
return;
}
*top=*top+1;
s[*top-1]=x;
return;
}
/**********退栈**********/
voidpop(s,m,top,y)
ints[],*y;intm,*top;
{
if(flag1==0)
{
printf("尚未建栈\n");
return;
}
if(*top==0)
{
printf("**********栈空\n**********\n");
return;
}
*y=s[*top-1];
*top=*top-1;
return;
}
/**********读栈顶**********/
voidtop(s,m,top,y)
ints[],*y;intm,*top;
{
if(flag1==0)
{
printf("尚未建栈\n");
return;
}
if(*top==0)
{
printf("空栈\n");
return;
}
*y=s[*top-1];
return;
}
/**********建队**********/
int*init_queue(q,m,front,rear,s)
int*q;intm,*front,*rear,*s;
{
if(q!
=NULL)
free(q);
q=malloc(m*sizeof(int));
*front=m;
*rear=m;
*s=0;
flag2=1;
returnq;
}
/**********入队**********/
voidaddcq(q,m,rear,front,s,x)
intq[],x;intm,*rear,*front,*s;
{
if((*s==1)&&(*rear==*front))
{
printf("队满\n");
return;
}
*rear=*rear+1;
if(*rear==m+1)
*rear=1;
q[*rear-1]=x;
*s=1;
return;
}
/**********退队**********/
voiddelcq(q,m,rear,front,s,y)
intq[],*y;intm,*rear,*front,*s;
{
if(flag2==0)
{
printf("尚未建队\n");
return;
}
if(*s==0)
{
printf("队空\n")
return;
}
*front=*front+1;
if(*front==m+1)
*front=1;
*y=q[*front-1];
if(*front==*rear)
*s=0;
return;
}
实验3二叉树的构造
一、实验目的与基本要求
1.熟练掌握二叉树的构造方法。
二、实验条件
3.硬件:
一台微机
4.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试二叉树的构造方法。
四、实验内容
设计一个读入一串整数构成一棵二叉树的程序。
(深度至少为2)
五、实验提示
编写一个可运行的程序,建立二叉树,由用户输入二叉树的数据。
六实验中遇到的问题以及解决办法
这次实验的编程不是很难,一是算法本身很简单,二是书上有关于本次编程的代码段,自己编一个总程序即可,主要的问题还是出在调试上,本来用调试软件已经没有错误,但是一弄到C-free程序界面上就会报错,后来我回到寝室用我自己的C程序编程软件调试了一下,结果正确。
我觉得应该是软件开发环境的问题,对我的这次实验感到很满意。
六、实验代码
#include
#include
structbtnode
{
intd;
structbtnode*lchild;
structbtnode*rchild;
};
structbtnode*creatbt(bt,k)
structbtnode*bt;
intk;
{
structbtnode*p,*t;
printf("输入元素(输入0时结束所在分枝):
");
intb;
scanf("%d",&b);
if(b!
=0)
{
p=(structbtnode*)malloc(sizeof(structbtnode));
p->d=b;p->lchild=NULL;p->rchild=NULL;
if(k==0)
t=p;
if(k==1)
bt->lchild=p;
if(k==2)
bt->rchild=p;
creatbt(p,1);
creatbt(p,2);
}
returnt;
}
pretrav(bt)
structbtnode*bt;
{
if(bt!
=NULL)
{
printf("%d\n",bt->d);
pretrav(bt->lchild);
pretrav(bt->rchild);
}
return;
}
intrav(bt)
structbtnode*bt;
{
if(bt!
=NULL)
{
intrav(bt->lchild);
printf("%d\n",bt->d);
intrav(bt->rchild);
}
return;
}
postrav(bt)
structbtnode*bt;
{
if(bt!
=NULL)
{
postrav(bt->lchild);
postrav(bt->rchild);
printf("%d\n",bt->d);
}
return;
}
intmain()
{
structbtnode*t;
ints;
while
(1)
{
printf("请选择\n1、建立二叉树\n2、前序遍历\n3、中序遍历\n4、后序遍历\n5、退出\n");
scanf("%d",&s);
switch(s)
{
case1:
t=creatbt(t,0);break;
case2:
pretrav(t);break;
case3:
intrav(t);break;
case4:
postrav(t);break;
default:
return;
}
}
}
运行结果
实验4排序的基本操作
一、实验目的与基本要求
7.掌握常用的排序方法,并用高级语言实现排序算法。
8.理解排序的定义和各种排序的特点。
9.了解排序过程以及依据的原则,并了解各种排序方法的时间复杂度分析。
二、实验条件
5.硬件:
一台微机
6.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试不同的排序方法。
四、实验内容
1.设计一待排序的线性表以顺序存储结构存储,试写出冒泡排序算法。
2.给出n个学生的考试成绩表,每条信息由姓名与分数组成,试设计一个算法:
(1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。
(2)按名次列出每个学生的姓名与分数。
五、实验提示
编写一个可运行的程序,建立一个顺序表,由用户输入数据。
建立一个学生成绩表(用结构体储存学生姓名、成绩、名次),由用户输入数据。
输出相应内容。
六实验中遇到的问题及解决办法
1建立顺序表的过程中经常出现错误提示
解决办法:
经过自己的调试,问题出在一些不该错的语法错误上,编程的时候严谨的作风有待提高。
七、参考代码
#definnen30
structstudent
{charname[8];
intscore;
}
structstudentR[n];/*用简单选择排序算法统计学生成绩排名*/
main()
{intnum,i,j,max;
structstudenttemp;
printf(”\n请输入学生成绩:
\n”);
for(i=0;i {printf(“姓名: ”); scanf(“%s”,R[i].name); scanf(“%4d”,&R[i].score); } num=1; for(i=0;i {max=i; for(j=i+1;j if(R[j].score>R[max].score) max=j; if(max! =i) {temp=R[max]; R[max]=R[i]; R[i]=temp; } if((i>0)&&(R[i].score num=num+1; printf(“%4d%s%4d”,num,R[i].name,R[i].score); } } #include"bub.h" #include intmain() {inti,j; doublep[50],r=1.0; for(i=0;i<50;i++) {r=2053.0*r+13849.0;j=r/65536.0; r=r-j*65536.0; p[i]=r/65536.0; } for(i=0;i<50;i++) p[i]=100.0+200.0*p[i]; cout<<"排序前的序列: "< for(i=0;i<10;i++) {for(j=0;j<5;j++) cout< cout< } bub(p+10,30); cout<<"排序后的序列;"< for(i=0;i<10;i++) {for(j=0;j<5;j++)cout< cout< } return0; } 参考文献 1《计算机软件技术基础》,徐世良,清华大学出版社 2《C程序设计教程》,谭浩强,清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 技术 报告