关于数据结构 顺序表的问题 程序可运行 ,但是自定义顺序表功能出错 求调试!
程序代码:
#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 (k<L->data[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 (j<L1->last+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(); }
[ 本帖最后由 bendansasa 于 2011-6-17 03:51 编辑 ]