顺序表查找
- 格式:doc
- 大小:33.00 KB
- 文档页数:4
数据结构算法实现-顺序表基本操作序号一、引言二、顺序表的定义三、顺序表的基本操作1.初始化操作2.插入操作3.删除操作4.查找操作四、顺序表的实现五、总结一、引言数据结构是计算机科学中非常重要的一部分,它是计算机存储、组织数据的方式。
而顺序表是其中的一种基本数据结构,它采用一组位置区域连续的存储单元依次存放线性表中的元素。
本文将着重介绍顺序表的基本操作及其算法实现。
二、顺序表的定义顺序表是一种基本的线性表,顺序表中元素的逻辑顺序和物理顺序是一致的。
顺序表的特点是利用一组连续的存储单元依次存放线性表中的元素。
顺序表可以用数组实现,其元素在内存中是连续存储的,可以通过下标直接访问元素。
由于顺序表的存储方式,使得其在查找、插入和删除等操作上具有较好的性能。
三、顺序表的基本操作顺序表的基本操作包括初始化、插入、删除和查找等。
下面分别介绍这些操作的实现方法。
1.初始化操作初始化操作是指将一个空的顺序表初始化为一个具有初始容量的顺序表,并为其分配内存空间。
初始化操作的实现方法主要有两种,一种是静态分配内存空间,另一种是动态分配内存空间。
静态分配内存空间时,需要预先指定顺序表的容量大小,然后在程序中创建一个数组,并为其分配指定大小的内存空间。
动态分配内存空间时,可以根据需要动态创建一个数组,并为其分配内存空间。
下面是一个简单的初始化操作的实现示例:```C代码#define MAXSIZE 100 // 定义顺序表的最大容量typedef struct {ElementType data[MAXSIZE]; // 定义顺序表的元素数组int length; // 定义顺序表的当前长度} SeqList;2.插入操作插入操作是指将一个新元素插入到顺序表的指定位置。
插入操作的实现方法主要包括在指定位置插入元素,同时对其他元素进行后移操作。
下面是一个简单的插入操作的实现示例:```C代码Status Insert(SeqList *L, int i, ElementType e) {if (i < 1 || i > L->length + 1) { // 判断插入位置是否合法return ERROR;}if (L->length >= MAXSIZE) { // 判断顺序表是否已满return ERROR;}for (int j = L->length; j >= i; j--) { // 插入位置及之后的元素后移L->data[j] = L->data[j - 1];}L->data[i - 1] = e; // 插入新元素L->length++; // 顺序表长度加1return OK;}```3.删除操作删除操作是指将顺序表中指定位置的元素删除。
顺序查找的思路顺序查找是指从一个有序表或者无序表中,一个个地去查找给定的关键字,把符合条件的关键字找出来的一种方法。
它是最简单也是最基本的一种查找算法,是一种只要能够比较和排序的查找算法。
顺序查找的思路就是:从表的第一个元素开始,依次与给定的关键字比较,若比较成功,则表示找到了要查找的关键字;若比较失败,则比较下一个元素;如此反复,直到把表中所有元素都比较一遍为止,这样就完成了顺序查找。
顺序查找的优缺点优点:1、顺序查找是基于比较的查找方法,能够支持任意的数据类型,并且不依赖于数据的存储结构;2、实现起来比较简单,查找的效率也比较高;3、它能够用在无序和有序的表中。
缺点:1、查找效率是随着表的长度而增加的,当表的长度增加,查找的时间就会越长;2、对于大规模的表来说,它效率低,比较次数较多,查找速度也较慢;3、顺序表需要较多的存储空间。
顺序查找的实现1、首先要明确要查询的关键字,然后从顺序表的第一个元素开始;2、比较每一个元素与关键字是否相同,若相同则找到了要查找的关键字;3、若不相同,则将当前元素放到下一个元素进行比较,如此循环比较;4、如果顺序表的元素都比较完,却没有找到要查找的关键字,则表示查找失败,结束查找。
顺序查找的应用1、在编程语言中,我们经常用顺序查找来查找字符串;2、在数据库系统中,也会使用顺序查找来查找特定的数据;3、在文件搜索器中,也可以使用顺序查找来搜索文件;4、在编译器中,编译器会使用顺序查找来查找关键字;5、在网络资源中,也可以使用顺序查找来搜索想要的资源。
总结顺序查找是指一次比较一个元素,然后依次比较下一个元素,直到顺序表的所有元素都比较完为止,也就是要比较整张表。
它是一种简单易实现的查找算法,能够适用于无序和有序的表中,但是由于其时间复杂度较高,在大规模的表中查找效率不高,因此开发人员不会选择它。
因此,在开发实际应用程序时,应该根据实际的情况,根据需要使用不同的查找算法,以便更好地提升查找的效率。
实验五查找的应用一、实验目的: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;(3)算法描述int Search_Seq(SSTable ST, int key){//在顺序表ST中顺序查找其关键字等于key的数据元素。
对n个元素的表做顺序查找时,若查找每
个元素
顺序表查找又称线性查找,是指从表中第一个元素开始,逐步和给定的关键字进行比较,如果顺序表中某个元素和给定的关键字相等,则表示查找成功,否则就表示查找失败顺序表中的元素越多,它的效率就越低。
因此,它只适合表中元素比较少的顺序表,如果表中的元素非常多,我们必须另想办法最糟糕的情况应该是比较到线性表最后一个值,也没有查找到所需要的值,那么从线性表的第0个值开始比较,每次取出一个值比较,不符合,再取下一个值,依次比较,一直到最后一个,那么长度为N,就需要比较N次。
从一个具有n个节点的单
链表中查找其值等于x的节点,在查找成功的情况下,平均需要比较(n+1)/2个节点。
由于单链表只能进行单向顺序查找,以从第一个节点开始查找为例,查找第m个节点需要比较的节点数f(m)=m,查找
成功的最好情况是第一次就查找成功,只用比较1个节点,最坏情况则是最后才查找成功,需要比较n个节点。
所以一共有n种情况,平均下来需要比较的节点为
(1+2+3+...+(n-1)+n)/n=(n+1)/
2。
顺序表实验报告一、实验内容和目的实验目的:掌握顺序表的建立、查找、插入和删除操作。
掌握有序表的建立、合并、插入操作。
实验内容:1. 顺序表的建立2. 顺序表的遍历3. 顺序表的元素查找4. 顺序表的元素插入5. 顺序表的元素删除6. 有序表的建立7. 有序表的遍历8. 有序表的元素插入9. 有序表的合并二、实验原理基本原理:通过连续的地址空间实现逻辑上和物理上连续的储存的一系列元素。
并在此基础上进行元素的添加,查找,删除操作。
有序表的插入算法:元素插入之前的,先跟有序表中的逐个元素进行对比,以找到合适的插入位置。
例如,已有有序表L,要向L 中插入元素18L={13,15,17,19,20,35,40}第一步:将18与L1进行比较,18 > L1,不是合适的插入位置。
第二步:将18与L2进行比较,18>L2,仍然不是不是的插入位置。
重复上述步骤,知道找到18≤Ln,然后在(n-1) 和n之间插入元素。
(如果元素比有序表中的所有元素都要大,则把该元素放到有序表的最后)此例子中,L n-1 = 17,L n = 19插入元素之后的有序表L为:L′={13,15,17,18,19,20,35,40}仍然保持有序。
重置光标的位置:程序接受两种方式的输入。
一种是输入数字后按回车,一种是利用空格间隔的连续几个数字。
然而,在使用后者输入数字的时候,会出现提示输出不正确的问题。
(如图)这个问题的原因简单如下:当程序输出“请输入第2个数字:”的时候,应该等待用户输入;然而,在程序等待输入第一个数字的时候,用户输入了五个数字。
因此,程序输出“输入第2个提示以后”,程序发现仍然有数据没有进行处理,因此把上次输入但未处理的字符当成是用户的输入。
所以没让用户输入数据就自动继续执行。
解决这个问题的思路:每次输出提示时,将光标移动到行首,因此,输出提示的时候会自动覆盖已经输出的提示信息。
效果如下:具体的解决方法:#include<windows.h>// 将光标移动到行首void ResetCursor(){HANDLE hOut;COORD cTarget;CONSOLE_SCREEN_BUFFER_INFO info;int y = 0;hOut = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hOut, &info);y = info.dwCursorPosition.Y;cTarget.X = 0;cTarget.Y = y;SetConsoleCursorPosition(hOut, cTarget);}三、程序流程图四、实现步骤4.1 创建顺序表的实现①通过scanf 函数从键盘中读入数据,并通过scanf函数的返回值判断用户输入的是数字还是非数字,作为判断输入结束的判断。
简要叙述顺序表的查找流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 确定查找的目标元素:在进行查找之前,需要明确要查找的目标元素是什么。
顺序表的查找-顺序查找查找(search):给定结点的关键字值 x ,查找值等于 x 的结点的存储地址。
按关键字 x 查:①成功,表中有 x ,返回 x 的存储地址;②不成功,x 不在表中,返回⽆效地址。
顺序查找就是以表的⼀端为起点,向另⼀个端点逐个元素查看,可以是从表头→表尾的顺序,也可以是从表尾→表头的顺序顺序查找⽅法,既适⽤于⽆序表,⼜适⽤于有序表。
顺序查找属于 “穷尽式搜索法”:通常以查找长度,度量查找算法的时间复杂性。
查找长度:即查找过程中测试的节点数⽬。
顺序查找的查找长度 = for 循环体的执⾏次数,最⼩为1,最多为n。
等概率下:平均查找长度 = (n + 1)/ 2最坏情况和平均情况:T(n)= O(n)效率最低的查找算法我们观察⼀下上图那两个 for循环体,不难发现,每次执⾏都需要判断两个条件:①测试是否循环到头;②测试是否找到元素 x。
因此我们不妨使⽤ “监督元” 技术,不仅简化了程序结构,也提⾼了查找速度。
若从表尾→表头的顺序查找,监督元则在表头处,称为 “表头监督元”,如下图:若从表头→表尾的顺序查找,监督元则在表头处,称为 “表尾监督元”,如下图:带表头监督元的顺序查找算法:int SQsearch(int a[],int x,int n){ // SQsearch 是函数名,仅此。
int i; i = n; a[0] = x; while(a[i] != x) i -- ; return i;}算法思想:① i = n;// 设置查找起点② a[0] = x;// 放置监督元,因为在进⼊循环体之前,已经预先在 a[0] 放置了⼀个元素 x,所以 x ⽆论是否真的在表中,总能找到 x ,使第三句的循环中⽌。
注意a[1] 到 a[n] 存储的才是真正的表元素。
如果 x 真存在表中,必然在某个 i ⼤于 0 时找到 x,循环终⽌。
如果循环变量 i 的值变到 0 时循环才终⽌,那就说明 x 不在表中。
顺序表查找
周次:第4周
一、实验目的
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、掌握线性表三种查找的算法。
4、对线性表相应算法的时间复杂度进行分析。
5、理解顺序表数据结构的特点(优缺点)。
二、实验环境
⒈硬件:每个学生需配备计算机一台。
⒉软件:Windows操作系统和VC++6;
三、实验要求
1.将实验中所要求的每个功能用一个函数实现。
2.每个输入前要有输入提示,每个输出数据都要求有内容说明(如:280和100的和是:380。
)。
3.函数名称和变量名称等用英文或英文简写(每个单词第一个字母大写)形式说明。
四、实验内容
1.在自己的U盘中建立“姓名+学号”文件夹,并在该文件夹中创建“实验1”文件夹(以后每次实验分别创建对应的文件夹),本次实验的所有程序和数据都要求存储到本文件夹中(以后实验都按照本次要求)。
2.阅读参考下面程序,补充完善程序并运行程序,写出结果:
(1)补充实现在顺序表中的删除功能函数,并在主函数中补充代码验证算法的正确性。
(2)补充实现在顺序表中的查找功能函数,并在主函数中补充代码验证算法的正确性。
(注意:查找功能实现顺序查找和二分查找)
3.阅读参考书上程序,实现在顺序表中的删除功能和查找功能函数,并写出结果。
(注意:2和3只要完成其中之一即可,完成后可以截图后发我qq邮箱。
)
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define INIT_SIZE 5 /*初始分配的顺序表长度*/
#define INCREM 5 /*溢出时,顺序表长度的增量*/
typedef int ElemType; /*定义表元素的类型*/
typedef struct Sqlist{
ElemType *slist; /*存储空间的基地址*/
int length; /*顺序表的当前长度*/
int listsize; /*当前分配的存储空间*/
}Sqlist;
int InitList_sq(Sqlist *L);
int CreateList_sq(Sqlist *L,int n);
int ListInsert_sq(Sqlist *L,int i,ElemType e);
int PrintList_sq(Sqlist *L);
int ListDelete_sq(Sqlist *L,int i);
int ListLocate(Sqlist *L,ElemType e);
//初始化顺序表
int InitList_sq(Sqlist *L){
L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType)); if(!L->slist) return ERROR;
L->length=0;
L->listsize=INIT_SIZE;
return OK;
}/*InitList*/
//创建顺序表
int CreateList_sq(Sqlist *L,int n){
ElemType e;
int i;
for(i=0;i<n;i++){
printf("input data %d",i+1);
printf(": ");
scanf("%d",&e);
if(!ListInsert_sq(L,i+1,e))
return ERROR;
}
return OK;
}/*CreateList*/
/*输出顺序表中的元素*/
int PrintList_sq(Sqlist *L){
int i;
for(i=1;i<=L->length;i++)
printf("%5d",L->slist[i-1]);
return OK;
}/*PrintList*/
//在顺序表中插入
int ListInsert_sq(Sqlist *L,int i,ElemType e){
int k;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize){
L->slist=(ElemType*)realloc(L->slist,
(INIT_SIZE+INCREM)*sizeof(ElemType));
if(!L->slist)
return ERROR;
L->listsize+=INCREM;
}
for(k=L->length-1;k>=i-1;k--){
L->slist[k+1]=k;
}
L->slist[i-1]=e;
L->length++;
return OK;
}/*ListInsert*/
/*在顺序表中删除第i个元素*/
int ListDelete_sq(Sqlist *L,int i)
{
}
/*在顺序表中查找指定值元素,返回其序号*/
//int ListLocate(Sqlist *L,ElemType e){
//}
//主函数
int main(){
Sqlist sl;
int n;
printf("please input n:"); /*输入顺序表的元素个数*/
scanf("%d",&n);
if(n>0){
printf("\n1-Create Sqlist:\n"); InitList_sq(&sl);
CreateList_sq(&sl,n);
printf("\n2-Print Sqlist:\n"); PrintList_sq(&sl);
}else
printf("ERROR");
return 0;
}。