| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 666 人关注过本帖
标题:关于数据结构 顺序表的问题 程序可运行 ,但是自定义顺序表功能出错 求调试 ...
只看楼主 加入收藏
bendansasa
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-6-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
关于数据结构 顺序表的问题 程序可运行 ,但是自定义顺序表功能出错 求调试!
程序代码:
#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 编辑 ]
搜索更多相关主题的帖子: 数据 
2011-06-17 01:27
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:5 
我在vc 下编译,有好多错误啊,
第一个就是几个主要的头文件没包涵进去
还有在插入的操作中会有内存泄漏!就是数组下标越界了

。。。
2011-06-17 11:02
bendansasa
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-6-16
收藏
得分:0 
程序代码:
#include "stdio.h"
#define max 88
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)
     {

       printf("表满");
       return (-1);
     }
     if(i<1 || i>LL->last+1)
      {
       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=1;
                                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);
    charu(L1,i-1,a);
    printf("插入后表内数据为:\n");
    Show(L1);
    ;
    break;
    case 3:
    printf("输入要更新数据位置i:\n");
    scanf("%d",&i);
    printf("输入要更新的数据为:\n");
    scanf("%d",&a);
    gengxinshuju(L1,i-1,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-1);
    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);

  }
}
我自己改了一遍  上述问题解决了  主要是有的地方是1 有的地方时0 不统一。

可是希尔排序有问题 有哪位高人能帮忙看看?  自己是在看不出来了 只缘身在此山中啊
2011-06-17 11:42
bendansasa
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-6-16
收藏
得分:0 
输入顺序表的时候  
如果第一个比较大
 比如 5 8 4 6 3 5 4  

用程序排序后就为4 3 4 5 5 6 8

求解
2011-06-17 12:03
qldxsun
Rank: 4
等 级:业余侠客
帖 子:125
专家分:240
注 册:2011-6-4
收藏
得分:5 
回复 4楼 bendansasa
手机上的没看代码,但是加一个表头监督元估计就行了
2011-06-18 06:06
快速回复:关于数据结构 顺序表的问题 程序可运行 ,但是自定义顺序表功能出错 求 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070527 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved