内容
- 基于任意一个顺序表、链表,实现顺序查找算法;
- 实现折半查找算法,并思考折半查找算法的适用场景;
#代码实现
#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;
}