| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 460 人关注过本帖
标题:求助顺序表的实现,该怎么改
只看楼主 加入收藏
奇葩一朵朵
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-12-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
求助顺序表的实现,该怎么改
#include<stdio.h>
#include<stdlib.h>
//存储结构的定义
//线性表
#define OK             1
#define ERROR          0
#define LIST_INIT_SIZE 100     //线性表存储空间的初始分配量
#define LISTINCREMENT  10      //线性表存储空间的分配增量
typedef char ElemType;         //用户自定义数据类型
typedef struct {
    ElemType    * elem;        //存储空间基址
    int         length;        //当前长度
    int         listsize;      //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
 
//基本操作的实现
//顺序表的初始化
void InitList(SqList &L ){
  L.elem=(char*)malloc(LIST_INIT_SIZE*sizeof(char));
  L.length=0;
  L.listsize=LIST_INIT_SIZE;//线性表存储空间的初始分配量,长度为100
  return ;
}
                       
//销毁
void destruct(SqList &L){
   free(L.elem);
}

//清空
void ClearList(SqList &L)
{   
    L.length=0;
    return;
}

//判空
int ListEmpty(SqList L)
{   
    if(L.length==0)return 1;
    else
        return 0;
}

//求长度
int ListLength(SqList L)
{   
    return L.length;
}

//取元素
int GetElem(SqList &L,int i,ElemType &e)
{   
    if(i<1||i>L.length)
    {        
       return 0;
    }
    e=L.elem[i-1];
    return 1;
}

//插入
int ListInsert(SqList L,int i,ElemType e)
{
    int j;
    if(i<1||i>L.length+1)
    {        
        return 0;
    }
   
    for(j=L.length-1;j>=i-1;--j)
    {
        L.elem[j+1]=L.elem[j];
    }
    L.elem[i-1]=e;
    L.length++;
    return L.length;
}

//定位
int LocateElem(SqList L,ElemType e)
{
    int i=0;
    while(i<L.length&&L.elem[i]!=e)
        i++;
    if(i<=L.length)
        return i;
    else
        return 0;
}

//前驱
int PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
    int i;
    i=LocateElem(L,cur_e);
    if(i)
    {
        //
        if(i<=0)
        {            
            return 0;
        }
        else
        {
            pre_e=L.elem[i-1];
            return 1;
        }
    }
    else
    {        
        return 0;
    }
}

//后继
int NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
    int i;
    i=LocateElem(L,cur_e);
    if(i>=0)
    {
        //
        if(i==L.length-1)
        {            
            return 0;
        }
        else
        {
            next_e=L.elem[i+1];
            return 1;
        }
    }
    else
    {        
        return 0;
    }
}

//删除
int ListDelete(SqList &L,int i,ElemType &e)
{
    int j;
    if(i<1||i>L.length)
    {
        return 0;
    }
    if(ListEmpty(L))
    {        
        return 0;
    }
    e=L.elem[i-1];
    for(j=i;j<=L.length-1;j++)//数据前移操作
    {
        L.elem[j-1]=L.elem[j];
    }
    L.length--;
    return 1;
}

//输出数据
void ListTraverse(SqList L)
{
    int i;
    for(i=0;i<L.length;i++)
    {
        printf("%5d",L.elem[i]);
    }
    return;
}


//测试代码
void  main()
{
   bool flag=1;
  char e,e1;
  char c;
  int i,n,select,x1;
  SqList L;
  InitList(L);
  n=5;
  for(i=1;i<=n;i++)
  {
    c='A'+i-1;
    L.length=ListInsert(L,i,c);
  }

//循环代码
while(flag)
{
   printf("\n");
   printf("/******************************************************/\n");
   printf("input your select:\n");
   scanf("%d",&select);
   switch(select){
      case 0:flag=0;break;
      case 1:x1=ListLength(L);
             printf("顺序表的长度:%d",x1);
             flag=1;
             break;
      case 2:ListInsert(L,3,'0');
             ListTraverse(L);
             flag=1;
             break;
      case 3:x1=ListEmpty(L);
             if(x1==0)
                 printf("该表不为空\n");
             else
                 printf("该表为空!!!\n");
             flag=1;
             break;
      case 4:printf("请输入删除的位置,大于1小于6\n");
             scanf("%d",&select);
             x1=ListDelete(L,select,e);
             if(x1==1)
             {
                 printf("删除成功!!\n");
                 printf("删除的元素是:");
                 printf("%5d",e);
             }
             else
                 printf("删除失败,不存在该元素!!\n");
             flag=1;
             break;
      case 5:printf("请输入插入的元素:\n");
             scanf("%d",&e);
             L.length=ListInsert(L,L.length,e);
             if(L.length==0)
                 printf("插入失败!!\n");
             else
                 printf("插入成功!!\n");
             flag=1;
             break;
      case 6:printf("请输入需要查找的元素:\n");
             scanf("%d",&e);
             x1=PriorElem(L,e,e1);
             if(x1==0)
                 printf("该元素没有直接前驱!!\n");
             else
             {
                 printf("该元素的直接前驱是:");
                 printf("%5d",e1);
                 printf("\n");
             }
             flag=1;
             break;
      case 7:printf("请输入需要查找的元素:\n");
             scanf("%d",&e);
             x1=NextElem(L,e,e1);
             if(x1==0)
                 printf("该元素没有直接后继!!\n");
             else
             {
                 printf("该元素的直接后继是:");
                 printf("%5d",e1);
                 printf("\n");
             }
             flag=1;
             break;
      case 8:printf("请输入要取出的元素的位置:\n");
             scanf("%d",&i);
             x1=GetElem(L,i,e);
             if(x1==0)
                 printf("该元素不存在表中!!\n");
             else
             {
                 printf("取出的元素是:\n");
                 printf("%5d",e);
                 printf("\n");
             }
             flag=1;
             break;
      default:printf("输入错误,请重新输入!!!!\n");
              flag=1;
              break;
    }
}
}
用anyview只检查到循环代码有问题,哪里出问题实在找不出
搜索更多相关主题的帖子: include 线性表 空间 用户 
2013-12-23 19:59
wangdayong99
Rank: 2
等 级:论坛游民
帖 子:9
专家分:97
注 册:2013-12-24
收藏
得分:20 
case2中将中间位置插入0后导致程序错误,去掉ListInsert(L,3,'0');这句后工作正常,删除时没有考虑零的情况,导致程序混乱了。
case 2://ListInsert(L,3,'0');
    ListTraverse(L);
    flag=1;
    break;
2013-12-25 15:00
快速回复:求助顺序表的实现,该怎么改
数据加载中...
 
   



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

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