利用数组进行数据查找_折半查找法_C语言程序

利用数组进行数据查找_折半查找法_C语言程序
利用数组进行数据查找_折半查找法_C语言程序

适应情况:在一批有序数据中查找某数

基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数

例7.10 假设在数组a中的数据是按由小到大顺序排列的:

-12 0 6 16 23 56 80 100 110 115,从键盘上输入一个数,判定该数是否在数组中,若在,输出所在序号;若不在,输出相应信息。

查找过程如下:

第一步:设low、mid和high三个变量,分别指示数列中的起始元素、中间元素与最后一个元素位置, 其初始值为low=0,high=9,mid=4,判断mid指示的数是否为所求,mid指示的数是23,不是要找的80,须继续进行查找。

[-12 0 6 16 23 56 80 100 110 115 ]

↑low ↑mid ↑high

第二步:确定新的查找区间。因为80大于23,所以查找范围可以缩小为23后面的数,新的查找区间为[56 80 100 110 115 ],low,mid,high分别指向新区间的开始、中间与最后一个数。实际上high不变,将low(low=mid+1)指向56,mid (mid=(low+high)/2)指向100,还不是要找的80,仍须继续查找。

-12 0 6 16 23 [ 56 80 100 110 115 ]

↑low ↑mid ↑high

第三步:上一步中,所找数80比mid指示的100小,可知新的查找区间为[56 80],low不变,mid与high的值作相应修改。mid指示的数为56,还要继续查找。

-12 0 6 16 23 [ 56 80 ] 100 110 115

↑low ↑high

↑mid

第四步:根据上一步的结果,80大于mid指示的数56,可确定新的查找区间为[80],此时,low与high都指向80,mid亦指向80,即找到了80,到此为止,查找过程完成。

-12 0 6 16 23 56 [ 80 ] 100 110 115

↑low

↑mid

↑high

若在查找过程中,出现low>high的情况,则说明,序列中没有该数,亦结束查找过程。

程序为:

#define M 10

#include

main()

{static int a[M]={-12,0,6,16,23,56,80,100,110,115};

int n,low,mid,high,found;

low=0; high=M-1; found=0;

printf("Input a number to be searched:");

scanf("%d",&n);

while(low<=high)

{mid=(low+high)/2;

if (n= =a[mid]) {found=1;break;}/*找到,结束循环*/

else if (n>a[mid]) low=mid+1;

else high=mid-1;

}

if (found==1) printf("The index of %d is %d",n,mid);

else printf("There is not %d",n);

}

输入:80↙

输出:The index of 80 is 6

C语言程序设计实验报告(数组)

C语言程序设计实验报告(数组) 1实验目的 (1)熟练掌握一维数组,二维数组的定义,初始化和输入、输出方法; (2)熟练掌握字符数组和字符串函数的使用; (3)掌握与数组有关的常用算法(查找、排序等)。 2实验内容 编写函数catStr(char str1[],char str2[])用于进行两个字符串的连接,编写函数lenStr(char str[])用于统计一个字符串的长度,并在主函数中调用。 要求: 1、不允许用strcat()和strlen()字符处理库函数; 2、在主函数以直接初始化的方式输入两个字符串str1和str2.调用函数 strlen()计算并返回两个字符串的长度; 3、调用函数catstr()连接两个字符串(将str2连接在str1后面); 4、调用函数lenstr()计算并返回连接后字符串的长度; 5、在主函数中输入两个原始的字符串及几个字符串的长度,以及处理后字 符串及其长度。

3算法描述流程图

4源程序 #include #include void catStr(char str1[],char str2[]) { int i,j; for (i=0;str1[i]!='\0';i++); for(j=0;str2[j]!='\0';j++) str1[i+j]=str2[j]; str1[i+j]='\0'; } lenStr(char m[] ) {int i;

for (i=0;m[i]!='\0';i++); printf("%d",i); } void main() {char s1[50]="forever",s2[50]="more"; printf("s1=%s,s2=%s",s1,s2); printf("\ns1的长度:"); lenStr(s1); printf("\ns2的长度:"); lenStr(s2); catStr(s1,s2); printf("\n连接后的字符:"); printf("%s\n",s1); printf("连接后字符的长度:"); lenStr(s1); printf("\n"); } 5测试数据 s1=forever, s2=more 6运行结果 7出现问题及解决方法 在输入程序时,少写了半边引号,调试时发现存在错误,找到了错误并加以改正。无论什么事,细心都是必不可少的,认真是解决问题的关键。 8实验心得 通过本次实验,对于函数的定义和声明,数组以及循环语句有了进一步的认识,掌握了字符数组和字符串函数的使用,以及与数组有关的常用算法。此次实验不是调用strlen()和strcat()函数,而是通过自己设计程序来进行字符串的连接以及计量字符串的长度,由此我学会了如何去理清自己的思路来设计程序。

顺序查找法适用于存储结构为顺序或链接存储的线行表

一判断题 1.顺序查找法适用于存储结构为顺序或链接存储的线行表。 2.一个广义表可以为其他广义表所共享。 3.快速排序是选择排序的算法。 4.完全二叉树的某结点若无左子树,则它必是叶子结点。 5.最小代价生成树是唯一的。 6.哈希表的结点中只包含数据元素自身的信息,不包含任何指针。 7.存放在磁盘,磁带上的文件,即可意识顺序文件,也可以是索引文件。8.折半查找法的查找速度一定比顺序查找法快。 二选择题 1.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。 A. n B. 2n-1 C. 2n D. n-1 2.在文件"局部有序"或文件长度较小的情况下,最佳内部排序的方法是()。 A. 直接插入排序 B.气泡排序 C. 简单选择排序 D. 快速排序 3.高度为K的二叉树最的结点数为()。 A. 2 4.一个栈的输入序列是12345,则占的不可能的输出序列是() A.54321 B. 45321 C.43512 D.12345 5.ISAM文件和V ASM文件属于() A索引非顺序文件 B. 索引顺序文件 C. 顺序文件 D. 散列文件 6. 任何一棵二叉树的叶子结点在先序,中序和后序遍历序列中的相对次序() A. 不发生变化 B. 发生变化 C. 不能确定 D. 以上都不对 7.已知某二叉树的后序遍历序列是dabec, 中序遍历序列是debac , 它的前序遍历是()。 A. acbed B. decab C. deabc D.cedba 三.填空题 1.将下图二叉树按中序线索化,结点的右指针指向(),Y的左指针指向() B D C X E Y 2.一棵树T中,包括一个度为1的结点,两个度为2的结点,三个度为3的结点,四各度为4的结点和若干叶子结点,则T的叶结点数为()

逆波兰表达式求值(实验报告及C 源码)

逆波兰表达式求值 一、需求分析 1、从键盘中输入一个后缀表达式,该表示包括加减乘除等操作符,以及正整数作为操 作数等。 2、用堆栈来实现 3、测试数据 输入:2 3 * 1 – # 输出:2 3 * 1 -- =5 二、概要设计 抽象数据类型 需要一个浮点数栈来存储还没有计算的浮点数或者运算的结果。 ADT Stack 数据成员:int size; int top; //分别用于存储栈大小、栈顶位置 float *listArray;//存储浮点型数字的数组 成员函数: bool push(float it); bool pop(float& it); bool isEmpty(); //判断栈为空 bool isOne();//判断栈是否只有一个元素 算法的基本思想 1.逐一扫描字符串,用ascii码进行判断,如果该字符是数字,则利用x=x*10+str[i]-48 将数据由字符类型转换为浮点型数据; 2.如果字符是‘.’,则将‘.’转化为小数点,并将‘.’后的数据转化为小数部分; 3.遇到空格前是数据的,将x押入栈; 4.如果该字符是’+’,’-’,’*’或’/’,判断栈里的元素是否少于两个个,如果少于两个, 报错;如果大于等于两个,就弹出两个数据,并进行相应的计算; 程序的流程 输入字符串,程序对字符串依次扫描。扫描一位,处理一位。扫描完成后,判断栈里是不是只有一个数据,若是,得到正确结果;若不是,则表达式出错。 三、详细设计 物理数据类型 用浮点数类型的栈存储运算中要用的数据,需要入栈、出栈,故设计如下的浮点类型的栈: class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack();

二叉排序树 折半查找 顺序查找 数据结构

二叉排序树 #include "c1.h" #include "stdio.h" #include "stdlib.h" typedef int KeyType; typedef struct node{ KeyType key; struct node *lchild,*rchild; }BiTNode,*BiTree; void InsertBST(BiTree &bst,KeyType key) { BiTNode *t; if(bst==NULL) { t=(BiTree)malloc(sizeof(BiTNode)); t->key=key; t->lchild=NULL; t->rchild=NULL; bst=t; } else if(keykey) InsertBST(bst->lchild,key); else if(key>bst->key) InsertBST(bst->rchild,key); } void CreateBST(BiTree &bst) { int i; int n; KeyType key=0; bst=NULL; printf("请输入二叉排序树中元素的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入二叉排序数中的第%d个元素:",i); scanf("%d",&key); InsertBST(bst,key); }

} BiTree SearchBST(BiTree bst,KeyType key) { if(!bst) return NULL; else if(bst->key==key) return bst; else if(keykey) return SearchBST(bst->lchild,key); else return SearchBST(bst->rchild,key); } int main() { BiTree bst; CreateBST(bst); KeyType temp; printf("请输入你要查找的元素:"); scanf("%d",&temp); BiTree T; T=SearchBST(bst,temp); if(T==NULL) printf("\n\n查找失败\n"); else { printf("\n\n查找成功\n"); printf("二叉排序树中查到的元素为:%d\n",T->key); } } 折半查找和顺序查找 #include "stdio.h" #include "stdlib.h" #include "c1.h" #define N 20

C语言 顺序查找和折半查找

C语言顺序查找、折半查找#include #include typedefstruct dui{ char data; struct dui *next; }linkqueue; char temp; voidinit_LIST(linkqueue *LIST) { LIST->next=NULL; } intlen_LIST(linkqueue *LIST) { int i=0; linkqueue *p; p=LIST->next; while(p!=NULL) { p=p->next; i++; } return i; } voidprint_LIST(linkqueue *LIST) { linkqueue *p; p=LIST->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); intlen=len_LIST(LIST); printf("长度为%d\n",len); }

voidcreat_LIST(linkqueue *LIST) { char x; linkqueue *p,*s; s=LIST; while((x=getchar())!='#') { p=(linkqueue *)malloc(sizeof(linkqueue)); p->data=x; p->next=NULL; s->next=p; s=p; } printf("您创建的列表是:"); print_LIST(LIST); } voidshunxu(linkqueue *LIST) { int i=0,k=1; printf("输入您要查找的元素:"); getchar(); temp=getchar(); linkqueue *p; p=LIST->next; for(;p!=NULL;p=p->next) { i++; if(p->data==temp) {printf("####顺序查找####\n您要查找的元素在第%d位,比较了%d次\n",i,i); k=0;break;} } if(k) printf("####顺序查找####\n您要查找的元素不存在。\n"); } voidzheban(linkqueue *LIST) { intlen=len_LIST(LIST); linkqueue *s; s=LIST->next; int a[100]; for(int i=0;i

五种查找算法总结

五种查找算法总结 一、顺序查找 条件:无序或有序队列。 原理:按顺序比较每个元素,直到找到关键字为止。 时间复杂度:O(n) 二、二分查找(折半查找) 条件:有序数组 原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束; 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。 如果在某一步骤数组为空,则代表找不到。 这种搜索算法每一次比较都使搜索范围缩小一半。 时间复杂度:O(logn) 三、二叉排序树查找 条件:先创建二叉排序树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3. 它的左、右子树也分别为二叉排序树。 原理: 在二叉查找树b中查找x的过程为: 1. 若b是空树,则搜索失败,否则: 2. 若x等于b的根节点的数据域之值,则查找成功;否则: 3. 若x小于b的根节点的数据域之值,则搜索左子树;否则: 4. 查找右子树。 时间复杂度:

四、哈希表法(散列表) 条件:先创建哈希表(散列表) 原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。 时间复杂度:几乎是O(1),取决于产生冲突的多少。 五、分块查找 原理:将n个数据元素"按块有序"划分为m块(m ≤ n)。 每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字; 而第2块中任一元素又都必须小于第3块中的任一元素,……。 然后使用二分查找及顺序查找。

C语言程序设计形成性考核册参考答案

一、选择题 1. 在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为(A)。 A.main B.MAIN C.name D.funtion 2.C语言原程序文件的缺省扩展名为(A)。 A.cpp B.exe C.obj D.C 3.由C语言目标文件连接而成的可执行的缺省扩展名为(B)。 A.cpp B.exe C.obj D.C 4.程序运行中需要从键盘输入多于一个数据时,各数据之间应使用(D)符号作为分隔符。A.空格或逗号 B.逗号或回车 C.回车或分号 D.空格或回车 5.每个C语言程序的编译错误分为(B)类。 A.1 B.2 C.3 D.4 6.设x和y均为逻辑值,则x && y为真的条件是(A)。 A.它们均为真 B.其中一个为真 C.它们均为假 D.其中一个为假 7.设有语句“int a=12;a+=a*a;”,则执行结束后,a的值为(C)。 A.12 B.144 C.156 D.288 8.x>0 && x<=10的相反表达式为(A)。 A.x<=0 || X>10 B.x<=0 && x>10 C.x<=0 || x<=10 D.x>0 && x>10 9.字符串“a+b=12\n”的长度为(B)。 A.6 B.7 C.8 D.9 10.在下列符号常量定义中。错误的定义语句格式为(C)。 A.const M1=10; B.const int M2=20; C.const M3 10 D.const char mark=’3’; 11.带有随机函数的表达式rand()%20的值在(C)区间内, A.1~19 B.1~20 C.0~19 D.0~20 12.当处理特定问题时的循环次数已知时,通常采用(A)循环来解决。 A.for B.while C.do-while D.switch 13.在switch语句的每个case块中,假定都是以break语句结束的,则此switch语句容易被改写为(B)语句。 A.for B.if C.do D.while 14.for语句能够被改写为(D)语句。 A.复合 B.if C.switch D.while 15.下面循环语句执行结束后输出的i值为(B)。 for(int i=0;in/2){cout<

各种查找算法的性能比较测试(顺序查找、二分查找)

算法设计与分析各种查找算法的性能测试

目录 摘要 (3) 第一章:简介(Introduction) (4) 1.1 算法背景 (4) 第二章:算法定义(Algorithm Specification) (4) 2.1 数据结构 (4) 2.2顺序查找法的伪代码 (5) 2.3 二分查找(递归)法的伪代码 (5) 2.4 二分查找(非递归)法的伪代码 (6) 第三章:测试结果(Testing Results) (8) 3.1 测试案例表 (8) 3.2 散点图 (9) 第四章:分析和讨论 (11) 4.1 顺序查找 (11) 4.1.1 基本原理 (11) 4.2.2 时间复杂度分析 (11) 4.2.3优缺点 (11) 4.2.4该进的方法 (12) 4.2 二分查找(递归与非递归) (12) 4.2.1 基本原理 (12) 4.2.2 时间复杂度分析 (13) 4.2.3优缺点 (13) 4.2.4 改进的方法 (13) 附录:源代码(基于C语言的) (15) 声明 ................................................................................................................ 错误!未定义书签。

摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归)

C语言_算术表达式求值_代码

源代码: //用来存储字符的结点类型 typedef struct CharNode { char c; struct CharNode *next; }CharNode; //用来存储数的结点类型 typedef struct IntNode { long double i; struct IntNode *next; }IntNode; //用来存储数的结点类型 typedef struct Node { long double n; struct Node_ys_char *next; }Node; //用来存储运算符的结点类型 typedef struct Node_ys_char { char c; struct Node_ys_char *next_c; struct Node *next; }Node_ys_char; char Precede(char x,char y)//运算符优先级判断{ int i,j; int from[5][5] ={ {0,0,-1,-1,0}, {0,0,-1,-1,0}, {1,1,0,0,1},

{1,1,0,0,1}, {0,0,-1,-1,0} };//定义一个二维数组存放算术符号的优先级 switch(x) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '#':i=4;break; } switch(y) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '#':j=4;break; } if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return '>'; if(from[i][j]==-1) return '<'; else return '='; } //输入表达式,并对特殊情况做处理 CharNode *CreatRegister() { CharNode *top,*p,*q,*e; top=(CharNode *)malloc(sizeof(CharNode)); p=q=top; scanf("%c",&p->c); scanf("%c",&p->c);

数据结构——查找,顺序查找,折半查找

实验五查找的应用 一、实验目的: 1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。 2、增强上机编程调试能力。 二、问题描述 1.分别利用顺序查找和折半查找方法完成查找。 有序表(3,4,5,7,24,30,42,54,63,72,87,95) 输入示例: 请输入查找元素:52 输出示例: 顺序查找: 第一次比较元素95 第二次比较元素87 …….. 查找成功,i=**/查找失败 折半查找: 第一次比较元素30 第二次比较元素63 ….. 2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查 询。 输入输出示例同题1的要求。 三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明) (1)逻辑结构设计 顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。 (2)存储结构设计 采用顺序存储的结构,开辟一块空间用于存放元素。

(3)存储结构形式说明 分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据 四、算法设计 (1)算法列表(说明各个函数的名称,作用,完成什么操作) 序号 名称 函数表示符 操作说明 1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素 2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素 3 初始化 Init 对顺序表进行初始化,并输入元素 4 树初始化 CreateBST 创建一棵二叉排序树 5 插入 InsertBST 将输入元素插入到二叉排序树中 6 查找 SearchBST 在根指针所指二叉排序树中递归查找关键字 数据元素 (2)各函数间调用关系(画出函数之间调用关系) typedef struct { ElemType *R; int length; }SSTable; typedef struct BSTNode{ Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针 }BSTNode,*BSTree; typedef struct Elem{ int key; }Elem; typedef struct { int key;//关键字域 }ElemType;

《C语言程序设计》第7章 数组

第7章数组 第1次课:2学时 一、教学内容 1、一维数组的定义和引用 2、二维数组的定义和引用 二、教学目标 1.了解一维数组、二维数组的基本概念; 2.掌握数组的定义与引用; 3.掌握数组元素的引用 三、教学重点及难点 重点:数组的定义和引用 难点:数组的定义和引用 四、教学方法 多媒体教学,案例驱动,实例演示,提问。 五、教学过程设计 在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。 7.1 一维数组的定义和引用 7.1.1 一维数组的定义方式 在C语言中使用数组必须先进行定义。 一维数组的定义方式为:类型说明符数组名[常量表达式]; 其中:类型说明符是任一种基本数据类型或构造数据类型;数组名是用户定义的数组标识符;方括号中的常量表达式表示数据元素的个数,也称为数组的长度。 对于数组类型说明应注意以下几点: (1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。 (2) 数组名的书写规则应符合标识符的书写规定。 (3) 数组名不能与其它变量名相同。 (4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a 有5 个元素。但是其下标从0 开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。 (5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

C++源程序顺序查找与二分查找

一、实验目的 1、掌握顺序查找和二分查找方法的基本思想及其实现技术 2、了解顺序查找和二分查找方法的优缺点和适用范围 二、实验内容(任务、要求或步骤等) 【问题描述】实现在有n个元素的顺序表上的顺序查找和二分查找。 【基本要求】 (1)编写一个创建函数,建立并输出一个有n个元素的顺序表,数据元素为整型。顺序表长度和顺序表的各数据元素由键盘输入。 (2)编写函数实现在有n个元素的顺序表上的顺序查找。 (3)编写函数实现在有n个元素的递增有序的顺序表上的二分查找。 (4)提供菜单,供用户选择要执行的操作,根据用户选择调用相应函数实现顺序查找和二分查找 三:源程序 二分查找如下 #include using namespace std; struct ssTable{ int *elem; int length; } ; void CreatssTable(ssTable &s) { int i; cout<<"请输入表长:"; cin>>s.length; s.elem=new int[s.length+1]; cout<<"\n请输入表中的各个元素"; for(i=1;i<=s.length;i++) cin>>s.elem[i]; } int SeqSearch(ssTable s,int key) { int i;

s.elem[0] = key; // “哨兵” for (i=s.length; s.elem[i]!=key; --i); return i; // 找不到时,i为0 } void main () {ssTable s; int x, pos; CreatssTable(s); cout<<"请输入要查找的值"; cin>>x; pos=SeqSearch(s,x); if(pos>0)cout< using namespace std; struct ssTable{ int *elem; int length; } ; void CreatssTable(ssTable &s) { int i; cout<<"请输入表长:"; cin>>s.length; s.elem=new int[s.length+1]; cout<<"\n请按升序输入表中的各个元素"; for(i=1;i<=s.length;i++) cin>>s.elem[i]; } int BinSearch(ssTable s,int key) { int low,high,mid; low = 1; high = s.length; // 置区间初值 while (low <= high) { mid = (low + high) / 2; if (key==s.elem[mid] ) return mid; // 找到待查元素 else if ( key

输出在顺序表{3,6,2,10,1,8,5,7,4,9},中采用顺序方法查找关键字5的过程。

/* 设计一个程序exp9-1.cpp, 输出在顺序表{3,6,2,10,1,8,5,7,4,9} 中采用顺序方法查找关键字5的过程。 */ #include #define MAXL 100 //定义表中最多记录个数 typedef int KeyType; typedef char InfoType[10]; typedef struct { KeyType key; //KeyType为关键字的数据类型InfoType data; //其他数据 } NodeType; typedef NodeType SeqList[MAXL]; //顺序表类型 int SeqSearch(SeqList R,int n,KeyType k) //顺序查找算法 { int i=0; while (i=n) return -1; else { printf("%d",R[i].key); return i; } } void main() { SeqList R; int n=10,i; KeyType k=5; int a[]={3,6,2,10,1,8,5,7,4,9}; for (i=0;i

printf("\n"); printf("查找%d所比较的关键字:\n\t",k); if ((i=SeqSearch(R,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d不在表中\n",k); printf("\n"); }

C语言上机实验报告书 表达式求值实验报告

一.需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4) 包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')'; (2)输出的形式:运算结果,例如2*(3+4)=14; (3)程序所能达到的功能:对表达式求值并输出 二.系统设计 1.栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={|ai-1,ai∈D,i=2,…,n} 约定an端为栈顶,ai端为栈底 基本操作: Push(&S,e) 初始条件:栈S已存在 操作结果:插入元素e为新的栈顶元素 Pop(&S,&e) 初始条件:栈S已存在且非空 操作结果:删除S的栈顶元素,并用e返回其值 }ADT Stack 2.主程序的流程: EvaluateExpression()函数实现了对表达式求值的功能,main()函数直接调用EvaluateExpression()对输入的表达式求值输出

3.各个模块的主要功能: *Push(SC *s,char c):把字符压栈 *Push(SF *s,float f):把数值压栈 *Pop(SC *s):把字符退栈 *Pop(SF *s):把数值退栈 Operate(a,theta,b):根据theta对a和b进行'+' 、'-' 、'*' 、'/' 、'^'操作 In(Test,*TestOp):若Test为运算符则返回true,否则返回false ReturnOpOrd(op,*TestOp):若Test为运算符,则返回此运算符在数组中的下标precede(Aop,Bop):根据运算符优先级表返回Aop与Bop之间的优先级EvaluateExpression(*MyExpression):用算符优先法对算术表达式求值 三.调试分析 (1)刚开始只编写了一个Push和一个Pop函数,但因为在EvacuateExpression()里既有运算符入/出栈,又有运算数入/出栈,运行下来总是出错。所以就编写了两个不同的Push和Pop函数,分别使用。 四.测试结果 2+3*4/5-1 输入表达式: 输入表达式:5*(10-2*3)-8

二分查找和顺序查找

上机实验报告 实验课题:实现对有序数据集合的顺序查找和二分查找,并展示出查找过程 设计思路: 我们可以采用数组有序的保存所有数据,这样便于将数据的有序性和其索引的有序性统一起来,同时也便于查找数据。需要声明的是,我们不使用零下标的项,这样做是为了在顺序查找中优化传统顺序查找算法,具体原因后面会有详细介绍。为此,我们可以设计一个类,私有变量声明为该数组和数组的长度。由于集合中的数据类型未知,所以该类为模板类。 对于公有成员,我们创建六个成员函数,除了构造函数和析构函数,其他四个函数分别用来获取外界传入的数组长度、获取外界传入的数组数据、对数据实现顺序查找、对数据实现二分查找。 这里,我们只重点介绍顺序查找函数和二分查找函数。 对于顺序查找,我们对传统的顺序查找方法进行优化,避开每次对数据索引是否越界进行判断这一步骤。具体做法是:将所查找的元素保存在零下标的项中(这也是零下标闲置的原因),然后按照下标顺序从后向前依次遍历匹配所查找元

素与数组元素。若两者相等,展示出该数组元素,并将其下标值反馈给客户;若两者不相等,展示出该元素,进行下一轮匹配。若最终标记下标达到零下标处,说明未查找到所要查找的元素,则客户反馈该信息。 优化后的顺序查找算法比传统的顺序查找算法减少一半的步骤,原因在于每次无须判断标记下标是否越界,这是该算法优化后的优点。它的缺点是没有利用到数据集合有序这一性质,且查找效率低。 对于二分查找,我们声明三个整型变量low、high和mid 依次标记查找域的上界下标、下界下标和中值下标,其中mid=(low+high)/2。我们在开始的时候将low初始化为1(上文中提到过,我们是从下表为1的位置开始存储数据),将high初始化为len(数组长度),并由此初始化mid的值。对于任意一次查找,将索引为mid的值与所查找的值进行比较。若两者相等,则将该元素的索引值反馈给客户;若所查找的值比索引为mid的值小,则将high的值变为mid-1,进行下一轮的查找;若所查找的值比索引为mid的值大,则将low 的值变为mid+1,进行下一轮查找。若最终low>high,则表明未查找到所要查找的值,将此信息反馈给客户。 该算法是一种效率很高的算法,因为它充分利用到数据集合的有序性,这一优点在数据规模较大时体现的更明显。

c语言表达式题库

C语言程序设计表达式 一、表达式求值 1.表达式:!(4<=6)&&(3<=7) 的值为_______ 0 2.表达式:x=!(2<5==5) 的值为【1】1 3.如果有变量定义:int i=1,j=8,a;则表达式:a=i+(j%4!=0) 的值为_【1】1 4.表达式:x=(7+6)%4/2 的值为【1】0 5.如果有变量定义:int x,则表达式:x=-3*4%-6/50 的值为【1】0 6.如果有变量定义:int x ,则表达式:x=3+7%5-6 的值为【1】-1 7.如果有变量定义:int x,则表达式:x=-3+4/5-6 的值为【1】-9 8.如果有变量定义:int x=3,y=4,z=4则表达式:z>=y&&y>=x 的值为_____ 1 9.如果有变量定义:int x=3,y=4,z=4则表达式:(z>=y>=x)1:0 的值为____ 0 10.如果有变量定义:int x=0,y=0,z=0则表达式:k=++x&&++y||++z 的值为_____ 1 11. 如果有变量定义:int x=0,y=0,z=0则表达式:k=++x||++y&&++z 的值为______ 1 12. 如果有变量定义:int x=40,y=4,z=4则表达式:x=x==(y-z) 的值为____ 0 13.如果有变量定义:int a=15,则表达式:a=a<<1 的值为【1】30 14.如果有变量定义:int y;char x='a';则表达式:y='a'+1 的值为【1】98 15.如果有变量定义float x=,y=则表达式:xb a : c>d c : d 的值为 【1】 5 17.如果有变量定义:int a=1,b=3,m 则表达式:m=a>b a : b+1 的值为【1】4 18.如果有变量定义:int a=1,b=2则表达式:(!a)||(a>b) 的值为_______ 0 19. 如果有变量定义:int a=1,b=2,c=1,x=4,y=5则表达式:!a&&b||x>y&&c 的值为______ 0 20如果有变量定义:int a=12,n=5则表达式:a%=(n%=2) 的值为_______ 0 21如果有变量定义:int a=2, b=3;float x=, y=则表达式:(float)(a+b)/2+(int)x%(int)y 的值为【1】22如果有变量定义:int x=, y=则表达式:z=(int)x%(int)y 的值为【1】1 23如果有变量定义:int x=,a=7,y=则表达式:k=a%3*(x+y)/2 的值为【1】3 24如果有变量定义:int a=5则表达式:a*=1+3 的值为【1】20 25如果有变量定义:int a,b则表达式:b=(a=3*4, a*4),a+5 的值为【1】17 26如果有变量定义:int a,b 则表达式:x=a=3,5*a 的值为【1】15 27如果有变量定义:int a=120 则表达式:a%=(5%2) 的值为【1】0 28如果有变量定义:int a=10则表达式:a+=a-=a*=a 的值为【1】0 29 如果有变量定义:int a=10则表达式:a+=a-=a*a 的值为【1】-180 30 如果有变量定义:int i=3则表达式:j=i++ 的值为【1】3 31如果有变量定义:int i=3则表达式:j=++i 的值为【1】4 32表达式5&7的值为【1】,5│7的值为【2】. 5 7

顺序表查找算法的实现

算法与数据结构讲义实验五图的建立及遍历操作 一、实验目的 1.掌握图的存储结构和相关操作。 2.能够熟练用计算机来表示图和进行图处理。 二、实验环境 1.硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; 2.软件:DOS或Windows操作系统+Turbo C; 三、实验要求 1.要求对于给定的图分别用邻接矩阵和邻接表示来存储。 2.对于存储好的图进行深度和广度优先遍历。 3.完成图的各种操作。 四、实验内容 1.现在某网络公司的光纤连接结点如下图所示,请分别用邻接矩阵和邻接表将图存储到计算机中方便进行处理。 2.现在某网络公司的光纤连接结点如下图所示,请分别用邻接矩阵和邻接表将图存储到计算机中方便进行处理。 五、代码如下 第一个实验 #include #include using namespace std; #define MAX 20 typedef int Adj[MAX][MAX]; typedef struct{ string vexs[MAX]; //顶点表 Adj arcs; //邻接矩阵 int vexnum,arcnum; //图的顶点和弧数}MGraph; int ylx_LocateVex(MGraph &G,string u); int ylx_CreateUDN(MGraph &G){ int i,k,j;string v1,v2; cout<<"请输入顶点数、弧数:"; cin>>G.vexnum>>G.arcnum; cout<<"输入顶点:"; for(i=0;i>G.vexs[i]; //构造顶点数} for(i=0;i>v1>>v2; i=ylx_LocateVex(G,v1); j=ylx_LocateVex(G,v2); G.arcs[i][j]=1; G.arcs[j][i]=1; //置的对称弧 } return 0;} int ylx_LocateVex(MGraph &G,string u){ //确定u在G中序号 int i; for (i=0;i

相关文档
最新文档