1、计算机软件技术基础实验手册计算机软件技术基础实验教学大纲 一、基本信息课程编码020213050课程学时56课程类别技术基础课实验总学时4开出学期第六学期开出单位信息学院计算机系适用专业自动化、电子信息工程、通信工程二、实验安排序号实 验 项 目实验学时每组人数实验类型开出要求1线性表的建立与遍历21验证性必做二叉树的建立与遍历21验证性必做三、实验目的、内容与要求实验一 线性表的建立与遍历(一) 实验目的进一步理解线性表的逻辑结构和存储结构,掌握线性表的建立与遍历算法。(二) 实验内容1、给定一个输入序列,建立顺序表,访问输出顺序表中各结点的内容。2、给定一个输入序列,建立线性链表,访问输出
2、线性链表中各结点的内容。(三) 实验要求1、掌握线性表的建立与遍历算法的实现;2、根据实验内容,用C语言编程实现,上机调试运行得出实验结果;3、写出预习报告和实验报告。实验二 二叉树的建立与遍历(一) 实验目的进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。(二) 实验内容1、 用二叉链表创建二叉树输入根结点值;若左子树不空,则输入左子树,否则输入一个结束符;若右子树不空,则输入右子树,否则输入一个结束符。例如:FCADBEGHP 其中表示结束符2、遍历该二叉树(1) 前序遍历(DLR)若二叉树为空,则结束返回。否则:访问根结点;前序遍历左子树;前序遍历右子树。(2) 中序遍
3、历(LDR)若二叉树为空,则结束返回。否则:中序遍历左子树;访问根结点;中序遍历左子树。(3) 后序遍历(LRD)若二叉树为空,则结束返回。否则:后序遍历左子树;后序遍历左子树;访问根结点。(三) 实验要求1、掌握二叉树的建立与遍历算法的实现;2、根据实验内容,用C语言编程实现,上机调试运行得出实验结果;3、写出预习报告和实验报告。四、考核方式根据实验课考勤、课前预习情况、课上实验能力、原型系统效果验收与实验报告的完成情况确定最终的实验成绩,实验成绩占课程总成绩的10%。五、建议教材与教学参考书1、课程教材1 沈被娜等编.计算机软件技术基础(第三版).北京.清华大学出版社.20002、实验指导
4、书1 计算机软件技术基础实验指导书. 赵俊生(自编). 2009六、编制说明编制者:赵俊生 组长:赵俊生执笔人:赵俊生 编制时间:2009年3月实验一 线性表的建立与遍历一、实验目的进一步理解线性表的逻辑结构和存储结构,掌握线性表的建立与遍历算法二、 实验题目 线性表的建立与遍历三、实验类型 验证性四、实验内容1、给定一个输入序列,建立顺序表,访问输出顺序表中各结点的内容。2、给定一个输入序列,建立线性链表,访问输出线性链表中各结点的内容。五、实验要求根据实验内容,用C语言编程实现,上机调试运行得出实验结果,写出实验报告。六、实验提示1、线性结构中的所有结点按它们之间的关系可以排成一个线性序列
5、: k1,k2,kn其中k1是开始结点,kn是终端结点,ki是ki+1的前驱结点,而ki+1是ki的后继结点(i=1,2,n-1)。通常把上述线性序列称为“线性表”,把线性结构中的结点称为元素或“表目”。将一个线性表存放到计算机中,可以采用不同的方法,其中最简单而自然的就是顺序的方法,即把表目按其索引值从小到大一个接一个地存放在相邻的单元里。顺序方法存储的线性表简称“顺序表”,顺序表是一种紧凑结构。2、常用的链表有单链表和双链表。在单链表中分配给每个结点的存储单元可分为两个部分:一部分存放结点的数据,称为data域,另一部分存放指向结点后续结点的指针,称为next域,终端结点没有后继结点,其n
6、ext域为NULL,在计算机中可以表示成零或负数,另外还需要一个表头变量head指向链表的第一个结点。七、实验报告1、写出每个算法的思想。2、画出算法流程图。3、调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果并写出实验体会。6、报告按信息学院统一格式书写。八、范例参考1、顺序表1 向量的建立 做向量的定义如下: typedef ElemType vectorn0输入n个整数,产生一个存储这些整数的向量A的函数如下:void create(A,n)vector A;int n; int i; for(i=1;i=n;i+)scanf(“%d”,Ai);2 向量
7、的插入 做在一个有n个元素的向量A中的第i个元素之前插入一个元素x的函数如下:void insert(A,n,x)vector A;int n,x; int j; if(in) printf(“i值错误!n”); else for(j=n;j=i;j-) Aj+1=Aj; /*将第i个元素及其后的元素后移*/Ai=x;n+; /*向量长度增1*/向量的删除在一个有n个元素的向量A中删除第i个元素的函数如下:void delete (A,n)vector A;int n; int j;if(in)printf(i值错误!n);else for(j=i;j=n;j+)Aj=Aj+1;/*将第i个元
8、素之后的元素前移*/ n-; 向量的查找 在一个有n个元素的向量A中查找元素值为x的元素的函数如下: void find(A,n,x) vector A; int n,x; int i; i=1; while(i=n&Aix)i+; if(idata=x; p-next=s; p=s; else cycle=0; head=head-next; /*删除头结点*/ p-next=NULL; 查找某个结点 在已建立好的单链表(表头指针为head)中查找元素值为x的函数如下: void find(head,x) node *head; int x; node *p; p=head; while(p
9、-data!=x&p!=NULL)p=p-next; if(p!=NULL) printf(结点找到了!n); else printf(结点未找到!n); 求单链表的长度 计算一个已建立好的单链表(表头指针为head)的结点个数的函数如下: int length(head) node head; int n=0; node *p; p=head; while(p!=NULL) p=p-next; n+; return(n); 在单链表中插入一个结点 在单链表中第i个结点(i0)之后插入一个元素为x的结点的函数如下: void insert(head,i,x) node *head; int i
10、,x; node *s,*p; int j; s=(node *)malloc(sizeof(node); /*建立一个待插入的结点s*/ s-data=x; if(i=0) /*如果i=0,则将s所指结点插入到表头后返回*/ s-next=head; head=s; else p=head;j=1; /*在单链表中查找第i个结点,由p所指向*/ while(p!=NULL&jnext; if(p!=NULL) /*若查找成功,则把s插入到其后*/ s-next=p-next; p-next=s; else printf(未找到!n); 从单链表中删除一个结点 做 从单链表中删除一个其值等于给
11、定值x的结点的函数如下: void delete(head,x) node *head; int x; node *p,*q; if(head=NULL)printf(链表下溢!n);/*如果单链表为空,则下溢处理*/ if(head-data=x) /*如果表头结点值等于x值,则删除之*/ p=head; head=head-next; free(p); else q=head;p=head-next; /*从第二个结点开始查找其值为x的结点*/ while(p!=NULL&p-data!=x) if(p-data!=x) /*在查找时,p指向该结点,q指向其前一结点*/ q=p;p=p-n
12、ext; if(p!=NULL) /*若找到了该结点,则进行删除处理*/ q-next=p-next; free(p); else /*未找到时,显示相应信息*/ printf(未找到!n); 建立、遍历单链表(方法二)int count_nohead(LINKLIST *head)/*不带头结点的单链表:输出单链表元素值并计数*/ int i = 0; LINKLIST *p; p = head; printf(输出单链表元素值 : ); while(p != NULL) printf( %c,p-data); i+; p = p-next; printf(n); return i;int
13、count_head(LINKLIST *head)/*带头结点的单链表:输出单链表元素值并计数*/ int i = 0; LINKLIST *p; p = head-next; printf(输出单链表元素值 : ); while(p != NULL) printf( %c,p-data); i+; p = p-next; printf(n); return i;LINKLIST *creatlink_nohead_head(LINKLIST *head) /*用头插入法建立不带头结点的单链表*/ LINKLIST *t; char ch; printf(单链表元素值为单个字符, 连续输入,
14、$为结束字符 : ); while(ch = getchar()!= $) t = (LINKLIST *) malloc(sizeof(LINKLIST); t-data = ch; t-next = head; head = t;return(head);LINKLIST *creatlink_head_head(LINKLIST *head) /*用头插入法建立带头结点的单链表*/ LINKLIST *t; char ch; t = (LINKLIST *)malloc(sizeof(LINKLIST); head = t; t-next = NULL; printf(单链表元素值为单个
15、字符, 连续输入,$为结束字符 : ); while(ch = getchar()!= $) t = (LINKLIST *) malloc(sizeof(LINKLIST); t-data = ch; t-next = head-next; head-next = t; return(head);LINKLIST *creatlink_nohead_rail(LINKLIST *head)/*用尾插入法建立不带头结点的单链表*/ LINKLIST *last, *t; char ch; last = head; printf(单链表元素值为单个字符, 连续输入,$为结束字符 : ); whi
16、le (ch = getchar() != $) t = (LINKLIST *)malloc(sizeof(LINKLIST); t-data = ch; t-next = NULL; if (head = NULL) head = t; last = t; else last-next = t; last = t; return (head);LINKLIST *creatlink_head_rail(LINKLIST *head)/*用尾插入法建立带头结点的单链表*/ LINKLIST *last, *t; char ch; t = (LINKLIST *)malloc(sizeof(L
17、INKLIST); head = t; last = t; t-next = NULL; printf(单链表元素值为单个字符, 连续输入,$为结束字符 : ); while (ch = getchar() != $) t = (LINKLIST *)malloc(sizeof(LINKLIST); t-data = ch; t-next = NULL; last-next = t; last = t; return (head);LINKLIST *creatlink_order_head(LINKLIST *head)/*建立带头结点的有序单链表*/ LINKLIST *t, *p, *q
18、; char ch; t = (LINKLIST *)malloc(sizeof(LINKLIST); head = t; t-next = NULL; printf(单链表元素值为单个字符, 连续输入,$为结束字符 : ); while (ch = getchar() != $) t = (LINKLIST *)malloc(sizeof(LINKLIST); t-data = ch; q = head; p = head-next; while( p != NULL & p-data next; q-next = t; t-next = p; return(head);main() LIN
19、KLIST *head, *a1, *a2, *c; int num = 0,loop,j; char ch; loop = 1; while (loop) printf(nn); printf( 1 - 建立单链表(头插入,不带头结点)n); printf( 2 - 建立单链表(头插入,带头结点)n); printf( 3 - 建立单链表(尾插入,不带头结点)n); printf( 4 - 建立单链表(尾插入,带头结点)n); printf( 请选择项号 : ); scanf(%d,&j); fflush(stdin); printf(nn); if(j = 1 & j = 10) swit
20、ch(j) case 1: printf(n 建立单链表nn); head = NULL; head = creatlink_nohead_head(head); fflush(stdin); num = count_nohead(head); printf(单链表元素个数 = %dn, num); break; case 2: printf(n 建立单链表nn); head = NULL; head = creatlink_head_head(head); fflush(stdin); num = count_head(head); printf(单链表元素个数 = %dn, num); b
21、reak; case 3: printf(n 建立单链表nn); head = NULL; head = creatlink_nohead_rail(head); fflush(stdin); num = count_nohead(head); printf(单链表元素个数 = %dn, num); break; case 4: printf(n 建立单链表nn); head = NULL; head = creatlink_head_rail(head); fflush(stdin); num = count_head(head); printf(单链表元素个数 = %dn, num); b
22、reak; printf(结束此练习吗? (0 - 结束 1 - 继续) : ); scanf(%d,&loop); printf(n); 实验二 二叉树的建立与遍历一、 实验目的进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。二、 实验题目二叉树的建立与遍历三、 实验类型验证性四、实验内容1、用二叉链表创建二叉树输入根结点值;若左子树不空,则输入左子树,否则输入一个结束符;若右子树不空,则输入右子树,否则输入一个结束符。例如:FCADBEGHP 其中表示结束符2、遍历该二叉树(1) 先序遍历(DLR)若二叉树为空,则结束返回。否则:访问根结点;先序遍历左子树;先序遍历右子树
23、。(2) 中序遍历(LDR)若二叉树为空,则结束返回。否则:中序遍历左子树;访问根结点;中序遍历左子树。(3) 后序遍历(LRD)若二叉树为空,则结束返回。否则:后序遍历左子树;后序遍历左子树;访问根结点。五、实验要求根据实验内容,用C语言编程实现,上机调试运行得出实验结果,写出实验报告。六、实验提示1、以二叉链表的存储结构的方式创建如下图的二叉树creatree 可以采用数据类型定义:typedef struct node datatype data; /每个结点的数据域 struct node *lchild, *rchild; / 结点的左孩子指针域lchild,右孩子指针域rchild
24、JD;2试以上题已建立的二叉链表为已知二叉树,编写按先序、中序和后序遍历二叉树的算法七、实验报告1、写出每个算法的思想。2、画出算法流程图。3、调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果并写出设计体会。6、报告按信息学院统一格式书写。八、范例参考1、 问题描述(两种方法建立二叉树)1) 做二叉树的建立:设有一棵二叉树如图(a),将二叉树模拟为完全二叉树从根开始对结点进行编号,编号从1 开始,结果如图(b)所示。在运行过程中要求输入结点对应的编号和值时,请按图(c)中的数据输入,最后以编号 I=0;结点值x=$结束。2) 二叉树中序遍历:对建立的二叉树进行
25、中序遍历,并输出遍历结果.中序遍历算法可以用递归算法实现,也可以用非递归算法实现.2、程序清单#include #include datastru.h#include typedef struct node1char data;struct node1 *lchild,*rchild;BTCHINALR;BTCHINALR * createbt( ) BTCHINALR *q; struct node1 *s30; int j,i,x; printf(建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开nn); printf(i,x = ); scanf(%d,%c,&i,&x); wh
26、ile(i != 0 & x != $) q = (BTCHINALR*)malloc(sizeof(BTCHINALR); /*建立一个新结点q*/ q-data = x; q-lchild = NULL; q-rchild = NULL; si = q; /*q新结点地址存入s指针数组中*/ if(i != 1) /*i = 1,对应的结点是根结点*/ j = i / 2; /*求双亲结点的编号j*/ if(i % 2 = 0) sj-lchild = q; /*q结点编号为偶数则挂在双亲结点j的左边*/ else sj-rchild = q; /*q结点编号为奇数则挂在双亲结点j的右边*/ printf(i,x = ); scanf(%d,%c,&i,&x); return s1; /*返回根结点地址*/void inorder(BTCHIN
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1