计算机软件基础二实验指导书.docx
- 文档编号:20324424
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:22
- 大小:51.52KB
计算机软件基础二实验指导书.docx
《计算机软件基础二实验指导书.docx》由会员分享,可在线阅读,更多相关《计算机软件基础二实验指导书.docx(22页珍藏版)》请在冰豆网上搜索。
计算机软件基础二实验指导书
实验一线性表的插入与删除
一、实验目的与要求
使学生更进一步了解线性表在链接存储结构下插入与删除运算。
二、实验任务
1.创建带头指针的单链表
2.查找指定位置的结点
3.在查找到的指定位置上插入新元素
4.在查找到的指定位置上删除结点
三、实验指导
1.创建带头指针的单链表算法:
(1)置链表为空,即head=NULL;并置指针变量q为空,即q=NULL;
(2)通过C语言提供的函数malloc(存储区字节数),申请一个结点,使指针变量p指向它;
(3)将数据(如数据10)赋值给p的数据域,将p的指针域置为空,并将指针head和q指向该结点,
(4)申请另一结点,同样使指针变量p指向该结点,对其数据域赋值,置指针域置为空;
(5)将p插入在q指针所指结点之后,
(6)指针q指向链表的最后一个结点,到此,在原来的链表中插入二个结点。
(7)重复执行(3)、(4)、(5)、(6)则可创建整个线性链表。
链表创建函数如下:
/*请注意LEN这一常量,在后面的算法函数还会用到*/
structpointer*creat()
{structpointer*p,*q,*head;
intn;
head=NULL;
q=head;
scanf(“%d”,&n);
while(n!
=0)/*若输入的值不为0*/
{p=(structpointer*)malloc(LEN);/*得到一个新的结点*/
p->data=n;/*置数据域为输入的数值*/
p->next=NULL;/*置指针域为空*/
if(head==NULL)head=p;/*链表为空,头指针指向当前结点*/
elseq->next=p;/*将当前结点链接到最后*/
q=p;
scanf(“%d”,&n);
}
return(head);
}
2.在指定元素后挤入新元素
查找指定位置的结点
按位置查找是线性表的一种常用运算,其功能是对给定的链表查找表中第i个结点,并用一个指针变量指向该结点。
算法的思想是:
设一个计数变量n(初值为1),并设指针变量p指向链表的第一个结点。
若计数变量n的值小于给定的参数i,则指针变量p后移(即指向下一个结点),且计数变量增一(计数变量n的值始终是指针变量p所指结点的序号)。
故只需在每次执行“p后移”操作之前,增加一个判断条件,判断计数变量n是否小于给定的参数i。
此条件若成立,说明尚未数到给定位置,应该继续往下“数”(即指针变量p后移,计数变量n增一),直到条件不成立(n的值与给定序号相同,即数到位了,或给定的序号的值大于表中结点的总个数),则返回。
查找指定位置结点的算法如下:
structpointer*find_list(head,i)
structpointer*head;
inti;
{structpointer*p;
intn;
p=head;
n=1;
while(p->next!
=NULL&&n
{n++;
p=p->next;
}
if(i==n)
return(p);
elsereturn(NULL);
}
3.在查找到的指定位置上插入新元素.
在第i位置之前插入一个值为x的结点,其基本步骤如下:
第一步:
在单链表上找到插入的位置,使得指针p指向第i-1个结点位置,这可用find_list算法实现,如图2-6;然后生成一个新结点,指针s指向该结点,并将数据x赋给其数据域。
第二步:
将新结点链入到指针p所指结点之后,其操作步骤为:
(1)将结点*s的指针域指向结点*p的后继结点,语句为:
s->next=p->next;
(2)将结点*p的指针域的值改为指向新结点,语句为:
p->next=s;
至此,插入操作完成。
算法如下:
voidinsert(head,x,i)
/*head为线性链表的头指针,x为待插入的数据,i为插入位置*/
structpointer*head;
inti;
datatypex;
/*在头指针为head的线性链表的第i个位置上插入一个值为x的新结点*/
{structpointer*s,*p;
p=find_list(head,i-1);
/*先找到第i-1个结点的位置,并让p指向该结点*/
if(p!
=NULL)
{s=(structpointer*)malloc(LEN);/*生成一个新结点*/
s->data=x;/*将值x赋给新结点的数据域*/
s->next=p->next;
p->next=s;
/*将新结点连接到指针p所指结点之后(即第i个位置上)*/
}
elseprintf(“不存在第%d位置\n”,i);
}
4.在查找到的指定位置上删除结点
删除链表中第i个结点的基本步骤如下:
第一步:
找到第i-1个结点,并使得指针p指向该结点。
这一
步可通过调用find_list算法实现。
第二步:
从链表上删除第i个结点,其操作如下
(1)将指针q指向指针p所指结点的下一个结点,即第i个结点,使用语句:
q=p->next;
(2)将*q的指针域的值(*q的后继结点的地址)赋值给*p的指针域,语句为:
p->next=q->next;
第三步:
将指针q所指结点(*q)回收,语句为:
free(q);
删除链表中第i个结点的算法如下:
voiddelete_list(head,i)
/*head是线性链表的头指针,i为待删除的结点的序号*/
structpointer*head;
inti;
/*本算法是将头指针为head的线性链表中的第i个结点删除*/
{structpointer*q,*p;
p=find_list(head,i-1);
/*先找到待删除结点的前趋结点,让指针p指向该结点*/
if(p!
=NULL&&p->next!
=NULL)
{q=p->next;
p->next=q->neat;/*删除该结点*/
free(q);/*释放已被删除的结点*/
}
elseprintf(“不存在第%d个结点\n”,i);
}
四、实验报告要求
1、认真阅读和掌握本实验内容所给的程序。
2、将本实验上机运行。
3、结合运行结果,对程序进行分析。
实验二二叉排序树
一、实验目的
掌握二叉树的链式存储结构,二叉树的遍历方法和二叉排序树的方法。
二、实验任务
1.实现二叉树的链式存储。
2.二叉树的遍历算法
3.二叉排序树
三、实验指导
1、二叉链表的生成
二叉链表的生成,是指根据给定的二叉树在计算机中建立该树的链式存储结构
(1)输入根结点的值;
(2)若左子树不空,则输入左子树,否则输入一个结束符(可用空格表示);
(3)若右子树不空,则输入右子树,否则输入一个结束符;
如图:
是要创建的二叉树,按上述原则输入的字符顺序应为:
ABCDEGF
其中“”表示空格。
生成二叉树链表的算法:
首先定义链表的结点类型为
structnode{chardata;
structnode*lchild;
structnode*rchild;
};
structnodecreatebinarytree()
{structnode*t;
charch;scanf(“%c”,&ch);
/*依次输入二叉树中结点的值(一个字符),空格字符表示空树*/
scanf("%c",&ch);
if(ch==’')t=NULL;
else
{t=(structnode*)malloc(sizeof(structnode));
if(t==NULL)
{printf("outofmemory\n");exit(0);}
t->data=ch;
t->lchild=creattree();
t->rchild=creattree();
}
returnt;
}
2.二叉树的遍历算法
先序遍历DLR二叉树的操作可定义为:
若二叉树为空,则返回。
否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树;
(4)返回。
其递归算法如下:
voidpreorder(t)
structnode*t;
{if(t!
=NULL)
{visite(t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
中序遍历二叉树LDR的操作可定义为:
若二叉树为空,则返回。
否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树;
(4)返回。
其递归算法如下:
structnode
{anytypedata;
structnode*lchild;
structnode*rchild;
}
voidinorder(t)
structnode*t;/*t为指向二叉树根结构的指针*/
{if(t!
=NULL)
{inorder(t->lchild);
visite(t->data);
inorder(t->rchild);
}
}
后根遍历的算法也可归纳为四个步骤,如下描述:
若二叉树为空,则返回。
否则:
(1)后序次遍历左子树;
(2)后序遍历右子树;
(3)访问根结点;
(4)返回。
根据以上的递归定义,递归算法如下:
voidpostorder(t)
structnode*t;
{ift!
=NULL
{postorder(t->lchild);
postorder(t->rchild);
visite(tT->data);
}
}
四、实验报告要求
1、认真阅读和掌握本实验内容所给的程序。
2、将本实验上机运行。
3、结合运行结果,对程序进行分析。
实验三排序实验
一、实验目的
使学生更进一步比较各种排序方法。
二、实验任务
掌握选择排序、冒泡排序和快速排序方法。
三、实验指导
1、选择排序算法分析
选择排序是一种常用的排序方法。
选择排序是不断的从待排序的记录序列中选取关键字最小的记录,依次放到已排好序的序列的后面。
这里用的是简单选择排序
第一趟从所有的n个记录中,通过顺序比较各关键字的值,选取关键字值最小的记录与第一个记录交换;第二趟从剩余的n-1个记录中选取关键字值最小的记录与第二个记录交换;即第i趟排序就是从剩余的n-i+1个记录中(无序区)选取关键字值最小的记录,与第i个记录交换;经过n-1趟排序后,整个序列就成为有序序列。
对3385641573564220关键字序列,用简单选择排序法排序的过程如下。
如下图所示。
假设[…]为有序区,{…}为无序区。
初始关键字:
{3385641573564220}
第一趟排序后:
[15]{85643373564220}
第二趟排序后:
[1520]{643373564285}
第三趟排序后:
[152033]{6473564285}
第四趟排序后:
[15203342]{73566485}
第五趟排序后:
[1520334256]{736485}
第六趟排序后:
[152033425664]{7385}
第七趟排序后:
[15203342566473]{85}
最后结果:
[1520334256647385]
算法描述:
voidselectionsort(intR[],intn)
{inti,j,k;
for(i=1;i<=n-1;i++)
{k=i;
for(j=i+1;j<=n;j++)
if(R[j] if(i! =k) {R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; } } } 2.冒泡排序算法分析 在待排序的记录序列中,从第一个待排序的记录R1开始,依次比较两个相邻记录R1和R2,若R1>R2,则交换记录R1和R2,否则不交换。 然后再对R2和R3进行同样的比较,依次类推,直到序列中的最后两个记录处理完为止。 这样的一个过程就叫做一趟冒泡排序。 这样,在一趟比较完毕后,关键字值最大的记录就被交换到最后,然后再对前面的n-1个记录执行上述过程,如此重复n-1次。 算法描述: voidbubblesort(intR[],intn) {inti,j; for(i=1;i<=n-1;i++) for(j=1;j<=n-i;j++) if(R[j]>R[j+1]) {R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; } } ※算法存在的问题: 上述算法中,对n个记录进行排序需要进行n-1趟排序。 实际上,除非是逆序的情况,一般情况下不需要进行n-1趟冒泡就能排好序。 如果当前数据已排好序,则应该结束排序过程。 那么计算机如何才能知道当前数据已排好序了呢? 一个显而易见的办法就是在每一趟“冒泡”中,记录当前数据中是否存在逆序。 如不存在逆序则说明数据已排好序,否则,不能确定是否已排好序,还需进行下一趟“冒泡”。 假设用变量flag来记录一趟排序过程中是否有记录交换,在每一趟排序之前,flag的值设为0,每次交换记录之后,flag的值改为1。 每趟排序后,判别flag的值,若为1,继续下一趟排序;若为0,表明这一趟没有进行过任何交换记录的操作,说明已排好序,排序结束。 3.快速排序算法分析 一趟快速排序采用从两头向中间扫描的办法,同时交换与基准记录逆序的记录。 在待排序的记录序列中任取一个记录Ri(一般可取第一个记录R1),以该记录作为比较基准,将待排序序列划分成左右两部分,所有比该记录关键字值小的记录放到左边,所有比它大的放到右边,并把该记录排在这两部分的中间,这一个过程称为一趟快速排序。 之后对所划分的两部分分别重复上述过程,直到每一部分的记录个数为1为止。 一趟快速排序描述: intqkonepass(intR[],intLow,intHigh) {inti,j; i=Low; j=High; R[0]=R[i]; while(i {while(i j=j-1; R[i]=R[j]; while(i i=i+1; R[j]=R[i]; } R[i]=R[0]; return(i); } 四、实验内容 1、选择排序 2、设关键字序列为{3385641573564220},用选择排序方法和冒泡进行排序。 五、实验报告要求 1、认真阅读和掌握本实验内容所给的程序。 2、将本实验上机运行。 3、结合运行结果,对程序进行分析。 实验四查找 一、实验目的 使学生掌握线性查找和二分查找。 二、实验任务 1.线性查找: 已知含有10个整数的线性表如下: (9,13,15,7,45,32,56,89,60,36),从键盘上输入一个整数,用线性查找的方法在线性表中查找该整数。 若存在,输出该元素的下标值,否则,给出相应的信息。 2.二分查找: 对有一个11个记录的有序表的关键字值进行二分查找: 812263745566472818995 三、实验指导 1.线性查找算法分析: 从查找表的一端开始,逐个将记录的关键字值和给定值进行比较,如果某个记录的关键字值和给定值相等,则称查找成功;否则,说明查找表中不存在关键字值为给定值的记录,则称查找失败。 算法描述: intseqsearch(intR[],intk) /*在查找表R中查找关键字为k的记录,查找成功,返回下标值,否则返回0*/ {inti; R[0]=k; i=N; while(R[i]! =k) i--; return(i);/*若i为0,表示查找失败,否则R[i]为要找的记录*/ } 实验程序: #defineN10 main() {inti,x,p; inta[N+1]={0,9,13,15,7,45,32,56,89,60,36}; scanf("%d",&x); p=seqsearch(a,k);/*调用顺序查找算法*/ if(p==0) printf("Thisnumberdoesnotexistinthisarray.\n"); else printf("a[%d]=%d\n",i,x); } 2.二分查找算法分析 先取查找表的中间位置的关键字值与给定关键字值作比较,若它们的值相等,则查找成功;如果给定值比该记录的关键字值大,说明要查找的记录一定在查找表的后半部分,则在查找表的后半部分继续使用折半查找;若给定值比该记录的关键字值小,说明要查找的记录一定在查找表的前半部分,则在查找表的前半部分继续使用折半查找。 直到查找成功,或者直到确定查找表中没有待查找的记录为止,即查找失败。 算法描述: 对有序列: 812263745566472818995 现在要查找关键字值为26和75的记录。 假设指针low和high分别指示待查元素所在区间的下界和上界,指针mid指示区间的中间位置。 给定值26的查找过程: 812263745566472818995 lowmidhigh 取mid位置的关键字值56与26作比较,显然26<56,故要查找的26应该在前半部分,所以下次的查找区间应变为[1,5],即low值不变仍为1,high的值变为mid-1=5。 再次求得mid的值为3。 812263745566472818995 lowmidhigh 取mid指示位置的关键字值26与给定值26作比较,显然是相等的,说明查找成功。 所查元素在查找表中的位置即为mid所指示的值。 查找关键字值为75的记录的过程: 812263745566472818995 lowmidhigh 取mid位置的关键字值56与75作比较,显然75>56,说明要查找的记录在后半部分,待查区间变为[7,11]。 812263745566472818995 lowmidhigh 再取mid位置的关键字值81与75作比较,显然75<81,说明待查记录在前半部分。 待查区间再次变为[7,8]。 812263745566472818995 low,midhigh 此时75>64,low=mid+1=8,待查区间变为[8,8]。 812263745566472818995 low,high,mid 显然75>72,待查区间变为low=mid+1=9,high=8,此时high 实验程序: intbinsearch(intR[],intk) {intlow,high,mid,find=0; low=1;high=n;/*置区间初值*/ while((low<=high)&&(! find)) {mid=(low+high)/2;/*求中点值*/ if(k==R[mid]) find=1;/*已查到*/ else if(k>R[mid]) low=mid+1;/*在后半区查找*/ else high=mid-1;/*在前半区查找*/ } if(find) return(mid);/*查找成功,返回找到的元素位置*/ else return(-1);/*查找失败,返回-1*/ } 四、实验报告要求 1、认真阅读和掌握本实验内容所给的程序。 2、将本实验上机运行。 3、结合运行结果,对程序进行分析。 实验五数据库的建立 一、实验目的 使学生掌握在VisualFoxPro下建立和修改数据库表的方法。 二、实验任务 1.创建职工工资管理数据库 2.录入职工基本情况及工资数据记录 3.编辑修改职工基本情况及工资数据记录 三、实验指导 1.启动项目管理器,选择新建项目,创建《职工工资管理》 2.在项目文件: 职工工资管理.PJX下,创建数据库ZGJBQK.DBC 3.在数据库ZGJBQK.DBC文件下创建数据表ZGJBQKB.DBF 4.在一表设计器下创建数据表ZGJBQKB.DBF的内容: 表结构: 字段名(标题) 字段类型 字段宽度 小数位 Gh工号 C 9 Xm姓名 C 10 Xb性别 C 2 Csrq出生日期 D 8 Hyzk婚姻状况 L 1 Gz工资 N 7 2 Zc职称 C 12 Jl简历 M 4 5.输入记录: 工号 姓名 性别 出生日期 婚姻状况 工资 职称 简历 2001052121 黄波 男 1976-01-22 T 2130.50 高级工程师 2001052125 张晓强 男 1975-05-14 F 1890.20 工程师 2001053523 汪雅智 女 1973-02-24 T 2215.00 高级工程师 2001095426 卢津 女 1976-12-02 T 2025.50 工程师 2001095566 张春燕 女 1978-06-25 F 1850.00 工程师 2003015478 张宸铭 男 1976-08-11 F 1980.10 助理工程师 2003046825 黄显辉 男 1972-08-25 T 2560.00 高级工程师 2005062548 来国群 女 1982-09-13 F 1840.50 助理工程师 2005065462 杨历 男 1983-01-03 F 1820.30 技术员 2005032546 曾令剑 男 1981-02-22 T 2050.00 助理技术员 2004542401 李小林 女 1979-05-24 T 1970.20 技术员 6.完成以下操作 a.给至少两个员工添加简历
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 基础 实验 指导书