永发信息网

谁帮我改改这个C程序

答案:1  悬赏:80  手机版
解决时间 2021-04-14 10:00
我是用C++6.0写的,没有错误也没有警告,运行到某一步以后就提示错误,然后就结束了
#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);
}
}

最佳答案

下面是改好的程序,数据测试正常。快速排序和冒泡排序是我重写的,其他地方改动也比较多,就不一一注释了。


#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;
}


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么查别人qq密码
为什么干吃不胖呢?
584.5682177778.12234.1798.76868.587129955.
黍河村在什么地方啊,我要过去处理事情
WASHINGTON- It’s a great achievement that
DNF我交钱进工会,4升5为什么没复活币也没称
北洋34年银币值多钱
几个红笔写的日文字请日文帮忙打下
品质与诚信同样重要的含义,用品质与诚信造句
各种走路的姿式?怎样走,可爱的,气质的…
.第四部分阅读理解(共20小题,每小题2分,计
初3的数学函数
QQ农场收菜出现验证码的问题
米莎贝尔卫浴这个地址在什么地方,我要处理点
公交卡掉在了黑板与墙的缝里怎么能拿出来
推荐资讯
边塞诗句之壮阔雪原,突出了壮观与雄浑的诗句
---Whichofthetwojacketswillyoutake?---I’l
蓝色玛格丽特的味道是什么样的
东海电器地址在哪,我要去那里办事,
QQ音速种可以赠我吗?
谁知道小四最近出新书了没?
有句歌词是看你微笑着,找到了幸福了.的歌名是
如图,AB是斜靠在墙上的一个梯子,梯脚B距墙1
雅迪授权服务站在哪里啊,我有事要去这个地方
歌词:离开你我才发现自己那爱笑的眼睛、
单选题在实行分封制的形态里,最高统治者被称
圣象地板环保吗,圣象地板环保吗? 30分
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?