顺序查找、直接查找、折半查找算法
内蒙古科技大学
题目:数据结构课程设计学生姓名:保祥
学号:0865138236
专业:信息管理与信息系统班级:信管2班
指导教师:杨振华
一.顺序表的操作
(1)插入元素操作:将新元素x插入到顺序表a中第i个位置。
(2)删除元素操作:删除顺序表a中第i个元素。
操作代码如下:
#include
#define MAX 20
typedef int datatype;
typedef struct
{datatype data[MAX]; int list;} sequenlist; /*顺序表*/ int main()
{int insert( sequenlist *L, int x, int i );
int deletee( sequenlist *L, int i );
int input( sequenlist *L ); /
int output( sequenlist *L );
sequenlist s,*p=&s;
int indata,inlocate,deletedx;
input(p);
printf("请输入要插入的数:");
scanf("%d",&indata);
printf("请输入要插入的位置:");
scanf("%d",&inlocate);
insert( p,indata,inlocate );
printf("插入后的数据:");
output(p);
printf("请输入要删除的位置:");
scanf("%d",&deletedx);
deletee( p, deletedx );
printf("删除后的数据:");
output(p);
return 0;}
int output(sequenlist *L)
{int i; for ( i=0; i<=L->list; i++ ) printf("%d ",L->data[i]);printf("\n\n");return(1);} int input( sequenlist *L )
{int i; printf("请输入原始数据个数:");
scanf("%d",&(L->list));L->list--; printf("请输入原始数据:");
for ( i=0; i <= L->list; i++ ) scanf("%d",&(L->data[i]));
printf("原始数据为:");
output(L);
return (1);
}
int insert( sequenlist *L, int x, int i )
{ int j;
if ( ((*L).list)>=MAX-1 )
{ printf("overflow"); return 0; }
else
{if ( (i<1) || ( i > ((*L).list)+1 ) )
{ printf("error"); return 0; }
else
{ for ( j=L->list; j>=i-1; j-- )
L->data[j+1]=L->data[j];L->data[i-1]=x; L->list++; } }
return(1);}
int deletee( sequenlist *L, int i ) /*定义删除函数*/
{ int j;if ( (i<1) || ( i > (L->list)+1 ) )
{ printf("error");
return 0;
} else { for ( j=i; j<=L->list; j++ )
L->data[j-1]=L->data[j]; L->list--; }
return (1);}
图一
二、单链表的操作
(1)创建一个带头结点的单链表;
(2)插入元素操作:将新元素x插入到单链表中第i个元素之后;(3)删除元素操作:删除单链表中值为x的元素;
代码如下:
#include
#include
typedef struct node //定义链表
{ int data;
struct node *next;
}snode;
snode* creat() //创建链表的函数
{ snode *head, *p, *q;
head = (snode *)malloc(sizeof(snode));
p = head;
int x;
printf("请输入创建链表的值,用-1结束输入");
printf("x = ");
scanf("%d", &x);
while (x != -1)
{ q = (snode *)malloc(sizeof(snode));
q->data = x;
p->next = q;
p = q;
printf("x = ");
scanf("%d", &x); }
p->next = NULL; return head;}
int length(snode *head)//测链表的结点数
{ int i = 0; snode *p = head->next;
while (p != NULL)
{ p = p->next; i++; } return i;}
void display(snode *head)
{ snode *p = head->next;
for(int i = 0; i < length(head); i++)
{ printf("%4d", p->data);
p = p->next; }
printf(" ");
}
int locate(snode *head, int x)
{snode *p = head->next;
int i = 1;
while (p != NULL && x != p->data)
{ p = p->next; i++; }
if (p == NULL) return 0;
else return i;
}
int insnode(snode *head, int x, int i) //把x插入到链表的第i的位置{ int j;
snode *p = head->next, *s;
if(i < 1 || i > (length(head) + 1))
return 0;
else if (i == 1)
{ s = (snode *)malloc(sizeof(snode)); s->next = p;
head->next = s; s->data = x;
}
else
{ for (j = 1; j < i - 1; j++)
p = p->next;
s = (snode *)malloc(sizeof(snode));
s->next = p->next;
p->next = s;
s->data = x;
}
return 1;
}
int delnode(snode *head, int i)//删除链表中第i个结点
{
snode *p = head->next, *q = head;
if(i < 1 || i > length(head))
return 0;
else if (i == 1)
{ head->next = p->next;
free(p);
} else
{ for (int j = 1; j < i; j++)
{
p = p->next; q = q->next; }
q->next = p->next;
free(p); }
return 1;
}
void sort(snode *head) //把链表中每个结点的值按从小到大排列
{
snode *p, *q;
int k;
for(p = head->next; p != NULL; p = p->next)
for(q = p->next; q != NULL; q = q->next)
if (p->data > q->data)
{ k = p->data; p->data = q->data; q->data = k; }
}
void insert(snode *head, int x) //在有序链表中插入x,插入后仍保持有序
{ snode *p = head->next, *s, *q = head;
while (p != NULL && p->data < x)
{ q = q->next;
p = p->next;
}
s = (snode *)malloc(sizeof(snode));
s->next = q->next; s->data = x; q->next = s;
}
void del_min_max(snode *head, int min, int max) //删除有序链表中值min到值max 中的结点
{ snode *p = head->next, *q = head;
while (p != NULL && p->data <= min)
{ q = p;
p = p->next; }
while (p != NULL && p->data < max)
{ q->next = p->next;
free(p);
p = q->next;
}
}
void del_min(snode *head)
{
snode *p = head->next, *q = head;
snode *p_min, *q_min;
p_min = p;
q_min = q;
while (p != NULL)
{
q = p; p = p->next;
if (p != NULL && p->data < p_min->data)
{ q_min = p_min;
p_min = p;
}
}
q_min->next = p_min->next;
free(p_min);
}
int main()
{ int min, max;
snode *headl = creat(); //创建链表
printf("最初的链表如下:");
display(headl);
int num, location;
printf("请输入您要查找的数:");
scanf("%d", &num);
if (locate(headl, num))
printf("数字%d在链表中的位置为%d ", num, locate(headl, num));
else
printf("数字%d在链表中不存在", num);
printf("请分别输入您要插入到链表中的数以及想插入的位置:");
scanf("%d %d", &num, &location);
if (insnode(headl, num, location))
{ printf("插入新值以后的链表如下:");
display(headl);
} else printf("输入有误");
printf("请输入您想删除的结点位置:");
scanf("%d", &location);
if (delnode(headl, location))
{ printf("删除第%d个结点后的链表如下:", location);
display(headl);
} else
printf("输入有误!");
}
图二
三、在顺序栈上实现将非负十进制数转换成二进制数代码:#include
#include
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERROR -1
typedef struct SNode{
int data;
struct SNode *next;
}SNode;
typedef struct{
int length;
SNode *top;
}STACK;
void InitStack(STACK *S){
S->top=NULL;S->length=0;
}
int Push(STACK *S,int e){
SNode *p;
p=(SNode *)malloc(sizeof(SNode)); if(!p) return ERROR;
p->data=e;p->next=S->top;
S->top=p;S->length++;
return OK;
}
int Pop(STACK *S,int *e){
SNode *p;
if(S->top==NULL) return ERROR; p=S->top;*e=p->data;
S->top=p->next;S->length--; return OK;
}
int Empty(STACK S){
if(S.top==NULL) return TRUE; return FALSE;
}
int main(){
int j,k,n;
STACK S;
do{
printf("请输入一个正整数:"); scanf("%d",&n);
}while(!(n>0&&n<32767)); InitStack(&S);
for(k=n;k>0;k=k/2)
Push(&S,k%2);
while(Pop(&S,&j)!=ERROR) printf("%d",j);
return OK;}
图三
四、在顺序表中采用顺序查找算法和折半查找算法寻找关键字X在顺序表中的位置
代码:#include
#include
#define MAXL 1000
#define INF 32767
int process[MAXL],pn;
//顺序表的存储结构
typedef int KeyType;
typedef int InfoType;
typedef struct
{ KeyType key;
InfoType data;
} NodeType;
typedef NodeType SeqList[MAXL];
//索引表的存储结构
typedef struct
{ KeyType key;
int link;
} IdxType;
typedef IdxType IDX[MAXL];
//顺序查找算法
int SeqSearch(SeqList R,int n,KeyType k)
{
int i=0;
pn=0;
while(i { process[pn++]=R[i].key; i++; } if(i>=n) return -1; else return i; } //折半查找算法 int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid; pn=0; while(low<=high) { mid=(low+high)/2; if(R[mid].key==k) return mid; if(R[mid].key>k) { process[pn++]=R[mid].key; high=mid-1; } else { process[pn++]=R[mid].key; low=mid+1; } } return -1; } int main() { int n,i,k,m; SeqList R; IDX I; printf("请输入无序顺序表的元素个数:");//10 while(scanf("%d",&n)!=EOF) { printf("请输入无序顺序表的%d个元素:\n",n); //3 6 2 10 1 8 5 7 4 9 for(i=0;i printf("请输入要查找的关键字:");scanf("%d",&k);//5 printf("使用顺序查找算法,"); if(SeqSearch(R,n,k)!=-1) { printf("关键字%d的下标为:%d\t查找过程为:",k,SeqSearch(R,n,k)); for(i=0;i printf("%d\n\n",k); } else printf("要查找的关键字%d不在无序顺序表中\n\n",k); ///////////////////////////////////////////////// printf("请输入有序顺序表的元素个数:");//10 scanf("%d",&n);printf("请输入有序顺序表的%d个元素:\n",n); //1 2 3 4 5 6 7 8 9 10 for(i=0;i printf("请输入要查找的关键字:");scanf("%d",&k);//9 printf("折半查找算法"); if(BinSearch(R,n,k)!=-1) { printf("关键字%d的下标为:%d\t查找过程为:",k,BinSearch(R,n,k)); for(i=0;i printf("%d\n\n",k); } else printf("要查找的关键字%d不在有序顺序表中\n\n",k); return 0; } } 图四 五.将无序数列使用直接插入排序算法和快速排序算法将其排成递增有序数列代码:1:直接插入:#include #define M 100 int L[M]; void InseLt_SoLt(int n) { int i, j; for(i=2;i<=n;i++) if (L[i] { L[0] = L[i]; for(j=i-1;L[0] L[j+1]=L[j]; L[j+1]=L[0]; } } int main() { int i, n; puts("请输入要排序的数的个数:"); scanf("%d", &n); if(n <= 0 || n > M) { printf("n must moLe than 0 and less than %d.\n", M); return 0; } puts("请输入要排序的数:"); for(i=1; i<=n; i++) scanf("%d", &L[i]); puts("你输入的数为:"); for(i=1; i<=n; i++) printf("%4d", L[i]); InseLt_SoLt(n); // 直接插入排序 puts("\n排序后的数为:"); for(i=1; i<=n; i++) printf("%4d", L[i]); return 0; } 图五快速插入代码:#include void quicksort(int a[], int low, int high); int split(int a[], int low, int high); int main(void) { int n; int a[100], i; printf("请输入待排序的数的个数: "); scanf("%d",&n); for (i = 0; i < n; i++) scanf("%d", &a[i]); quicksort(a, 0, n - 1); printf("采用快速查找排序后的结果是: "); for (i = 0; i < n; i++) printf("%d ", a[i]); printf("\n"); return 0; } void quicksort(int a[], int low, int high) { int middle; if (low >= high) return; middle = split(a, low, high); quicksort(a, low, middle - 1); quicksort(a, middle + 1, high); } int split(int a[], int low, int high) { int part_element = a[low]; for (;;) { while (low < high && part_element <= a[high]) high--; if (low >= high) break; a[low++] = a[high]; while (low < high && a[low] <= part_element) low++; if (low >= high) break; a[high--] = a[low]; } a[high] = part_element; return high; } 图六 一判断题 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的叶结点数为() 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include 五种查找算法总结 一、顺序查找 条件:无序或有序队列。 原理:按顺序比较每个元素,直到找到关键字为止。 时间复杂度: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块中的任一元素,……。 然后使用二分查找及顺序查找。 01:查找特定的值 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。 输入 第一行包含一个正整数n,表示序列中元素个数。1 <= n <= 10000。 第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。 第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。 输出 若序列中存在x,输出x第一次出现的下标;否则输出-1。 5 2 3 6 7 3 3 2 02:输出最高分数的学生姓名 查看 描述 输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。 输入 第一行输入一个正整数N(N <= 100),表示学生人数。接着输入N行,每行格式如下: 分数姓名 分数是一个非负整数,且小于等于100; 姓名为一个连续的字符串,中间没有空格,长度不超过20。 数据保证最高分只有一位同学。 输出 获得最高分数同学的姓名。 5 87 lilei 99 hanmeimei 97 lily 96 lucy 77 jim hanmeimei 来源 习题(13-1) 03:不高兴的津津 查看 描述 津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。 请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。 输入 包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。 输出 包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。 5 3 6 2 7 2 5 3 5 4 0 4 0 6 3 《数据结构》实验 题目:顺序查找班级:08计科 学号:10号姓名: #include { int j; list[num].key=searchnum; for(j=0;list[j].key!=searchnum;j++) ; return j 算法设计与分析各种查找算法的性能测试 目录 摘要 (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) 声明 ................................................................................................................ 错误!未定义书签。 摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归) 顺序查找 #include #include 《数据结构》实验报告一 学院:班级: 学号:姓名: 日期:程序名 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include 实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2、顺序表的插入; 3、顺序表的输出; 4、求顺序表的长度 5、判断顺序表是否为空; 6、输出顺序表的第i位置的个元素; 7、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除; 9、释放顺序表 三、算法思想与算法描述简图 主函数main void InitList(SqList*&L) 初始化顺序表 void DestroyList(SqList*&L)//释放顺序表L int ListEmpty(SqList*L)//判断顺序表L是否为空集 int Listlength(SqList*L)//返回顺序表L的元素个数 void DispList(SqList*L)//输出顺序表L int GetElem(SqList*L,int i,char e)/*ElemType e)获取 顺序表L中的第i个元素*/ int LocateEmpty(SqList*L,char e)/*ElemType e)在顺序 表L中查找元素e*/ int ListInsert(SqList*&L,int i,char e)/*ElemType e) 在顺序表中第i个位置上插入元素e*/ int ListDelete(SqList*&L,int i,char &e)/*ElemType e) 在顺序表L中删除第i个元素*/ 四、实验步骤与算法实现 #include 《数据结构》实验报告一 顺序表的基本操作 班级:网络工程学号:12015242183 实验日期:2016.9.25 姓名:邓宗永 程序文件名及说明:sequenlist 顺序表 一、实验目的 1、掌握使用Turbo C3.0上机调试线性表的基本方法; 2、掌握顺序表的基本操作:插入、删除、查找以及线性表合并等运算。 二、实验要求 1、认真阅读和掌握实验的程序。 2、上机运行程序。 3、保存和打印出程序的运行结果,并结合程序进行分析。 4、按照你对线性表的操作需要,编写写主程序并运行,打印出文件清单和运行结果 三、注意事项: 在磁盘上创建一个目录,专门用于存储数据结构实验的程序。 四、实验内容 1.顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: (1)从键盘输入10个整数,产生顺序表,并输入结点值。 (2)从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 (3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x 插入在对应位置上,输出顺序表所有结点值,观察输出结果。 (4)从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 五、实验报告必须写明内容 1.程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设 计,符号名说明等) 程序的结构:通过子函数实现输出,删除,插入,查找等功能,高耦合低内聚 数据结构:线性结构,顺序储存 输入/输出设计:根据屏幕提示,从键盘读取数据 2.源程序及注释: #include #include"stdio.h" #include"stdlib.h" #include"string.h" #define MAX 31 typedef struct {int*k; int*elem; char*aa; int length; }SSTable; int lw_Search(SSTable ST,int key) { int i; ST.elem[0]=key; for(i=ST.length;ST.elem[i]!=ST.elem[0];--i); return i; } int lw_Search2(SSTable ST,int n,int key) { int low=1;int high=ST.length;int mid,a=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[%d,%d]中找到元素 ST[%d]: %d\n",++a,low,high,mid,ST.k[mid]); if(ST.k[mid]==key) return mid; else if(ST.k[mid]>key) high=mid-1; else low=mid+1; } return 0; } int lw_bubble(SSTable ST,int n) {int i,j,temp;int*a; for(i=1;i temp=ST.k[i]; ST.k[i]=ST.k[j]; ST.k[j]=temp; } } int lw_prit(SSTable ST,int n) { int i;int*a; for(i=1;i /* 设计一个程序exp9-1.cpp, 输出在顺序表{3,6,2,10,1,8,5,7,4,9} 中采用顺序方法查找关键字5的过程。 */ #include 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"); } 顺序表查找 周次:第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 算法与数据结构讲义实验五图的建立及遍历操作 一、实验目的 1.掌握图的存储结构和相关操作。 2.能够熟练用计算机来表示图和进行图处理。 二、实验环境 1.硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; 2.软件:DOS或Windows操作系统+Turbo C; 三、实验要求 1.要求对于给定的图分别用邻接矩阵和邻接表示来存储。 2.对于存储好的图进行深度和广度优先遍历。 3.完成图的各种操作。 四、实验内容 1.现在某网络公司的光纤连接结点如下图所示,请分别用邻接矩阵和邻接表将图存储到计算机中方便进行处理。 2.现在某网络公司的光纤连接结点如下图所示,请分别用邻接矩阵和邻接表将图存储到计算机中方便进行处理。 五、代码如下 第一个实验 #include 1. 实验项目的目的和任务 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1) 从键盘输入10个整数,产生顺序表,并输入结点值。 2) 从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 3) 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 4) 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 2. 上机实验内容 1. 定义一个整型数组。用于存放顺序表的数据元素 2. 设计一个函数,完成顺序表的建立。 从键盘输入10个整数,产生顺序表,并输入结点值。 3. 设计一个函数,完成顺序表的查找。 从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 4. 设计一个函数,完成顺序表的插入。 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 5. 设计一个函数,完成顺序表的删除。 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 6. 设计一个函数,用于顺序显示当前线性表中的所以元素。 3. 主要实验方法 程序主框架已经设计好。见SqList.C文件。请按要求设计各个函数,并完成正确调用。 下面是SqList.C里的内容 #include 第九章查找 单项选择题 1.顺序查找法适合于存储结构为的线性表。 A. 散列存储 B. 顺序存储或链接存储 C. 压缩存储 D. 索引存储 2.对线性表进行二分查找时,要求线性表必须。 A. 以顺序方式存储 B. 以顺序方式存储,且结点按关键字有序排列 C. 以链接方式存储 D. 以链接方式存储,且结点按关键字有序排列 3.采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为。 A. n B. n/2 C. (n+1)/2 D. (n-1)/2 4.采用二分查找方法查找长度为n的线性表时,每个元素的平均查找长度为。 A. O(n2) B. O(nlog2n) C. O(n) D. O (logn) 5.二分查找和二叉排序树的时间性能。 A. 相同 B. 不相同 6.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值为82的结点时,次比较后查找成功。 A. 1 B. 2 C. 4 D. 8 7.设哈希表长m=14,哈希函数H(key)=key%11。表中有4个结点: addr(15)=4 addr(38)=5 addr(61)=6 addr(84)=7 其余地址为空,如用二次探测再散列处理冲突,关键字为49的结点的地址是。 A. 8 B. 3 C. 5 D. 9 8.有一个长度为12的有序表,按二分查找法对该表进行查找,在表内各元素等概率情况下查找成功所需的平均比较次数为。 A. 35/12 B. 37/12 C. 39/12 D. 43/12 9.采用分块查找时,若线性表中共有625个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分个结点最佳地。 A. 10 B. 25 C. 6 D. 625 10.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用查找方法。 A. 分块 B. 顺序 C. 二分 D. 散列 填空题 1.顺序查找法的平均查找长度为;二分查找法的平均查找长度为;分块查找法(以顺序查找确定块)的平均查找长度为;分块查找法(以二分查找确定块)的平均查找长度为;哈希表查找法采用链接法处理冲突时的平均查找长度为。 2.在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。 3.二分查找的存储结构仅限于,且是。 4.在分块查找方法中,首先查找,然后再查找相应的。 5.长度为255的表,采用分块查找法,每块的最佳长度是。 6.在散列函数H(key)=key%p中,p应取。 7.假设在有序线性表A[1..20]上进行二分查找,则比较一次查找成功的结点数为,则 实验一顺序表的实现 实验目的:熟练掌握顺序表的基本操作(插入、删除、查找等) 实验内容:顺序表中的基本操作的实现(初始化、插入、删除、求表长、按值查找、按位置查找) 实验要求:以顺序表的动态分配存储结构来实现;所有基本操作均应该以函数的形式表示;要有运行结果并考虑到顺序表中所有情况。 一、实验算法描述: 1、顺序表的声明和创建 typedef struct { int* data;//int*型元素 int length;//顺序表的实际长度 int listsize;//顺序表的最大长度 }sqlist; void creatsqlist(sqlist &list) { list.data=(int*)malloc(sizeof(int)*maxsize);//开辟一个名为l的顺序表 if(!list.data)//判断顺序表是否存在 exit(1); list.length=0; list.listsize=maxsize; } 2、初始化函数initsqlist(list) void initsqlist(sqlist &list)//初始化操作 { int* p; int n; cout<<"请输入顺序表元素数(1-50):"< 顺序表的基本操作 /*sqList.h 文件*/ #define LIST_INIT_SIZE 50 /*初始分配的顺序表长度*/ #define INCREM 10 /*溢出时,顺序表长度的增量*/ #define OVERFLOW 1 #define OK 0 #define ERROR -1 typedef int ElemType; /*定义表元素的类型*/ typedef struct SqList{ ElemType *elem; /*存储空间的基地址*/ int length; /*顺序表的当前长度*/ int listsize; /*当前分配的存储空间*/ }SqList; /*sqListOp.h 文件*/ #include "Sqlist.h" int InitList_sq(SqList &L); //顺序表创建函数定义 void FreeList_sq(SqList &L); //顺序表销毁函数定义 int ListInsert_sq(SqList &L, int i, ElemType e); //在顺序表的位置i插入元素e void PrintList_sq(SqList &L); //遍历并输出顺序表所有元素 int ListDelete_sq(SqList &L, int i,ElemType &e); //删除顺序表第i个元素的 bool ListEmpty(SqList &L); //判断顺序表是否为空 int LocateElem_sq(SqList L,ElemType e); //在顺序表里查找出第1个与e相等的数据元素位置 //已知线性表La和Lb的元素按值非递减排列 //归并后的La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排列 void MergeList_sq(SqList La,SqList Lb, SqList &Lc); /*sqListOp.cpp文件*/ #include 顺序查找法适用于存储结构为顺序或链接存储的线行表
数据结构顺序表的查找插入与删除
五种查找算法总结
编程基础之顺序查找
顺序查找
各种查找算法的性能比较测试(顺序查找、二分查找)
顺序查找
顺序表的查找、插入与删除实验报告
数据结构实现顺序表各种基本运算
顺序表的基本操作
算法与数据结构的顺序查找
输出在顺序表{3,6,2,10,1,8,5,7,4,9},中采用顺序方法查找关键字5的过程。
顺序表查找
顺序表查找算法的实现
顺序表的查找、插入与删除
第9章 查找练习题及答案
顺序表的实现,包含插入 删除 查找等操作,完整源代码,有注释
顺序表的基本操作