顺序表的查找

原创 2015年11月18日 00:23:34
顺序表的查找
内容:
(1)随机产生n个两位整数,构造一个查找表。
(2)输入一个整数,利用顺序查找法在查找表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
(3)对查找表按递增顺序进行排序。
(4)输入一个整数,利用折半查找法在有序表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
(5)输入整组数无序,但局部有序的一组整数,建立查找表,输入一个整数,利用分块查找法查找该数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
#include<stdio.h>
#include<stdlib.h>
typedef struct elem{
	int key;
	int location;	//记录的位置
}elem;
typedef struct node{
   elem* base;
   int length;
}SStable;
void Creattable(SStable &s)
{
     int i;
	 printf("请输入表的长度:\n");
	 scanf("%d",&s.length);
	s.base=(elem*)malloc(s.length*sizeof(elem));
	for (i=1;i<=s.length;i++)
    {
	 s.base[i].key=rand()%90+10;
	 s.base[i].location=i;
	}
}
int Search(SStable s,int n)
{
	int i;
   s.base[0].key=n;
   for (i=s.length;i>>=0;i--)
	   if (s.base[i].key==n)
		   return s.base[i].location;
	   return 0;
}
void Sort(SStable &s)
{
	int i,j,k;
	elem temp;
	for (i=1;i<s.length;i++)
	{
		k=i;
		for (j=i+1;j<=s.length;j++)
			if (s.base[k].key>s.base[j].key)
	           k=j;
			if (k!=i)
			{
			  temp=s.base[k];
			  s.base[k]=s.base[i];
			  s.base[i]=temp;
			}
	}	
	for (i=1;i<=s.length;i++)
		 printf("关键字:%d 位置:%d\n",s.base[i].key,s.base[i].location);
}
int fenzhi(SStable s,int n)	
{							
	int low=1,high=s.length,mid;
    while (low<=high)
	{
	   mid=(low+high)/2;
	   if (s.base[mid].key==n)
		   return s.base[mid].location;
	   else  if (s.base[mid].key<n)
		   low=mid+1;
	   else 
		   high=mid-1;
	}
   return 0;
}
int Binsearch(SStable &s)
{
	int i,m,n,k,j;
	int b[10],key;		//b数组用来记录每块中最大值
	printf("请输入表的长度以及块数.\n");
		scanf("%d%d",&s.length,&n);
     m=s.length/n;
	 	s.base=(elem*)malloc(s.length*sizeof(elem));
	 i=1;
	 j=1;
	 b[1]=0;
	 while (i<=s.length)
	 {
	    scanf("%d",&s.base[i].key);
		s.base[i].location=i;
		if (b[j]<s.base[i].key)
	      b[j]=s.base[i].key;
		if (i%m==0)
		{
		  j++;
		  b[j]=0;
		}
		i++;
	 }
	 for (i=1;i<=s.length;i++)
		 printf("%d ",s.base[i].key);
	 printf("\n");
	 printf("请输入关键值:\n");
	 scanf("%d",&key);
	 if (b[j]<key)
		return 0;
	 k=1;
	 while (b[k]<key)
		 k++;
	 for (i=(k-1)*m+1;i<=k*m;i++)
		 if (key==s.base[i].key)
		return s.base[i].location;
		for (i=j*m+1;i<=s.length;i++)			//对于不足以构成一个块的数组进行扫描
		if (key==s.base[i].key)					//不太对题意,相当于多分出一个块,现在没想出更好的方法来解决
		return s.base[i].location;
		return 0;
}

int main()
{
	SStable s;
	int key,m,n;
	Creattable(s);
    printf("请输入要查找的关键值:\n");
	scanf("%d",&key);
	m=Search(s,key);
	 if (m)
		 printf("位置是%d.\n",m);
	 else
		 printf("该表中不存在该关键字\n");
	 printf("经过排序后得:\n");
	 Sort(s);
	 printf("请输入要查找的关键值:\n");
	scanf("%d",&key);
	m=fenzhi(s,key);
	if (m)
		 printf("位置是%d.\n",m);
	 else
		 printf("该表中不存在该关键字\n");
	n=Binsearch(s);
	if (!n)
		printf("查找失败.\n");
	else
		printf("位置是%d.\n",n);
	return 0;
}


数据结构之---C语言实现顺序表查找(一)

数据结构之---C语言实现顺序表查找(一)
  • u012965373
  • u012965373
  • 2015年08月28日 21:25
  • 1576

数据结构中顺序表的相关查找算法

今天给大家带来的是相关数据结构的查找算法,相信读过前几篇相关数据结构构建的读者应该能体会到两种常用数据结构的相关基础知识。 查找算法的基础就需要数据结构的支撑,很显然,我们需要掌握的是顺序表和动态链...
  • qq_15718789
  • qq_15718789
  • 2016年10月08日 16:13
  • 1134

C++顺序表的基本操作

C++顺序表的基本操作 1.由a的n个元素建立顺序表 2.初始化顺序表 3.销毁顺序表 4.判断顺序表是否是空表,若为空返回TRUE,否则返回FALSE 5.求顺序表的长度 6.输出顺序表...
  • lt1598552894
  • lt1598552894
  • 2015年09月14日 08:56
  • 456

C++ 顺序表的查找

#include using namespace std; int SeqSearch(int r[], int n, int k)//r[1]~r[n]存放元素 { int i = n...
  • fu_zk
  • fu_zk
  • 2012年12月16日 22:18
  • 1646

顺序表的查找、插入、删除、合并操作及其优缺点

顺序表的查找、插入、删除、合并操作,用c++实现相关代码:#includeusing namespace std;//定义线性表顺序存储结构#define MAXSIZE 100  //线性表最大长度...
  • yanxiaolx
  • yanxiaolx
  • 2016年05月29日 13:43
  • 900

C语言顺序表的插入、删除、查找操作实现

//顺序表的插入、删除、查找操作实现 #include #include #define InitSize 10 #define MaxSize 50 //#define bool int ...
  • u012913936
  • u012913936
  • 2015年07月04日 21:42
  • 2958

C语言实现顺序表的初始化,插入,删除,查找

#include #include #define LIST_INIT_SISE 100 // 线性表存储空间的初始分配量 #define LIST_INCREASE_SISE 20 ...
  • BiuBiu741
  • BiuBiu741
  • 2016年12月03日 23:24
  • 1731

索引顺序表查找算法(分块查找算法)

算法背景有时候,可能会遇到这样的表:整个表中的元素未必有序,但若划分为若干块后,每一块中的所有元素均小于(或大于)其后面块中的所有元素。我们称这种为分块有序。对于分块有序表的查找首先,我们需要先建立一...
  • qq_35644234
  • qq_35644234
  • 2017年03月25日 23:00
  • 3531

顺序表的冒泡排序算法及二分法查找代码实现

本文主要实现了比较经典的冒泡排序算法(对已经有序或者基本有序的顺序表复杂度大大降低),和二分法查找,各位看官看代码吧//冒泡排序算法及二分法查找 #include "stdio.h" typedef ...
  • guguizi
  • guguizi
  • 2016年05月06日 18:32
  • 1984

顺序表查找(顺序查找、二分查找) C语言实现

1、基本概念 a. 从大量以前存储的数据中检索特定的一段信息或几段信息的操作称为查找或搜索。 b. 平均查找长度ASL的计算公式为: 其中,n 为查找表的长度(元素个数),pi 为查找第 i...
  • u012561696
  • u012561696
  • 2013年12月14日 23:02
  • 4670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序表的查找
举报原因:
原因补充:

(最多只允许输入30个字)