查找-顺序查找

顺序查找的思路:

从数据的第一个元素开始,依次将扫描到的关键字和给定值key比较。若当前扫描到的关键字和key相等,则查找成功;若扫描结束还没有找到和key相等的元素,就表示查找给定的值不在表中。

时间复杂度:

O(n).

优点:

1.算法简单

2.对表结构没有任何要求,用顺序表或者用链表都可以。

3.表中元素之间是否有序,仍然可适用。

例子:查找数组{3,6,2,10,1,8,5,7,4,9}中的关键字为5的元素位置

查找过程演示图:

算法例子:

(1)顺序表顺序查找-结构体数组:

#include<stdio.h>
#define MAXL 100
typedef struct
{
	int key;
}Table;
typedef Table SeqList[MAXL];

int SeqSearch(SeqList r,int n,int key2)
{
	int i=0;
	while(i<n && r[i].key!=key2)
	{
		i++;
	}
	if(i>=n)
		return -1;
	else
	{
		return i;
	}
}
void main()
{
	SeqList r;
	int n=10,i;
	int key3=5;
	int a[]={3,6,2,10,1,8,5,7,4,9};
	for(i=0;i<n;i++)
	{
		r[i].key=a[i];
	}
	if((i=SeqSearch(r,n,key3))!=-1)
	{
		printf("%d元素的位置:%d\n",key3,i);
	}
	else
		printf("该元素不在表中",key3);
}

(2)顺序表顺序查找-数组1:

#include<stdio.h>
int  SeqSearch(int *a,int lengh,int key)
{
	for(int i = 0 ; i < lengh ; i++)
    {
        if(a[i] == key)
			return i;
    }
    return -1;
}
void main()
{
	int arr[] = {3,6,2,10,1,8,5,7,4,9};
	int result, num =5;
    result = SeqSearch(arr,sizeof(arr),num);
    if(result == -1)
		printf("该元素不在表中");
    else
		printf("%d元素的位置:%d\n",num,result);
}

(3)顺序表顺序查找-数组2:

#include<stdio.h>
int SeqSearch(int a[],int value)
{
	for(int i=0;i<sizeof(a);i++)
	{
		if(a[i]==value)
			return i;
	}
	return -1;
}
void main()
{
	int a[]={3,6,2,10,1,8,5,7,4,9};
	int value=5;
	int i;
	if(i=(SeqSearch(a,value))!=-1)
		printf("%d元素的位置:%d",value,i);
}

(4)链表顺序查找

#include<stdio.h>
#include<malloc.h>
typedef struct ListNode
{
	int key;
	ListNode* nextNode;
}ListNodeTable;
//创建链表
void InitList(ListNodeTable *&l)
{
	l=(ListNodeTable*)malloc(sizeof(ListNodeTable));
	l->nextNode=NULL;
}
//链表插入元素
bool ListInsert(ListNodeTable *&l,int n,int keyvalue)
{
	int i=0;
	ListNodeTable *p=l,*templist;
	while(i<n-1&&p!=NULL)
	{
		i++;
		p=p->nextNode;
	}
	if(p==NULL)
	{
		return false;
	}
	else
	{
		templist=(ListNodeTable*)malloc(sizeof(ListNodeTable));
		templist->key=keyvalue;
		templist->nextNode=p->nextNode;
		p->nextNode=templist;
		return true;
	}
}
//顺序查找
int seqsearch(ListNodeTable *l,int key)
{
	int i=1;
	ListNodeTable *p=l->nextNode;
	while(p!=NULL&&p->key!=key)
	{
		p=p->nextNode;
		i++;
	}
	if(p==NULL)
	{
		printf("该元素不存在表中");
		return -1;
	}	
	else
		return i;
}
void main()
{
	ListNodeTable *l;
	int key;
	InitList(l);
	int n=10;
	int a[]={3,6,2,10,1,8,5,7,4,9};
	int j;
	for(int i=1;i<=n;i++)
	{
		ListInsert(l,i,a[i-1]);
	}
	if((j=seqsearch(l,5))!=-1)
	{
		printf("5元素的位置:%d\n",j);
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值