计算机软件技术基础实验报告.docx
《计算机软件技术基础实验报告.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
计算机软件技术基础实验报告
实验一线性表的基本操作
一、实验目的与基本要求
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.在线性表的顺序存储结构的第一个位置上插入一个元素。
(注意区分链表和顺序表)
实验代码:
#include"stdlib.h"
#include"stdio.h"
structnode//定义结构体
{
intd;
structnode*next;
};
structnode*head1,*head2,*p,*q;
voidpre(structnode*head)//打印数据
{
printf("链表中的数据为:
\n");
p=head;
while(p!
=NULL)
{
printf("%5d",p->d);
q=p;p=p->next;
}
printf("\n");
}
structnode*creat()//建立链表
{structnode*head;
intx;
printf("输入你要储存的数据:
\n");
head=NULL;
q=NULL;
scanf("%d",&x);
while(x>0)
{
p=(structnode*)malloc(sizeof(structnode));
p->d=x;
p->next=NULL;
if(head==NULL)head=p;
elseq->next=p;
q=p;
scanf("%d",&x);
getchar();
}
pre(head);
return(head);
}
voidlocate(structnode*head,intx)//查找链表中的数据
{
intu=1;
p=head;
while(p->next!
=NULL)
{if(p->d==x)
break;
else
{p=p->next;u++;}
}
if(p->d!
=x)
printf("无此结点");
printf("在链表中的位置为:
");
printf("%d",u);
}
voidinsert(structnode*head,intx,inti)//插入数据
{p=head;intj=1;
q=(structnode*)malloc(sizeof(structnode));
q->d=x;
if(i==1)
{q->next=head;
head=q;
}
else
{
while((jnext!
=NULL))
{j++;p=p->next;}
q->next=p->next;
p->next=q;}
}
voiddelet(structnode*head,inti)//删除数据
{p=head;intj=1;
if(i<0)printf("无此位置");
if(i==1)
{q=head;head=head->next;free(q);
}
else
{
while((jnext!
=NULL))
{p=p->next;j++;}
q=p->next;
p->next=q->next;
free(q);}
}
voidhebing(structnode*x,structnode*y)//合并两个链表
{
p=x;
q=y;
while(p->next!
=NULL)
p=p->next;
p->next=q;
pre(x);
}
voidpaixu(structnode*head)//对链表中的数据进行排序
{intm,n,i=1,t;
p=head;
while(p->next!
=NULL)
{p=p->next;i++;}
p=head;
for(n=i;n>1;n--)
{p=head;
for(m=1;m{
q=p->next;
if(p->dd)
{t=p->d;
p->d=q->d;
q->d=t;
}
p=p->next;
}
}
}
voidcaozuo(structnode*head)//操作界面
{
intm,n;chart;
printf("输入你要的操作:
,查找2,插入3,删除\n");
scanf("%c",&t);
switch(t)
{
case'1':
{printf("输入你要查找的元素的值:
\n");
scanf("%d",&m);
locate(head,m);}break;
case'2':
{printf("输入你要插入的元素的值和位置:
\n");
scanf("%d",&m);
scanf("%d",&n);
insert(head,m,n);pre(head);}break;
case'3':
{printf("输入你要删除的元素的位置:
\n");
scanf("%d",&m);
delet(head,m);pre(head);}break;
default:
printf("error\n");
}
}
voidmain()//主函数
{
charfrag='y',n=NULL;
printf("输入你要建立的第A链表中的元素:
\n");
head1=creat();
printf("输入你要建立的第B链表中的元素:
\n");
head2=creat();
do
{printf("选择你要操作的链表A/B或者合并排序操作C:
\n");//选择操作
scanf("%c",&n);
getchar();
switch(n)
{
case'A':
{caozuo(head1);}break;
case'B':
{caozuo(head2);}break;
case'C':
{hebing(head1,head2);paixu(head1);pre(head1);}break;
default:
printf("error\n");
}
printf("\n是否继续y/n:
\n");
scanf("%c",&frag);
getchar();
}while(frag=='y');
}
实验2栈和队列的基本操作
一、实验目的与基本要求
1.掌握栈和队列的顺序存储和链式存储结构
2.掌握栈和队列的特点。
3.掌握栈和队列的基本运算。
二、实验条件
1.硬件:
一台微型计算机
2.软件:
操作系统和C语言系统。
三、实验方法
确定存储结构后,上机调试实现栈和队列的基本运算。
四、实验内容
1.写出栈的入栈和出栈的算法
2.写出队列的入队和出队算法。
实验代码:
#include"stdlib.h"
#include"stdio.h"
structnode
{
intd;
structnode*next;
};
intnum;structnode*head;
voidpre()
{
structnode*p;
printf("链表中的数据为:
\n");
p=head;
while(p!
=NULL)
{
printf("%5d",p->d);
p=p->next;
}
printf("\n");
}
voidcreat()
{
structnode*p,*q;
intx;
printf("输入你要储存的数据,输入负数作为结束:
\n");
head=NULL;
q=NULL;
scanf("%d",&x);
while(x>0)
{
num++;
p=(structnode*)malloc(sizeof(structnode));
p->d=x;
p->next=NULL;
if(head==NULL)head=p;
elseq->next=p;
q=p;
scanf("%d",&x);
getchar();
}
pre();
}
voidinsert(intx,inti)
{
structnode*p,*q;
p=head;intj=1;
q=(structnode*)malloc(sizeof(structnode));
q->d=x;
if(i==1)
{q->next=head;
head=q;
}
else
{
while((jnext!
=NULL))
{j++;p=p->next;}
q->next=p->next;
p->next=q;}
}
voiddelet(inti)
{
structnode*p,*q;
p=head;intj=1;
if(i<0)printf("无此位置");
if(i==1)
{q=head;head=head->next;free(q);
}
else
{
while((jnext!
=NULL))
{p=p->next;j++;}
q=p->next;
p->next=q->next;
free(q);}
}
voidpush()
{
intn;
num++;
printf("请输入数据:
");
scanf("%d",&n);
getchar();
insert(n,num);
pre();
}
voidpop()
{
delet(num);
num--;
pre();
}
voidrudui()
{
intn;
num++;
printf("请输入数据:
");
scanf("%d",&n);
getchar();
insert(n,1);
pre();
}
voidchudui()
{
delet(num);
num--;
pre();
}
voidmain()
{
charfrag='y';intn;
creat();
do
{printf("选择你要的操作入栈出栈入队出队:
\n");
scanf("%d",&n);
getchar();
switch(n)
{
case1:
{printf("入栈操作");
push();printf("\n");}break;
case2:
{
printf("出栈操作");
pop();printf("\n");}break;
case3:
{printf("入队操作");
rudui();printf("\n");}break;
case4:
{printf("出队操作");
chudui();printf("\n");}break;
default:
printf("error\n");
}
printf("\n是否继续y/n:
\n");
scanf("%c",&frag);
getchar();
}while(frag=='y');
}
实验3二叉树的构造
一、实验目的与基本要求
熟练掌握二叉树的构造方法。
二、实验条件
1.硬件:
微机
2.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试二叉树的构造方法。
四、实验内容
设计一个读入一串整数构成一棵二叉树的程序。
(深度至少为2)
实验代码:
#include
#include
structbtnode//二叉树结构体
{
chard;
structbtnode*lchild;
structbtnode*rchild;
};
structbtnode*creatbt(structbtnode*bt,intk)//建立二叉树
{
structbtnode*p,*t;
t=(structbtnode*)malloc(sizeof(structbtnode));
printf("输入元素(输入时结束所在分枝):
");
charb;
scanf("%c",&b);
getchar();
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;
}
voidpretrav(structbtnode*bt)//前序遍历
{
if(bt!
=NULL)
{
printf("%c\n",bt->d);
pretrav(bt->lchild);
pretrav(bt->rchild);
}
return;
}
voidintrav(structbtnode*bt)//中序遍历
{
if(bt!
=NULL)
{
intrav(bt->lchild);
printf("%c\n",bt->d);
intrav(bt->rchild);
}
return;
}
voidpostrav(structbtnode*bt)//后序遍历
{
if(bt!
=NULL)
{
postrav(bt->lchild);
postrav(bt->rchild);
printf("%c\n",bt->d);
}
return;
}
intmain()
{
structbtnode*m;charfrag='y';
ints;
do
{
printf("请选择\n1、建立二叉树\n2、前序遍历\n3、中序遍历\n4、后序遍历\n5、退出\n");
scanf("%d",&s);
getchar();
switch(s)
{
case1:
m=creatbt(0,0);break;
case2:
pretrav(m);break;
case3:
intrav(m);break;
case4:
postrav(m);break;
default:
{
printf("是否继续\ny/n");
scanf("%c",&frag);
getchar();
};break;
}
}while(frag=='y');
}
实验4排序的基本操作
一、实验目的与基本要求
1.掌握常用的排序方法,并用高级语言实现排序算法。
2.理解排序的定义和各种排序的特点。
3.了解排序过程以及依据的原则,并了解各种排序方法的时间复杂度分析。
二、实验条件
1.硬件:
一台微机
2.软件:
操作系统和C语言系统
三、实验方法
确定存储结构后,上机调试不同的排序方法。
四、实验内容
1.设计一待排序的线性表以顺序存储结构存储,试写出冒泡排序算法。
2.给出n个学生的考试成绩表,每条信息由姓名与分数组成,试设计一个算法:
(1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。
(2)按名次列出每个学生的姓名与分数。
实验代码:
#include"stdlib.h"
#include"stdio.h"
structnode//结构体变量
{
intf;
intm;
charn;
structnode*next;
};
voidpre(structnode*head)//打印数据
{structnode*p;
printf("链表中的数据为:
\n");
printf("名次姓名分数\n");
p=head;
while(p!
=NULL)
{
printf("%5d",p->m);
printf("%5c",p->n);
printf("%5d",p->f);
printf("\n");
p=p->next;
}
printf("\n");
}
intnum;
structnode*creat()//建立数据
{
structnode*head,*q,*p;
intx,y,j;charz;
printf("输入录入学生的人数:
\n");
head=NULL;
q=NULL;
scanf("%d",&num);
getchar();
for(j=0;j{
printf("输入学生的姓名:
\n");
scanf("%c",&z);
getchar();
printf("输入学生的分数:
\n");
scanf("%d",&x);
getchar();
p=(structnode*)malloc(sizeof(structnode));
p->n=z;
p->f=x;
p->m=0;
p->next=NULL;
if(head==NULL)head=p;
elseq->next=p;
q=p;
}
pre(head);
return(head);
}
structnode*paixu(structnode*head)//按分数排序
{
inti,j;
structnode*q,*p,*k,*t;
t=(structnode*)malloc(sizeof(structnode));
t->next=head;
for(i=num-1;i>0;i--)
{
q=t;
for(j=0;j
{
p=q->next;
k=p->next;
if(k->f>p->f)
{
p->next=k->next;
q->next=k;
k->next=p;
}
q=q->next;
}
}
q=t->next;
j=0;
q->m=1;
for(i=1;i{
p=q->next;
if(q->f==p->f)
{
p->m=q->m;
}
else
p->m=q->m+1;
q=q->next;
}
return(t->next);
}
voidmain()
{
structnode*head,*m;
head=creat();
m=paixu(head);
printf("按名次排序后");
pre(m);
getchar();
}