太原理工大学现代科技学院
计算机软件技术基础课程 实验报告
专业班级
学 号
姓 名
指导教师
实验名称 有序表的对分查找 同组人
专业班级 学号 姓名 成绩
实验目的与要求:理解和掌握线性表的查找技术,使用C语言根据相应算法编写一个程序,实现顺序存储的有序表的对分查找。要求仔细阅读下面的内容,编写C程序,上机通过,并观察其结果,写出实验报告书。
实验内容:在顺序存储的长度为n的有序线性表中对分查找元素x的序号k
具体要求:
① 根据有序线性表的对分查找的算法编写C程序,并上机调试。
② 编写的C程序要求若表中存在待查找记录,则显示该记录在表中的位置,否则显示该记录不存在。
③ 实验完成后,写出实验报告书。
上机程序:
#include<stdio.h>
int bserch(v,n,x)
int n;
int x,v[];
{int i,j,k;
i=1;j=n;
while(i<=j)
{k=(i+j)/2;
if(v[k-1]==x) return(k-1);
if(v[k-1]>x) j=k-1;
else i=k+1;
}
return(-1);
}
main()
{int n=17;
int x=11;
int v[]={2,3,4,5,6,7,8,9,11,13,14,15,16,17,19,21,24};
int y;
printf("x=11\n");y=bserch(v,n,x);
printf("y=%d",y+1);
printf("\n");
getch();
}
实验结果:
《计算机软件技术基础》实验报告
专 业 _____________
年 级 _____________
学 号 _____________
学生姓名 _____________
指导老师 _____________
南华大学计算机学院编
I 实验要求
1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。
2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。
3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。
4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。
实验一 线性表
【实验目的】
1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。
2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。
3.熟练掌握线性表的综合应用问题。
【实验内容】
必做:
1.一个线性表有n个元素(n<MAXSIZE, MAXSIZE指线性表的最大长度),且递增有序。
(1)现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。采用链式存储表示方法实现,设计程序实现
(2)从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。
要求:
①指定的值x由键盘输入;
②程序能处理空链表的情况。
选做:
3.设有头结点的单链表,编程对表中的作一值只保留一个结点,删除其余值相同的结点。
要求:
①该算法用函数(非主函数)实现;
②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。
要求:
①该算法用函数Reverse(head,p)实现,其中head为表头指针,p指向要交换的结点;
②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
要求:
①建立一个结点中含有三个域的单链表;
②在主函数中调用此算法,构成双向循环链表;
③在主函数中利用正向和逆向两种方式输出链表中的数据,验证算法的正确性。
【实验报告】
实习时间: 实习地点: 实习机号:
实验二 堆栈与队列
【实验目的】
1.学习如何使用C语言实现堆栈与队列。
2.熟悉堆栈与队列的基本操作及应用。
【实验内容】
1. 现有一顺序队列,其结构描述为:
# define MAX 100
typedef struct
{ ElemType queue[MaxQueueSize];
int front; // 队头指针
int count; // 计数器
}QueueType;
要求:
①设计队列的几种几种操作:初始化、进队、出队、取队头元素和判断队列是否非空。
②编写一个主函数进行测试。
2.顺序堆栈实验
要求:
①设计堆栈的几种几种操作:初始化、入栈、出栈、取栈顶元素和判断堆栈是否非空。
②编写一个主函数进行测试。
【实验报告】
实习时间: 实习地点: 实习机号:
实验三 队列与栈的应用
必做:
1、设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个算法判断其中的括号是否匹配。
提示:本题使用一个运算符栈st,当遇到的‘(’、‘[’、或‘{’时进栈,当遇到‘}’、‘]’、‘)’时判断栈顶是否为相应的括号,若是退栈继续执行;否则算法结束。
选做:
2、假设以数组sequ[0..MaxSize-1]存放环形队列的元素,同时设变量rear和len分别指示环形队列中队尾元素的位置和内含元素的个数。试写出此环形队列队满的条件,并设计相应入队和出队的算法。(根据题目填空完善程序)
提示:该环形队列对满的条件为:len= =MaxSize,队空的条件为:len= =0。由rear,len求队列头指针front的过程为:
front=rear-len+1;
if (front<0) front=front+MaxSize;
即 front=(rear-len+1+MaxSize)%MaxSize
# include <stdio.h>
# define maxsize 6
typedef char queue [maxsize];
int rear=0, len=0;
int enqueue (queue qu, char x)
{
if (len= =maxsize)
return 0;
else
{
rear=(rear+1) %maxsize;
qu[rear]=x;
len++;
return 1;
}
}
int dequeue (queue qu, char *x)
{
int front;
if (len= =0)
return 0;
else
{
front=(rear-len+1+maxsize) %maxsize;
*x=qu[front];
len--;
return 1;
}
}
void main()
{
char x;
queue qu;
printf( “a入队\n”);
enqueue (qu, ‘a’);
printf( “b入队\n”);
enqueue (qu, ‘b’);
printf( “c入队\n”);
enqueue (qu, ‘c’);
printf( “出队一次:”);
dequeue (qu, &x);
printf( “%c\n”,x);
printf( “d入队\n”);
enqueue (qu, ‘d’);
printf( “e入队\n”);
enqueue (qu, ‘e’);
printf( “出队一次:”);
dequeue (qu, &x);
printf(“%c\n”,x);
printf( “f入队\n”);
enqueue (qu, ‘f’);
printf( “g入队\n”);
enqueue (qu, ‘g’);
printf( “出队一次:”);
dequeue (qu, &x);
printf(“%c\n”,x);
printf(“余下元素出列:”);
while (len>0)
{
dequeue (qu, &x);
printf(“%c\n”,x);
}
printf(“\n”);
}
输出:
. 入队
. 入队
出队一次:
. 入队
. 入队
出队一次:
. 入队
. 入队
出队一次:
余下元素出列:
【实验报告】
实习时间: 实习地点: 实习机号:
一、 实验目的
1.掌握二叉树,二叉树排序数的概念及存储方法。
2.掌握二叉树的遍历算法。
3.熟练掌握编写实现树的各种运算的算法。
一、 实验内容
树的基本运算:创建树;输出树;遍历树;求二叉树的深度;创建二叉排序树;二叉排序树的查找;二叉排序树的删除;创造哈夫曼树;输出哈夫曼树;
1、建立一棵二叉树并中序遍历。(填空)
#include “ stdio.h”
#include “malloc.h”
struct node{
char data;
struct node *lchild , *rchild;
} bnode;
typedef struct node * blink;
blink add(blink bt,char ch)
{
if(bt==NULL)
{
bt=nalloc(sizeof(bnode));
bt->data = ch;
bt->lchild = bt->rchild =NULL;
}
else if ( ch < bt->data)
bt->lchild = add(bt->lchild ,ch);
else
bt->rchild = add(bt->rchild,ch);
return bt;
}
void inorder(blink bt)
{
if(bt)
{ inorder(bt->lchild);
printf(“%c”,bt->data);
inorder(bt->rchild);
}
}
main()
{
blink root = null;
int i,n;
char x;
scanf(“%c”,&n);
for(i=1;i<=n;i++)
{
x=getchar();
root=add(root,x);
}
inorder(root);
printf(“\n”);
}
输入:ephqsbma
输出:
2、求二叉树的结点数和叶子数(填空)
#include “stdio.h”
#include “alloc.h”
struct node{
char data;
struct node *lchild , *rchild;
} bnode;
typedef struct node *blink;
int n=0,no=0;
void preorder(blink bt)
{
if(bt)
{ n++;
if(bt->lchild ==NULL&&bt->rchild==NULL)
no++;
preorder(bt->lchild;)
preorder(bt->rchild;)
}
}
blink creat()
{
blink bt;
char ch;
ch = getchar();
if (ch!=’#’)
{
bt= nalloc(sizeof(bnode));
bt->data= ch;
bt->lchild = creat( );
bt->rchild= creat( );
}
else
bt=NULL;
return bt;
}
main()
{
blink root;
root = creat();
preorder(root);
printf(“number of node: %d number of leaf: %d \n” , n , no);
}
输入: ab##cd###
输出:
【实验报告】
实习时间: 实习地点: 实习机号:
实验六 查找与排序
【实验目的】
熟悉各种查找与排序的算法,并对各种算法的效率进行比较和测试。
【实验内容】
1. 排序算法比较。要求:
①调用函数int rand(void)产生100000个待排序的数据;
②测试下列各排序函数的机器实际执行时间:
a.直接插入排序; b.希尔排序 c.选择排序
d.冒泡排序 e.快速排序 f.归并排序
【实验报告】
实习时间: 实习地点: 实习机号:
实验七 综合练习
【实验目的】
1.在掌握基本概念的基础上,综合运用线性结构和树结构以及排序和查找算法进行复杂结构程序设计。
【实验内容】
1.试将一棵普通树转换成二叉树,同时转换而成的二叉树按前序、中序、后序进行遍历,并输出遍历后结点的序列。例如,下面左图是一棵普通树,用括号表示法表示为:A(BC(FG)DE),右图是转换后的二叉树。
提示:从分析输入的树串形式可知,左括号后面的字符为左括号前面字符的左子树,括号内的字符关系是兄弟,则转化为二叉树后,后面字符为其前一字符的右子树。所以,依据左右括号及字符间的关系,可以生成结点的左右子树。
【实验报告】
实习时间: 实习地点: 实习机号:
计算机软件技术基础实验报告姓名班级0801105学号日期20xx125班级0801105学号姓名第5周星期三910节成绩一实验目的…
山东建筑大学实验报告学院信电学院班级姓名课程计算机软件技术基础实验日期20xx年11月22日成绩实验八数据库应用系统开发一实验目的…
计算机软件基础实验报告实验一一元多项式的相加一实验的目的与要求1熟悉单链表的一些操作2掌握采用链表结构实现一元多项式的相加的算法二…
石家庄铁道大学实验报告课程名称计算机软件基础建筑与艺术学院系11021班试验者姓名学号实验日期年月日评分教师签名123456789…
山东建筑大学实验报告学院信电学院班级姓名学号课程计算机软件技术基础实验日期20xx年10月25日成绩实验二栈和队列的基本操作一实验…
大学计算机基础课程实验报告手册学院年级专业姓名学号2220xx319xx20xx任课教师上机地点以上由学生填写实验教师签字西南大学…
太原理工大学现代科技学院计算机软件技术基础课程实验报告专业班级学号姓名指导教师太原理工大学现代科技学院实验报告装订线实验名称顺序表…
上海建桥学院本科实验报告课程名称学号姓名专业班级计算机应用基础1222534单国原物流管理B121指导教师朱凯伦课内实验目录及成绩…
计算机软件基础实践报告题目C语言程序上机操作专业学生姓名准考证号指导教师20xx年5月1一单链表实验内容单链表的定义创建插入和删除…
软件开发技术基础实验报告姓名XXXXX学号XXXXXXXx班级XXXXXXX指导教师实验名称实验一线性表的操作班级学号姓名第周星期…