顺序表的查找

原创 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;
}


顺序表的查找

#include #include #include #include #define MAX 10 typedef struct{ int *elem; int length; }SSTable...
  • sjlcute
  • sjlcute
  • 2015年11月16日 17:33
  • 844

线性表的查找操作(线性表的顺序查找、二分查找、分块查找)

内容: (1)随机产生n个两位整数,构造一个查找表。 (2)输入一个整数,利用顺序查找法在查找表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。 (3)对查找表按递增...
  • llwwlql
  • llwwlql
  • 2015年11月27日 19:48
  • 1436

查找——线性表顺序查找算法

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 线性表顺序查找算法.cpp *作 者: 郑兆涵 *查找——线性表顺...

查找删除 顺序表

  • 2013年04月08日 12:50
  • 57KB
  • 下载

线性表的顺序存储格式基本操作:初始化、插入、删除、查找、打印

/* 线性表的基本操作 '&'表示C++中的引用。如果传入的变量是指针型变量,且在函数体内要对传入的指针进行改变,则将用到指针变量引用型 */ #include using namespace std...

顺序表查找(一)

  • 2016年01月03日 10:21
  • 350B
  • 下载

顺序表的查找

  • 2015年03月11日 14:56
  • 155KB
  • 下载

【数据结构】顺序表的查找

利用顺序表查找数据。#include #include using namespace std; #define LIST_INIT_SIZE 100//顺序表存储空间的初始分配量 #defi...

奇数在顺序表中的查找和测试

  • 2008年06月28日 13:18
  • 279KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序表的查找
举报原因:
原因补充:

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