基于顺序表与链表的顺序查找(顺序表的折半查找)

内容

  1. 基于任意一个顺序表、链表,实现顺序查找算法;
  2. 实现折半查找算法,并思考折半查找算法的适用场景;

#代码实现

#include<iostream>
#include <stdlib.h>
using namespace std;
#define MAX 20
#define datatype int
typedef struct seqList
{datatype data[MAX];
	int last;
}SeqList;

typedef struct node
{
	datatype data;
	struct node* next;
}LNode,*LinkList;

//创建带头结点的单链表L,采取尾插法
LinkList createLinkList(int n) 
{
	LinkList L = (LNode*)malloc(sizeof(LNode));//头指针指向头结点
	LNode *p, *r = L;//区别:尾指针的初始化
	datatype x;int i = 0;
	while(i < n) { cin >> x;
	p =(LNode*)malloc(sizeof(LNode));
		p->data = x;
		r->next = p;//区别
		r = p; //r指向新的尾结点
		i++;}
	if(r != NULL)
		r->next = NULL;//对于非空表,最后结点的指针域置空
	return L;
	}
	
void printLink(LinkList L) //遍历
{LNode *p = L;
while(p->next != NULL) {
p = p->next;cout << p->data << " ";
	}
	cout << endl;}
LNode* Search(LinkList L)
{
	datatype x;
	cout<<"输入想查找的数:";
	 cin>>x;int i=1;LNode *p;
	p=L->next;while(p&&p->data!=x)
	 	{p=p->next;i++;}
	 	cout<<"链表顺序查找:"; cout<<"此元素在第"<<i<<"个"<<endl;}
SeqList *Init()//初始化 
{SeqList *L;
	L=(SeqList *)malloc(sizeof(SeqList));
	L->last=-1;
	return L;}
	
void Add(SeqList *L) //添加
{int a;cout<<"请输入需要添加的个数:" ;
cin>> a;datatype arr[a];//保存要添加的值cout<<"请输入需要添加的值:" ;
	for(int i=0;i<a;i++)
	{cin>>arr[i];}
	for(int i=0;i<a;i++)
	{L->data[i]=arr[i];
		L->last++;}} 
		
void Output(SeqList *L) //显示,遍历
 {if(L->last!=-1)
{cout<<"遍历:";
for(int i=0;i<=L->last;i++)
 		{cout<<L->data[i]<<" "; }
		 cout<<endl;}
	 else cout<<"空表,无数据!";  }
	 
 int Find(SeqList *L) //查找
 {datatype x;int i=0;
 cout<<"输入想查找的数:";cin>>x;
 if(i<=L->last&&L->data[i]==x)cout<<"此元素在第"<<i+1<<"个"<<endl;
 while(i<=L->last&&L->data[i]!=x)
 	{i++;
 	if(i<=L->last&&L->data[i]==x)
 	{cout<<"顺序表顺序查找:"; 
	 cout<<"此元素在第"<<i+1<<"个"<<endl;return i;}
 	else if(i>L->last)
 	{return 0; }}}	 
 	
 int binaryfind(SeqList *L)
 {int n=L->last;//个数 int x,mid;
 	cout<<"输入想查找的数:";cin>>x;
 	int low=0,high=n-1;//low不能等于1,不然查找第一个元素会出不来结果 
 	while (high>=low)
 	{mid=(low+high)/2;
	if(L->data[mid]>x)
	 	{high=mid-1;}
		 else if(L->data[mid]<x)
		 {low=mid+1; }
		 else {cout<<"折半查找:"; 
cout<<"此元素在第"<<mid+1<<"个"<<endl;
		 	return mid;}}
return -1; } 


 int main()
 {cout<<"-------------顺序表顺序查找-------------"<<endl; 
 	SeqList *LA;
	 	LA=Init();Add(LA);
	 	Output(LA);Find(LA);
	 	cout<<"-------------顺序表折半查找-------------"<<endl; 
		SeqList *LB;LB=Init();Add(LB);
		 	 	Output(LB);//顺序表必须为递增序列 binaryfind(LB);
	cout<<"-------------链表顺序查找-------------"<<endl;  
LinkList L = NULL;//定义头指针变量
	LNode *p;//存储结点所在的位置
int n, i;
datatype x;
cout << "输入元素的个数n:";cin >> n;
cout << "输入元素:";
L = createLinkList(n);
cout<<"遍历:";printLink(L);
Search(L); 
return 0;
 }

结果展示

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值