| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 499 人关注过本帖
标题:求大神啊,debug之后发现有几个小问题不明白啊~~ADT List 基本操作13个:(1) ...
只看楼主 加入收藏
Cile
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-10-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
求大神啊,debug之后发现有几个小问题不明白啊~~ADT List 基本操作13个:(1)用顺序存储结构实现
刚学数据结构,貌似有问题啊,求指导!

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量

#define OVERFLOW -2;  //存储分配失败溢出
#define OK 1;
#define ERROR 0;

typedef int ElemType;   //假设存储的数据为整型,这个可以根据需要自行修改
typedef int Status;   //Status是函数类型,其值是函数结果状态代码,如OK等

typedef struct  //线性表的动态分配顺序存储结构
{
    ElemType *elem;  //存储空间基址
    int length;   //当前长度
    int listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

Status visit(ElemType c)   //输出元素C
{
    printf("%d\t",c);
    return OK;
}

Status InitList_Sq(SqList &L)  //构造一个顺序结构的空的线性表
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
        exit(OVERFLOW);  //存储分配失败

    L.length=0;  //空表长度为0
    L.listsize=LIST_INIT_SIZE;  //初始存储容量
    return OK;
}

Status DestroyList_Sq(SqList &L)//当线性表L已存在,销毁线性表L,即释放存储空间
{
    free(L.elem);
    L.elem=NULL;
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}

Status ListClear_Sq(SqList &L)  //线性表L已存在,将L重置为空表
{
    L.length=0;
    return OK;
}

bool ListEmpty_Sq(SqList L)  //线性表L已存在,若L为空表,则返回TRUE;否则返回FAULSE
{
    if(L.length==0)
        return true;
    else
        return false;
}

int ListLength_Sq(SqList L)  //线性表L已存在,返回L中数据元素个数
{
    return L.length;
}

Status GetElem_Sq(SqList L,int i,ElemType &e)  
//线性表L已存在,1<=i<=ListLength(L),用e返回L中第i个数据元素的值
{
    if(L.length==0||i<1||i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}

int LocateElem_Sq(SqList L,ElemType e)
//线性表L已存在,返回L中第1个与e满足关系的数据元素的位序。若这样的数据元素不存在,返回值为0
{
    int i;
    if(L.length==0)
        return 0;
    for(i=0;i<L.length;i++)
    {
        if(L.elem[i]==e)
            break;
    }
    if(i>=L.length)
        return 0;
    return i+1;
}

ElemType PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e)
//线性表L已存在,若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//否则操作失败,pre_e无定义
{
    int j;
    j=LocateElem_Sq(L,cur_e);
    if(j>1&&j<=L.length)
    {
        pre_e=L.elem[j-1-1];
        return OK;
    }
    else
        return ERROR;
}

ElemType NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e)
//线性表L已存在,若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的前驱,
//否则操作失败,next_e无定义
{
    int j;
    j=LocateElem_Sq(L,cur_e);
    if(j>=1&&j<L.length)
    {
        next_e=L.elem[j-1+1];
        return OK;
    }
    else
        return ERROR;
}

Status ListInsert_Sq(SqList &L,int i,ElemType e)
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
{
    int *newbase;
    if(i<1||i>L.length) //i值不合法
        return ERROR;
    if(L.length==L.listsize)  //当前存储空间已满,增加分配
    {
        newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
            exit(OVERFLOW);   //存储分配失败
        L.elem=newbase;    //新基址
        L.listsize+=LISTINCREMENT;   //增加存储容量
    }
    ElemType *q,*p;
    q=&L.elem[i-1];
    for(*p=L.elem[L.length-1];p>=q;--p)
        *(p+1)=*p;   //插入位置之后的元素右移
    *q=e;   //插入e
    ++L.length;   //表长+1
    return OK;
}

Status ListDelete_Sq(SqList &L,int i,ElemType &e)
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=ListLength_Sq(L)
{
    if(i<1||i>L.length)  //i值不合法
        return ERROR;
    ElemType *p,*q;
    p=&L.elem[i-1];   //p为要删除的元素位置
    e=*p;   //被删除的元素的值赋给e
    q=L.elem+L.length-1;   //表围元素的位置
    for(++p;p<=q;++p)
        *(p-1)=*p;    //被删除元素后面的元素向左移动
    --L.length;   //表长减1
    return OK;
}

Status ListTraverse_Sq(SqList L)
//线性表L已存在,依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
{
    int i;
    for(i=0;i<L.length;i++)
        visit(L.elem[i]);
    printf("\n");
    return OK;
}

Status ListCreat_Sq(SqList &L,int n)
//逆序输入n个元素的值,建立顺序型线性表L
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    L.length=L.length+sizeof(ElemType)*n;
    int i;
    for(i=0;i<=n;i++)
    {
        int e;
        printf("请输入要插入值:\n");
        scanf("%d",e);
        L.elem[i]=e;
    }
}

void main()  //测试上述函数
{
    SqList L;
    ElemType e,cur_e,pre_e,next_e;
    int i;
    int j,k;

    //线性表初始化
    if(InitList_Sq(&L))
        printf("线性表已建立成功!\n");
    else
        printf("线性表建立失败!\n");

    for(j=1;j<=5;j++)
        i=ListInsert_Sq(&L,1,j);  //调用ListInser_Sq函数
    printf("在L的表头依次插入1——5后,L.elem=");
    ListTraverse_Sq(L);   //调用ListTraverse_Sq函数
    printf("L.length=%d\n",L.length);

    i=ListEmpty_Sq(L);  //调用ListEmpty_Sq函数
    printf("L是否空:i=%d,空为1,非空为0\n",i);
    i=ListClear_Sq(&L);  //调用ListClear_Sq函数
    printf("清空后L.length=%d\n",L.length);
    i=ListEmpty_Sq(L);  //再次调用ListEmpty_Sq函数
    printf("L是否空:i=%d,空为1,非空为0\n",i);

    for(j=1;j<=10;j++)
        i=ListInsert_Sq(&L,1,j);  //调用ListInser_Sq函数
    printf("在L的表头依次插入1——5后,L.elem=");
    ListTraverse_Sq(L);   //调用ListTraverse_Sq函数
    printf("L.length=%d\n",L.length);
    pre_e=PriorElem_Sq(L,3,&pre_e);  //找3的前驱元素
    printf("3的前驱元素是%d",pre_e);
    next_e=NextElem_Sq(L,3,&next_e);  //找3的后驱元素
    printf("3的后驱元素是%d",next_e);
    GetElem_Sq(L,5,&e);   //调用GetElem_Sq函数
    printf("第5 个元素的值为:%d\n",e);
    for(j=3;j<=4;j++)
    {
        k=LocateElem_Sq(L,j); //调用LocateElem_Sq函数
        if(k)
            printf("第%d 个元素的值为%d\n",k,j);
        else
            printf("没有值为%d 的元素\n",j);
    }
   
    k=ListLength_Sq(L); //k 为表长
    for(j=k+1;j>=k;j--)
    {
        i=ListDelete_Sq(&L,j,&e); //删除第j 个数据  
        if(i==ERROR)
            printf("删除第%d 个数据失败\n",j);
        else
            printf("删除第%d 个的元素值为:%d\n",j,e);

    }
    printf("依次输出L 的元素:");
    ListTraverse_Sq(L);
}


红色的字体,都是不太懂的
为什么OVERFLOW要定义成-2呢?
为什么说我主程序里定义的函数不能从Status*转换成Status&呢?不太懂
还有if语句,说我少了)~~
最后的else无匹配的if~~

谢谢各位大神的帮助了

搜索更多相关主题的帖子: include 线性表 结构 
2012-10-16 20:45
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
语法问题
程序代码:
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OVERFLOW -2  //存储分配失败溢出
#define OK 1
#define ERROR 0
typedef int ElemType;   //假设存储的数据为整型,这个可以根据需要自行修改
typedef int Status;   //Status是函数类型,其值是函数结果状态代码,如OK等
typedef struct  //线性表的动态分配顺序存储结构
{
    ElemType *elem;  //存储空间基址
    int length;   //当前长度
    int listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status visit(ElemType c)   //输出元素C
{
    printf("%d\t",c);
    return OK;
}
Status InitList_Sq(SqList &L)  //构造一个顺序结构的空的线性表
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)
        exit(OVERFLOW);  //存储分配失败
    L.length=0;  //空表长度为0
    L.listsize=LIST_INIT_SIZE;  //初始存储容量
    return OK;
}
Status DestroyList_Sq(SqList &L)//当线性表L已存在,销毁线性表L,即释放存储空间
{
    free(L.elem);
    L.elem=NULL;
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}
Status ListClear_Sq(SqList &L)  //线性表L已存在,将L重置为空表
{
    L.length=0;
    return OK;
}
bool ListEmpty_Sq(SqList L)  //线性表L已存在,若L为空表,则返回TRUE;否则返回FAULSE
{
    if(L.length==0)
        return true;
    else
        return false;
}
int ListLength_Sq(SqList L)  //线性表L已存在,返回L中数据元素个数
{
    return L.length;
}
Status GetElem_Sq(SqList L,int i,ElemType &e)
//线性表L已存在,1<=i<=ListLength(L),用e返回L中第i个数据元素的值
{
    if(L.length==0||i<1||i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}
int LocateElem_Sq(SqList L,ElemType e)
//线性表L已存在,返回L中第1个与e满足关系的数据元素的位序。若这样的数据元素不存在,返回值为0
{
    int i;
    if(L.length==0)
        return 0;
    for(i=0;i<L.length;i++)
    {
        if(L.elem[i]==e)
            break;
    }
    if(i>=L.length)
        return 0;
    return i+1;
}
ElemType PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e)
//线性表L已存在,若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//否则操作失败,pre_e无定义
{
    int j;
    j=LocateElem_Sq(L,cur_e);
    if(j>1&&j<=L.length)
    {
        pre_e=L.elem[j-1-1];
        return OK;
    }
    else
        return ERROR;
}
ElemType NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e)
//线性表L已存在,若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的前驱,
//否则操作失败,next_e无定义
{
    int j;
    j=LocateElem_Sq(L,cur_e);
    if(j>=1&&j<L.length)
    {
        next_e=L.elem[j-1+1];
        return OK;
    }
    else
        return ERROR;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
{
    int *newbase;
    if(i<1||i>L.length) //i值不合法
        return ERROR;
    if(L.length==L.listsize)  //当前存储空间已满,增加分配
    {
        newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
            exit(OVERFLOW);   //存储分配失败
        L.elem=newbase;    //新基址
        L.listsize+=LISTINCREMENT;   //增加存储容量
    }
    ElemType *q,*p;
    q=&L.elem[i-1];
    for(*p=L.elem[L.length-1];p>=q;--p)
        *(p+1)=*p;   //插入位置之后的元素右移
    *q=e;   //插入e
    ++L.length;   //表长+1
    return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=ListLength_Sq(L)
{
    if(i<1||i>L.length)  //i值不合法
        return ERROR;
    ElemType *p,*q;
    p=&L.elem[i-1];   //p为要删除的元素位置
    e=*p;   //被删除的元素的值赋给e
    q=L.elem+L.length-1;   //表围元素的位置
    for(++p;p<=q;++p)
        *(p-1)=*p;    //被删除元素后面的元素向左移动
    --L.length;   //表长减1
    return OK;
}
Status ListTraverse_Sq(SqList L)
//线性表L已存在,依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
{
    int i;
    for(i=0;i<L.length;i++)
        visit(L.elem[i]);
    printf("\n");
    return OK;
}
void ListCreat_Sq(SqList &L,int n)
//逆序输入n个元素的值,建立顺序型线性表L
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    L.length=L.length+sizeof(ElemType)*n;
    int i;
    for(i=0;i<=n;i++)
    {
        int e;
        printf("请输入要插入值:\n");
        scanf("%d",e);
        L.elem[i]=e;
    }
}
void main()  //测试上述函数
{
    SqList L;
    ElemType e,cur_e,pre_e,next_e;
    int i;
    int j,k;

    //线性表初始化
    if(InitList_Sq(L))
        printf("线性表已建立成功!\n");
    else
        printf("线性表建立失败!\n");

    for(j=1;j<=5;j++)
        i=ListInsert_Sq(L,1,j);  //调用ListInser_Sq函数
    printf("在L的表头依次插入1——5后,L.elem=");
    ListTraverse_Sq(L);   //调用ListTraverse_Sq函数
    printf("L.length=%d\n",L.length);

    i=ListEmpty_Sq(L);  //调用ListEmpty_Sq函数
    printf("L是否空:i=%d,空为1,非空为0\n",i);
    i=ListClear_Sq(L);  //调用ListClear_Sq函数
    printf("清空后L.length=%d\n",L.length);
    i=ListEmpty_Sq(L);  //再次调用ListEmpty_Sq函数
    printf("L是否空:i=%d,空为1,非空为0\n",i);

    for(j=1;j<=10;j++)
        i=ListInsert_Sq(L,1,j);  //调用ListInser_Sq函数
    printf("在L的表头依次插入1——5后,L.elem=");
    ListTraverse_Sq(L);   //调用ListTraverse_Sq函数
    printf("L.length=%d\n",L.length);
    pre_e=PriorElem_Sq(L,3,pre_e);  //找3的前驱元素
    printf("3的前驱元素是%d",pre_e);
    next_e=NextElem_Sq(L,3,next_e);  //找3的后驱元素
    printf("3的后驱元素是%d",next_e);
    GetElem_Sq(L,5,e);   //调用GetElem_Sq函数
    printf("第5 个元素的值为:%d\n",e);
    for(j=3;j<=4;j++)
    {
        k=LocateElem_Sq(L,j); //调用LocateElem_Sq函数
        if(k)
            printf("第%d 个元素的值为%d\n",k,j);
        else
            printf("没有值为%d 的元素\n",j);
    }
  
    k=ListLength_Sq(L); //k 为表长
    for(j=k+1;j>=k;j--)
    {
        i=ListDelete_Sq(L,j,e); //删除第j 个数据
        if(i==ERROR)
            printf("删除第%d 个数据失败\n",j);
        else
            printf("删除第%d 个的元素值为:%d\n",j,e);
    }
    printf("依次输出L 的元素:");
    ListTraverse_Sq(L);
}

 
2012-10-16 23:32
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:10 
可不可以用短一点的英文字母啊,敲的不累么

我要成为嘿嘿的黑客,替天行道
2012-10-17 03:29
Cile
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-10-16
收藏
得分:0 
回复 楼主 Cile
呃,貌似并没有具体指出我的问题吧,经过调试我少了几个bug,但是剩下的问题还是没弄懂啊,求指导
2012-10-21 19:58
Cile
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-10-16
收藏
得分:0 
回复 2楼 寒风中的细雨
求改错啊
2012-10-21 19:59
快速回复:求大神啊,debug之后发现有几个小问题不明白啊~~ADT List 基本操作13个 ...
数据加载中...
 
   



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

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