排序的二分查找
(一)上机题:
一、从键盘接收一个不超过20个数据元素的有序表。
1、输出该有序表。
2、从键盘接收一个关键字K,采用二分查找的方法在有序表中查找与K相等的元素。若查找成功,返回其位置;若查找失败,须将K插入有序表中(即一趟二分插入排序)。要求在屏幕上输出查找过程中,K与哪些元素进行了比较;且查找失败,须输出新的有序表。
运行不了.........................................................................
#include <stdio.h>
#define MAXL 20
#include<stdlib.h>
//#include <iostream>
#include <stack>
typedef int ElemType;
typedef struct //有序表的结构的定义
{
ElemType data[MAXL];
int length;
}SqList;
//查找的结构定义
typedef int KeyType,InfoType;
typedef struct//
{
KeyType key;
InfoType data;
}NodeType;
typedef NodeType SeqList[MAXL];
void InitList(SqList *&L) //初始化有序表
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
void CreatList(SqList *&L,ElemType a[],int n) //建立有序表
{
int i;
printf("请输入一个不超过20个数据元素的有序表:\n");
for (i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
L=(SqList * )malloc(sizeof(SqList));
for (i=0;i<10;i++)
L->data[i]=a[i];
L->length=10;
}
int ListLength(SqList *L)//有序表的长度
{
return(L->length);
}
void DisqList(SqList *L) // 输出有序表
{
int i;
//if(ListEmpty(L) ) return;
for (i=0;i<L->length;i++)
printf("有序表为:%c",L->data[i]);
printf("\n");
}
int ListInsert(SqList *&L,ElemType e)//有序表插入查找不匹配的数
{
int i=0,j;
while (i<L->length&& L->data[i]<e) i++;
if (L->data[i]==e) return 0;
for (j=10;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return 1;
}
int BinSearch(SeqList R,int n,KeyType e) //二分查找、返回插入函数
{printf("请输入一个关键字e:\n");
scanf("%d\n",e);
int low=0,high=n-1,mid;
//SqList *&L;
while (low<=high)
{mid=(low+high)/2;
if (R[mid].key==e)
return(mid);
if(R[mid].key>e)
high=mid-1;
//return mid-1;
else
low=mid+1;
//return mid+1;
}
return 1;
//return ListInsert( L, e);
}
int main()
{SqList *&L,R;
ElemType a[MAXL];
KeyType e;
int n;
CreatList(&L,a,n);
DisqList(L);
BinSearch(R,n,e);
if(BinSearch=1)
DisqList(L);
else
{ListInsert( L, e);
DisqList(L);}
return 1;
}