关于网友提出的“ 关于数据结构 程序可运行 其他功能没问题 但是自定义顺序表时出错 求调试”问题疑问,本网通过在网上对“ 关于数据结构 程序可运行 其他功能没问题 但是自定义顺序表时出错 求调试”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于数据结构 程序可运行 其他功能没问题 但是自定义顺序表时出错 求调试
描述:本帖最后由 bendansasa 于 2011-06-17 03:48:45 编辑
#include "stdio.h"
#define max 6
typedef struct/*定义线性表*/
{
int data[max+1];
int last;
}sxb;
sxb *chushihua() /*初始化*/
{
sxb *L;
L=(sxb *)malloc(sizeof(sxb));
L->last=0;
return L;
}
int chazhaoz(sxb *L,int i)
{
int x=0,z=0;
for (z=0; z<=L->last; ++z)
if (L->last==-1)
{
printf("表中没有元素,请插入数据后在操作\n");
return (0);
}
if (i>L->last)
{
printf("超出了范围,请看清在输入要查找的下标的值\n");
return (-1);
}
else if (i>=0&&i<=z)
{
x=L->data[i];
printf("下标为%d的数据为:%4d",i,x);
return (1);
}
}
int charu(sxb *LL,int i,int x)
{ int j;
if(LL->last==max-1)
{
printf("表满");
return (-1);
}
if(i<0||i>=LL->last+2)
{
printf("位置出错");
return 0;
}
for(j=LL->last;j>=i;j--)
LL->data[j+1]=LL->data[j];
LL->data[i]=x;
LL->last++;
return 1;
}
charushuju(sxb *LL,int i,int x) /*插入*/
{
int j;
if(LL->last==max)
{printf("表满");return(0);}
if(i<1||i>=LL->last+2)
{printf("位置错误");return(-1);}
for(j=LL->last;j>=i;j--)
LL->data[j+1]=LL->data[j];
LL->data[i]=x;
LL->last++;
return(1);
}
gengxinshuju(sxb *LL,int i,int x) /*更新*/
{
LL->data[i]=x;
}
int shangchu(sxb *L,int i) /*删除*/
{ int j;
if(i<1||i>L->last)
{printf("不存在第i个元素");return(0);}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];
L->last--;
return(1);
}
biaochang(sxb *L)/*求表长*/
{
printf("当前表长为: %d\n",L->last);
}
int Search_Bin (sxb *L,int k) /*二分法查找*/
{
int low=1,high=L->last,mid;
while(low<=high)
{
mid=(low+high)/2;
if(k==L->data[mid])
return mid;
else if (kdata[mid])
high=mid-1;
else low=mid+1;
}
return(0);
}
int ListTraverse(sxb *L) /*遍历顺序表*/
{ int i;
for(i=1;i<=L->last;i++)
printf("%d,",L->data[i]);
printf("\n");
}
void paixu(sxb *L)/*希尔排序*/
{
int n=4;
int i,j,t;
n=n/2;
while(n>0)
{
for(i=1;i+n<=L->last;i++)
{
j=i;
while(j+n<=L->last)
{
if(L->data[j]>L->data[j+n])
{t=L->data[j];L->data[j]=L->data[j+n];L->data[j+n]=t;}
j=j+n;
}
}
n=n/2;
}
}
int Show(sxb *L)/*输出*/
{ int i;
for(i=1;i<=L->last;i++)
printf("%3d,",L->data[i]);
printf("\n");
}
main()
{
sxb *L1;
int i,a,flag,j;
system("graftabl 936");
clrscr();
L1=chushihua();
printf("\n ____________________________________________________________________");
printf("\n| 1. 创建线性表 |");
printf("\n| 2. 在顺序表的第i个元素前插入一个元素。 |");
printf("\n| 3. 更新顺序表中第i个元素的值。 |");
printf("\n| 4. 用希尔排序对顺序表进行排序。 |");
printf("\n| 5. 用二分法查找值为x的元素的位置。 |");
printf("\n| 6. 在顺序表的第i个元素前删除一个元素。 |");
printf("\n| 7. 显示线性表表长 |");
printf("\n| 8. 输出线性表的元素 |");
printf("\n| 9. 遍历顺序表 |");
printf("\n| 11.在顺序表中查找第i个元素 |");
printf("\n| 0. 返回 |");
printf("\n --------------------------------------------------------------------");
printf("\n请选择你要做的功能\n");
scanf("%d",&flag);
while(flag!=0)
{
switch(flag)
{
case 1:
j=0;
printf("输入要插入的数据:");
scanf("%4d",&a);
while (jlast+2&&j>=0&&a!=0)
{
charu(L1,j,a);
j++;
scanf("%4d",&a);
}
break;
case 2:
printf("输入要插入数据位置i:\n");
scanf("%d",&i);
printf("输入要插入的数据为:\n");
scanf("%d",&a);
charushuju(L1,i,a);
printf("插入后表内数据为:\n");
Show(L1);
break;
case 3:
printf("输入要更新数据位置i:\n");
scanf("%d",&i);
printf("输入要更新的数据为:\n");
scanf("%d",&a);
gengxinshuju(L1,i,a);
printf("更新后表内数据为:\n");
Show(L1);
break;
case 4:
printf("排序后为:\n");
paixu(L1);
Show(L1);
break;
case 5:
printf("输入你想查找的数:\n");
scanf("%d",&a);
printf("该数所在的位置为:\n");
printf("%d",Search_Bin(L1,a));
printf("\n");
break;
case 6:
printf("\n输入要删除数的位置:\n");
scanf("%d",&a);
shangchu(L1,a);
printf("删除后表内数据为:\n");
Show(L1);
break;
case 7:
biaochang(L1);
break;
case 8:
printf("顺序表内数据为:\n");
Show(L1);
break;
case 9: ListTraverse(L1);
break;
default:flag=1;
case 11: printf("输入要查找的下标:");
scanf("%4d",&a);
chazhaoz(L1,a);
break;
}
printf("\n请选择你要做的功能\n");
scanf("%d",&flag);
}
getch();
}
解决方案1: 调试修改完毕
#include "stdio.h"
#include "stdlib.h"
#define max 6
typedef struct/*定义线性表*/
{
int data[max+1];
int last;
}sxb;
sxb *chushihua() /*初始化*/
{
sxb *L;
L=(sxb *)malloc(sizeof(sxb));
L->last=0;
return L;
}
int chazhaoz(sxb *L,int i)
{
int x=0,z=0;
if (L->last==-1)
{
printf("表中没有元素,请插入数据后在操作\n");
return (0);
}
if (i>L->last||i<0)
{
printf("超出了范围,请看清在输入要查找的下标的值\n");
return (-1);
}
x=L->data[i];
printf("下标为%d的数据为:%4d",i,x);
return (1);
}
int charu(sxb *LL,int i,int x)
{ int j;
if(LL->last==max-1)
{
printf("表满");
return (-1);
}
if(i<0||i>=LL->last+2)
{
printf("位置出错");
return 0;
}
for(j=LL->last;j>=i;j--)
LL->data[j+1]=LL->data[j];
LL->data[i]=x;
LL->last++;
return 1;
}
int charushuju(sxb *LL,int i,int x) /*插入*/
{
int j;
if(LL->last==max)
{printf("表满");return(0);}
if(i<1||i>=LL->last+2)
{printf("位置错误");return(-1);}
for(j=LL->last;j>=i;j--)
LL->data[j+1]=LL->data[j];
LL->data[i]=x;
LL->last++;
return(1);
}
void gengxinshuju(sxb *LL,int i,int x) /*更新*/
{
LL->data[i]=x;
}
int shangchu(sxb *L,int i) /*删除*/
{ int j;
if(i<1||i>L->last)
{printf("不存在第i个元素");return(0);}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];
L->last--;
return(1);
}
void biaochang(sxb *L)/*求表长*/
{
printf("当前表长为: %d\n",L->last);
}
int Search_Bin (sxb *L,int k) /*二分法查找*/
{
int low=1,high=L->last,mid;
while(low<=high)
{
mid=(low+high)/2;
if(k==L->data[mid])
return mid;
else if (kdata[mid])
high=mid-1;
else low=mid+1;
}
return(0);
}
void ListTraverse(sxb *L) /*遍历顺序表*/
{
int i;
for(i=1;i<=L->last;i++)
printf("%d,",L->data[i]);
printf("\n");
}
void paixu(sxb *L)/*希尔排序*/
{
int n=4;
int i,j,t;
n=n/2;
while(n>0)
{
for(i=1;i+n<=L->last;i++)
{
j=i;
while(j+n<=L->last)
{
if(L->data[j]>L->data[j+n])
{t=L->data[j];L->data[j]=L->data[j+n];L->data[j+n]=t;}
j=j+n;
}
}
n=n/2;
}
}
void Show(sxb *L)/*输出*/
{
int i;
for(i=1;i<=L->last;i++)
printf("%3d,",L->data[i]);
printf("\n");
}
void main()
{
sxb *L1;
int i,a,flag,j;
system("graftabl 936");
clrscr();
L1=chushihua();
printf("\n ____________________________________________________________________");
printf("\n| 1. 创建线性表 |");
printf("\n| 2. 在顺序表的第i个元素前插入一个元素。 |");
printf("\n| 3. 更新顺序表中第i个元素的值。 |");
printf("\n| 4. 用希尔排序对顺序表进行排序。 |");
printf("\n| 5. 用二分法查找值为x的元素的位置。 |");
printf("\n| 6. 在顺序表的第i个元素前删除一个元素。 |");
printf("\n| 7. 显示线性表表长 |");
printf("\n| 8. 输出线性表的元素 |");
printf("\n| 9. 遍历顺序表 |");
printf("\n| 11.在顺序表中查找第i个元素 |");
printf("\n| 0. 返回 |");
printf("\n --------------------------------------------------------------------");
printf("\n请选择你要做的功能\n");
scanf("%d",&flag);
while(flag!=0)
{
switch(flag)
{
case 1:
j=0;
printf("输入要插入的数据:");
scanf("%4d",&a);
while (jlast+2&&j>=0&&a!=0)
{
charu(L1,j,a);
j++;
scanf("%4d",&a);
}
break;
case 2:
printf("输入要插入数据位置i:\n");
scanf("%d",&i);
printf("输入要插入的数据为:\n");
scanf("%d",&a);
charushuju(L1,i,a);
printf("插入后表内数据为:\n");
Show(L1);
break;
case 3:
printf("输入要更新数据位置i:\n");
scanf("%d",&i);
printf("输入要更新的数据为:\n");
scanf("%d",&a);
gengxinshuju(L1,i,a);
printf("更新后表内数据为:\n");
Show(L1);
break;
case 4:
printf("排序后为:\n");
paixu(L1);
Show(L1);
break;
case 5:
printf("输入你想查找的数:\n");
scanf("%d",&a);
printf("该数所在的位置为:\n");
printf("%d",Search_Bin(L1,a));
printf("\n");
break;
case 6:
printf("\n输入要删除数的位置:\n");
scanf("%d",&a);
shangchu(L1,a);
printf("删除后表内数据为:\n");
Show(L1);
break;
case 7:
biaochang(L1);
break;
case 8:
printf("顺序表内数据为:\n");
Show(L1);
break;
case 9: ListTraverse(L1);
break;
case 11: printf("输入要查找的下标:");
scanf("%4d",&a);
chazhaoz(L1,a);
break;
default:flag=1;break;
}
printf("\n请选择你要做的功能\n");
scanf("%d",&flag);
}
getch();
}
解决方案2: 设个断点自己慢慢调呗!
以上介绍了“ 关于数据结构 程序可运行 其他功能没问题 但是自定义顺序表时出错 求调试”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2735428.html