谁帮我改改这个C程序
- 提问者网友:战魂
- 2021-04-13 16:37
#include<stdio.h>
#include<stdlib.h>
void input(int *v,int *n)
{
int i;
printf("\n请输入元素到线性表中:");
for(i=0;i<*n;i++)
scanf("%d",v+i);
}
void output(int *v,int*n)
{
int i;
for(i=0;i<*n;i++)
printf("%d\t",*(v+i));
}
int *initsl(int m,int *n)
{
int *v;
v=(int *)malloc(m*sizeof(int));
*n=0;
return v;
}
int serch(v,n,x)
int n;
int v[],x;
{
int k;
k=0;
while((k<n)&&(*(v+k)!=x)) k=k+1;
if(k==n) k=-1;
return (k);
}
int beserch(v,n,x)
int v[],x;
int n;
{
int i,j,k;
i=1;j=n;
while(i<=j)
{ k=(i+j)/2;
if(v[k-1]==x)
return(k-1);
if(v[k-1]>x) j=k-1;
else i=k+1;
}
return(-1);
}
int split(p,m,n)
int m,n;
int p[];
{ int i,j,k,u;
int t;
i=m;j=n;k=(i+j)/2;
if((p[i]>=p[j])&&(p[j]>=p[k]))
u=j;
else if((p[i]>=p[k])&&(p[k]>=p[j])) u=k;
else u=i;
t=p[u]; p[u]=p[i];
while(i!=j)
{ while((i<j)&&(p[j]>=t)) j=j-1;
if(i<j)
{p[i]=p[j];i=i+1;}
while((i<j)&&(p[i]<=t)) i=i+1;
if(i<j)
{ p[j]=p[i]; j=j-1;}
}
p[i]=t;
return(i);
}
void bubsort(v,n)
int n;int v[];
{int m,k,j,i;
int t;
k=0;m=n-1;
while(k<m)
{j=m-1;m=0;
for(i=k;i<=j;i++)
if(v[i]>v[i+1])
{t=v[i];v[i]=v[i+1];v[i+1]=t;m=i;}
j=k+1;k=0;
for(i=m;i>=j;i--)
if(v[i-1]>v[i])
{t=v[i];v[i]=v[i+1];v[i+1]=t;k=i;}
}
return ;
}
void qksort(v,m,n)
int m,n;
int v[];
{int i;
if(n>m)
{i=split(v,m,n);
qksort(v,m,i-1);
qksort(v,i+1,n);}
return ;
}
void insort(v,n)
int n; int v[];
{
int j,k;
int t;
for (j=1;j<n;j++)
{ t=v[j]; k=j-1;
while ((k>=0)&&(v[k]>t))
{ v[k+1]=v[k];k=k-1; }
v[k+1]=t;
}
return;
}
void shlsort(v,n)
int n; int v[];
{
int h,j,i;int t; h=n/2;
while(h>0)
{
for(j=h;j<=n-1;j++)
{ t=v[j]; i=j-h;
while((i>=0)&&(v[i]>t))
{v[i+h]=v[i]; i=i-h;}
v[i+h]=t;
}
h=h/2;
}
return;
}
void selesort(v,n)
int n;
int v[];
{
int i,j,k;
int d;
for(i=0;i<=n-2;i=i+1)
{k=i;
for(j=i+1;j<=n-1;j=j+1)
if(v[j]<v[k])
k=j;
if(k!=i)
d=v[i];v[i]=v[k];v[k]=d;
}
return;}
void main()
{
int *v=NULL,*n=NULL,m,x,k;
char a;
n=(int *)malloc(sizeof(int));
printf("\n请输入线性表的大小(m):");
scanf("%d",&m);
v=initsl(m,n);
printf("\n请输入线性表的实际长度(n):");
scanf("%d",n);
input(v,n);
output(v,n);
printf("\n请问线性表中的元素是否有序(y/n)?");
getchar();
a=getchar();
getchar();
if(a=='y'||a=='Y')
{printf("\n线性表中元素有序,采用对分查找法查找");
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);}
else printf("\n线性表中元素无序,是否先进行排序再执行查找(y/n)?");
a=getchar();
getchar();
if(a=='y'||a=='Y')
{printf("\n请键入数字选择排序方法:");
printf("\n1.快速排序\n");
printf("\n2.冒泡排序\n");
printf("\n3.插入排序\n");
printf("\n4.希尔排序\n");
printf("\n5.简单选择排序\n");
printf("\n\n键入其他数字放弃排序直接采用顺序查找法查找");
scanf("%d",&k);
if(k==1)
{
qksort(v,m,n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
if(k==2)
{
bubsort(v,n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
if(k==3)
{insort(v,n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
if(k==4)
{
shlsort(v,n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
if(k==5)
{selesort(v,n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
if(k>5||k<1)
{
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=serch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
}
else
{printf("\n请输入要查找的元素");
scanf("%d",&x);
k=serch(v,n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
}
- 五星知识达人网友:十鸦
- 2021-04-13 16:53
下面是改好的程序,数据测试正常。快速排序和冒泡排序是我重写的,其他地方改动也比较多,就不一一注释了。
#include<stdio.h>
#include<stdlib.h>
int beserch(int v[],int n,int x);
void bubsort(int v[],int n);
int *initsl(int m,int *n);
void input(int *v,int *n);
void output(int *v,int *n);
void insort(int v[],int n);
void qksort(int v[],int m,int x);
void selesort(int v[],int n);
int serch(int v[],int n,int x);
void shlsort(int v[],int n);
int split(int p[],int m,int n);
void main()
{
int k,m,x,*v=NULL,*n=NULL;
char a;
n=(int *)malloc(sizeof(int));
printf("\n请输入线性表的大小(m):");
scanf("%d",&m);
v=initsl(m,n);
printf("\n请输入线性表的实际长度(n):");
scanf("%d",n);
input(v,n);
output(v,n);
printf("\n请问线性表中的元素是否有序(y/n)?");
getchar();
a=getchar();
getchar();
if(a=='y'||a=='Y')
{
printf("\n线性表中元素有序,采用对分查找法查找");
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else printf("\n线性表中元素无序,是否先进行排序再执行查找(y/n)?");
a=getchar();
getchar();
if(a=='y'||a=='Y')
{
printf("\n请键入数字选择排序方法:");
printf("\n1.快速排序\n");
printf("\n2.冒泡排序\n");
printf("\n3.插入排序\n");
printf("\n4.希尔排序\n");
printf("\n5.简单选择排序\n");
printf("\n\n键入其他数字放弃排序直接采用顺序查找法查找");
scanf("%d",&k);
if(k==1)
{
qksort(v,0,(*n)-1);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else if(k==2)
{
bubsort(v,*n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else if(k==3)
{
insort(v,*n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else if(k==4)
{
shlsort(v,*n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else if(k==5)
{
selesort(v,*n);
printf("\n排序后:");
output(v,n);
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=beserch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
else if(k>5||k<1)
{
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=serch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
}
else
{
printf("\n请输入要查找的元素");
scanf("%d",&x);
k=serch(v,*n,x);
if(k==-1)
printf("\n无此元素");
else printf("\n%d是第%d个元素",x,k+1);
}
}
void input(int *v,int *n)
{
int i;
printf("\n请输入元素到线性表中:");
for(i=0;i<*n;i++)
scanf("%d",v+i);
}
void output(int *v,int*n)
{
int i;
for(i=0;i<*n;i++)
printf("%d\t",*(v+i));
}
int *initsl(int m,int *n)
{
int *v;
v=(int *)malloc(m*sizeof(int));
*n=0;
return v;
}
int serch(int v[],int n,int x)
{
int k;
k=0;
while((k<n)&&(*(v+k)!=x))
k=k+1;
if(k==n)
k=-1;
return k;
}
int beserch(int v[],int n,int x)
{
int i,j,k;
i=1;j=n;
while(i<=j)
{
k=(i+j)/2;
if(v[k-1]==x)
return(k-1);
if(v[k-1]>x)
j=k-1;
else i=k+1;
}
return -1;
}
int split(int p[],int m,int n)
{
int i,j;
int k,l,t;
int s=0;
for(k=p[m],l=0;s==0;)
{
for(s=1,j=n;j>l;--j)
if(p[j]<k)
{
s=0;
t=p[j];
p[j]=p[l];
p[l]=t;
l=j;
break;
}
for(i=m;i<l;++i)
if(k<p[i])
{
s=0;
t=p[i];
p[i]=p[l];
p[l]=t;
l=i;
break;
}
}
return l;
}
void bubsort(int v[],int n)
{
int i,j,w=1;
for(i=0;i<n-2;i++)
{
if(w==0)break;
for(w=0,j=i+1;j<n-1;j++)
{
if(v[i]>v[j])
{
w=v[j];
v[j]=v[i];
v[i]=w;
}
}
}
return;
}
void qksort(int v[],int m,int n)
{
int i;
i=split(v,m,n);
if(i-1>0)
qksort(v,0,i-1);
if(i+1<n)
qksort(v,i+1,n);
return ;
}
void insort(int v[],int n)
{
int j,k;
int t;
for (j=1;j<n;j++)
{
t=v[j];
k=j-1;
while ((k>=0)&&(v[k]>t))
{
v[k+1]=v[k];
k=k-1;
}
v[k+1]=t;
}
return;
}
void shlsort(int v[],int n)
{
int h,j,i;
int t;
h=n/2;
while(h>0)
{
for(j=h;j<=n-1;j++)
{
t=v[j]; i=j-h;
while((i>=0)&&(v[i]>t))
{
v[i+h]=v[i];
i=i-h;
}
v[i+h]=t;
}
h=h/2;
}
return;
}
void selesort(int v[],int n)
{
int i,j,k;
int d;
for(i=0;i<=n-2;i=i+1)
{
k=i;
for(j=i+1;j<=n-1;j=j+1)
if(v[j]<v[k])
k=j;
if(k!=i)
{
d=v[i];
v[i]=v[k];
v[k]=d;
}
}
return;
}