简单程序修改:求各位帮忙把c++改为C语言

#include<iostream>#include<cmath>usingnamespacestd;typedefintKey;typedefstruct{Keykey... #include<iostream>
#include<cmath>
using namespace std;
typedef int Key;

typedef struct
{
Key key;
}
Rec;

typedef struct
{
int index;
Key data;
}
Index;

template<typename Telem>
void px(Telem a[],int n)
{
int min,i,j;
Telem temp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
};

int srch0(Rec r[],int n,Key k,int &m)
{
cout<<"顺序查找\n";
m=0;
int i(0);
while(m++,(r[i].key!=k)&&(i<=n))
i++;
if(i>n)
return (-1);
else return(i);
}

int srch1(Rec r[],int n,Key k,int &m)
{
m=0;
int i(n);
r[-1].key=k;
while(m++,r[i].key!=k)
i--;
return(i);
};

int efsrch(Rec r[],int n, Key k,int &m)
{
m=0;
cout<<"二分查找\n";
int low,hig,mid;
low=0;
hig=n;
while(m++,low<=hig)
{
mid=(low+hig)/2;
if(k==r[mid].key)
return(mid);
else if(k<r[mid].key)
hig=mid-1;
else low=mid+1;
}
return(-1);
};

int idxsrch(Rec r[], int n,Key k,int &g, int &h)
{
cout<<"分块查找\n";
g=0;
h=0;
int i;
int l=(int)sqrt(n);
int m=(n+l-1)/l;
cout<<"分块数:\n "<<l<<endl;
Index *ind;
ind=new Index[1];
for(i=1;i<=1;i++)
{
ind[i].index=i*m-1;
ind[i].data=r[i*m-1].key;
}

i=1;
while(g++,i<1)
{
if(ind[i].data<k)
i++;
else break;
}
int low,hig,mid;
low=i*m-1;
while(h++,low<=hig)
{
mid=(low+hig)/2;
if(k==r[mid].key)
return(mid);
else if(k<r[mid].key)
hig=mid-1;
else low=mid+1;
}
return(-1);
}

void main()
{
int n;
int *a;
cout<<"请输入数组长度: ";
cin>>n;
a=new int[n];
int i,j,k,l,m,sx0,sx1,sx2,sx3,sx4;
cout<<"请输入数组元素:\n";
for(i=0;i<n;i++)
cin>>a[i];
px<int>(a,n);
Rec *r;
r=new Rec[n];
for(i=0;i<n;i++)
r[i].key=a[i];
for(i=0;i<n;i++)
cout<<r[i].key<<" ";
cout<<endl;
cout<<"请输入要查询的数字: ";
cin>>m;

i=srch0(r,n,m,sx0);
j=srch1(r,n,m,sx1);
if(i==-1)
cout<<"查找失败!\n";
else cout<<"查找成功!\n";
cout<<"正向查出的位置: "<<i+1<<endl<<"反向查出的位置: "<<j+1<<endl;
cout<<"查找次数: 正向查找 "<<sx0<<" 次,反向查找 "<<sx1<<" 次,共 "<<sx0+sx1<<" 次\n\n";

k=efsrch(r,n,m,sx2);
if(k==-1)
cout<<"查找失败!\n";
else cout<<"查找成功!\n";
cout<<"位置: "<<k+1<<endl;
cout<<"查找次数: "<<sx2<<" 次\n\n";

l=idxsrch(r,n,m,sx3,sx4);
if(l==-1)
cout<<"查找失败!\n";
else cout<<"查找成功!\n";
cout<<"位置: "<<l+1<<endl;
cout<<"查找次数: 调用索引表 "<<sx3<<" 次,调用顺序表 "<<sx4<<" 次,共 "<<sx3+sx4<<" 次\n\n";
}
展开
 我来答
陈宗权8d804
2010-12-11 · TA获得超过3766个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:967万
展开全部
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
typedef int Key;

typedef struct
{
Key key;
}
Rec;

typedef struct
{
int index;
Key data;
}
Index;

void px(int a[],int n)
{
int min,i,j;
int temp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
};

int srch0(Rec r[],int n,Key k,int *m)
{
int i=(0);
printf("顺序查找\n");
*m=0;
while((*m)++,(r[i].key!=k)&&(i<=n))
i++;
if(i>n)
return (-1);
else return(i);
}

int srch1(Rec r[],int n,Key k,int *m)
{
int i=(n);
*m=0;
r[-1].key=k;
while((*m)++,r[i].key!=k)
i--;
return(i);
};

int efsrch(Rec r[],int n, Key k,int *m)
{
int low,hig,mid;
*m=0;
printf("二分查找\n");
low=0;
hig=n;
while((*m)++,low<=hig)
{
mid=(low+hig)/2;
if(k==r[mid].key)
return(mid);
else if(k<r[mid].key)
hig=mid-1;
else low=mid+1;
}
return(-1);
};

int idxsrch(Rec r[], int n,Key k,int *g, int *h)
{
int i;
int l=(int)sqrt(n);
int m=(n+l-1)/l;
Index *ind;
int low,hig,mid;
printf("分块查找\n");
*g=0;
*h=0;
printf("分块数:%d\n ",l);
ind=malloc(sizeof(Index)*l);
for(i=0;i<l;i++)
{
ind[i].index=i*m-1;
ind[i].data=r[i*m].key;
}
i=0;
while((*g)++,i<l)
{
if(ind[i].data<=k)
i++;
else break;
}
if(i==0||i>l) return -1;
low=(i-1)*m, hig=(i<l?i*m:n);
while((*h)++,low<=hig)
{
mid=(low+hig)/2;
if(k==r[mid].key)
return(mid);
else if(k<r[mid].key)
hig=mid-1;
else low=mid+1;
}
return(-1);
}

void main()
{
int n;
int *a;
int i,j,k,l,m,sx0,sx1,sx2,sx3,sx4;
Rec *r;
printf("请输入数组长度: ");
scanf("%d", &n);
a=malloc(sizeof(int)*n);
printf("请输入数组元素:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
px(a,n);
r=malloc(sizeof(Rec)*n);
for(i=0;i<n;i++)
r[i].key=a[i];
for(i=0;i<n;i++)
printf("%d ",r[i].key);
printf("\n");
printf("请输入要查询的数字: ");
scanf("%d", &m);

i=srch0(r,n,m,&sx0);
j=srch1(r,n,m,&sx1);
if(i==-1)
printf("查找失败!\n");
else printf("查找成功!\n");
printf("正向查出的位置: %d\n反向查出的位置: %d\n",i+1,j+1);
printf("查找次数: 正向查找 %d 次,反向查找 %d 次,共 %d 次\n\n", sx0,sx1,sx0+sx1);

k=efsrch(r,n,m,&sx2);
if(k==-1)
printf("查找失败!\n");
else printf("查找成功!\n");
printf("位置: %d\n",k+1);
printf("查找次数: %d 次\n\n",sx2);

l=idxsrch(r,n,m,&sx3,&sx4);
if(l==-1)
printf("查找失败!\n");
else printf("查找成功!\n");
printf("位置: %d\n", l+1);
printf("查找次数: 调用索引表 %d 次,调用顺序表 %d 次,共 %d 次\n\n",sx3,sx4,sx3+sx4);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式