急求大神!要求为二分法查找的非递归算法设计主函数,完善算法并运行验证,代码写了一半不知怎么继续
用C语言写的,我的设想是主函数由用户输入表,然后验证表是否是有序数列,如果有序就让用户输入查找的数据,引用二分法的函数进行查找,如果无序就先按大小顺序排列后再进行查找,然...
用C语言写的,我的设想是主函数由用户输入表,然后验证表是否是有序数列,如果有序就让用户输入查找的数据,引用二分法的函数进行查找,如果无序就先按大小顺序排列后再进行查找,然后根据返回值大小判断查找是否成功。 验证表是否有序我已经写了,无序的排序那块我有点晕,然后根据返回值判断查找是否成功那块也就没写了。我编译了一下没有完成的代码,机器说有一个错误,但是查看组建栏发现有好长一串“error”= =求大神帮忙补充下代码顺带看下那个编译出的错误是怎么回事行么? 下面是我写的代码:#define LIST_SIZE 20#include <stdio.h>
#include "malloc.h"
typedef struct{ KeyType key;
OtherType other_data;
}RecordType;
typedef struct{ RecordType r[LIST_SIZE+1];
int length;
}RecordList;
int BinSrch(RecordList *L,KeyType k){ int low=0;
int i=0;
high=L->length-1;
while(low<=high){
mid=(low+high)/2;
if(k==L->r[mid].key)
{
i=mid;
break;
}
else
if(k<L->r[mid].key)
high=mid-1;
else
low=mid+1;
}
return(i);
}
void main(){
int BinSrch(RecordList *L,KeyType k);
int i;
int a;
int num;
//
//
//
L=malloc(sizeof(RecordList));//申请空间
printf("Please input the list:\n");
for(i=1;i<21;i++)
scanf("%d",&L->r[i]);//输入表
/*验证表是否有序排列,a=1,-1,0时为有序排列,a=2时需要对表进行排序*/
if(L->r[1]<L->r[2]) {
for(i=2;i<21;i++)
{
if(L->r[i]<L->r[i+1])
i++;
}
a=1;
}
else
{
if(L->r[1]>L->r[2])
{
for(i=2;i<21;i++)
{
if(L->r[i]<L->r[i+1])
i++;
}
a=-1;
}
else
{
if(L->r[i]==L->r[i+1])
a=0;
else
a=2;
}
}
/*判断是否是有序,并排序*/ if(a==2)//表无序,先排序
{
}
else//表有序
{
printf("Please input the key-number:");
scanf("%d",k);
num=BinSrch(L,k);
printf("Your key-number is the NO.%d in this list.\n",num);
}
} 展开
#include "malloc.h"
typedef struct{ KeyType key;
OtherType other_data;
}RecordType;
typedef struct{ RecordType r[LIST_SIZE+1];
int length;
}RecordList;
int BinSrch(RecordList *L,KeyType k){ int low=0;
int i=0;
high=L->length-1;
while(low<=high){
mid=(low+high)/2;
if(k==L->r[mid].key)
{
i=mid;
break;
}
else
if(k<L->r[mid].key)
high=mid-1;
else
low=mid+1;
}
return(i);
}
void main(){
int BinSrch(RecordList *L,KeyType k);
int i;
int a;
int num;
//
//
//
L=malloc(sizeof(RecordList));//申请空间
printf("Please input the list:\n");
for(i=1;i<21;i++)
scanf("%d",&L->r[i]);//输入表
/*验证表是否有序排列,a=1,-1,0时为有序排列,a=2时需要对表进行排序*/
if(L->r[1]<L->r[2]) {
for(i=2;i<21;i++)
{
if(L->r[i]<L->r[i+1])
i++;
}
a=1;
}
else
{
if(L->r[1]>L->r[2])
{
for(i=2;i<21;i++)
{
if(L->r[i]<L->r[i+1])
i++;
}
a=-1;
}
else
{
if(L->r[i]==L->r[i+1])
a=0;
else
a=2;
}
}
/*判断是否是有序,并排序*/ if(a==2)//表无序,先排序
{
}
else//表有序
{
printf("Please input the key-number:");
scanf("%d",k);
num=BinSrch(L,k);
printf("Your key-number is the NO.%d in this list.\n",num);
}
} 展开
展开全部
排序很简单的……用qsort()好了
void qsort(void* Start, int element, int length, int (*cmp)(const void*,const void*));
使用时,Start为起始位置,element是元素个数,size是元素长度(sizeof()即可),
最关键的是最后一个比较函数,这个需要你自己动手写
返回值int,传参类型 const void*指针
例如,给整数排序:
int cmp (const void* a, const void* b){
return *((int*)a) < *((int*)b); //指针的强制类型转换
}
又如:按Student结构体中的age从大到小排序
int cmp(const void*Stu1,const void*Stu2){
Student * a1 = ( Student* )Stu1;
Student * a2 = ( Student* )Stu2;
return a1->age > a2->age;
}
void qsort(void* Start, int element, int length, int (*cmp)(const void*,const void*));
使用时,Start为起始位置,element是元素个数,size是元素长度(sizeof()即可),
最关键的是最后一个比较函数,这个需要你自己动手写
返回值int,传参类型 const void*指针
例如,给整数排序:
int cmp (const void* a, const void* b){
return *((int*)a) < *((int*)b); //指针的强制类型转换
}
又如:按Student结构体中的age从大到小排序
int cmp(const void*Stu1,const void*Stu2){
Student * a1 = ( Student* )Stu1;
Student * a2 = ( Student* )Stu2;
return a1->age > a2->age;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询