| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7090 人关注过本帖
标题:用c++写的线性表,插入和删除时的问题
只看楼主 加入收藏
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
用c++写的线性表,插入和删除时的问题
程序代码:
#include<iostream>
using namespace std;

const int SIZE = 10;
const int MAX = 100;
typedef int ElemType;
typedef struct SL
{
    ElemType * pElem;
    int length;
    int max;
    int add;
}SqList;

void create_SL(SqList &);//建立线性表
void init_SL(SqList &);//初始化线性表
bool is_emept(SqList &);//判断线性表是否为空
void output_SL(SqList &);//输出线性表
bool is_implement(SqList &);//是否执行语句
bool insert_SL(SqList &, int, ElemType);//插入元素
bool delete_SL(SqList &, int);//删除元素

int main()
{
    SqList  p;
    int pos;
    ElemType e;

    create_SL(p);
    init_SL(p);
    cout << "原线性表:" << endl;
    output_SL(p);

    if (0 == p.length)
        return 0;

    cout << "需要插入第几个元素后 : ";
    cin >> pos;
    if (pos != 0)
    {
        cout << "插入的元素是 : ";
        cin >> e;
    }
    insert_SL(p, pos, e);//插入元素
    cout << "插入后的线性表:" << endl;
    output_SL(p);

    cout << "需要删除第几个元素 : ";
    cin >> pos;
    delete_SL(p, pos);
    cout << "删除后的线性表:" << endl;
    output_SL(p);

    return 0;
}

void create_SL(SqList &p)//建立线性表
{
    p.max = MAX;
    p.pElem = new ElemType[SIZE];
    if (NULL == p.pElem)
    {
        cout << "分配失败,程序终止!\n";
        exit(-1);
    }
    p.length = 0;
}

void init_SL(SqList &p)
{
    int i;

    cout << "需要输入多少个数:";
    cin >> p.length;
    cout << "请输入整数:\n";
    for (i = 0; i<p.length; ++i)
    {
        cin >> p.pElem[i];

    }

}

bool  is_emept(SqList &p)
{
    if (0 == p.length)
        return true;
    else
        return false;
}

void output_SL(SqList &p)
{
    if (is_emept(p))
    {
        cout << "线性表为空!\n";
    }
    int i;
    for (i = 0; i < p.length; i++)
        cout << p.pElem[i] << "  ";
    cout << endl;
}


bool insert_SL(SqList &p, int pos, ElemType e)//e储存所插入的元素
{    
    if (pos<0 || pos >p.length)
        return false;

    ++p.length;
    int i;
    for (i = p.length; i != pos; --i)
        p.pElem[pos+1] = p.pElem[pos];
    p.pElem[pos] = e;

    return true;
}

bool delete_SL(SqList &p, int pos)
{
    if (pos<1 || pos >p.length)
    {
        cout << "删除失败!" << endl;
        return false;
    }

    int i;
    for (i = pos; i <p.length; ++i)
        p.pElem[pos-1] = p.pElem[pos];
    --p.length;
    return true;
}

当插入和删除时, 在 取 pos != 1 时, 源代码没问题
而取 pos == 1 时, 源代码就出现问题了
请问代码那个地方有问题
搜索更多相关主题的帖子: 线性表 color 
2016-03-08 17:44
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
主要是循环体的问题

delete部分自己想

程序代码:
bool insert_SL(SqList &p, int pos, ElemType e) //e储存所插入的元素
{
    if (pos < 0 || pos > p.length) return false;

//    ++p.length;
//    int i;
//    for (i = p.length;i != pos;--i)
//    {
//        p.pElem[pos + 1] = p.pElem[pos];
//    }
//    p.pElem[pos] = e;
    for (int i = p.length; i != pos;--i)
    {
        p.pElem[i] = p.pElem[i - 1];
    }
    p.pElem[pos] = e;
    p.length += 1;

    return true;
}



[fly]存在即是合理[/fly]
2016-03-09 09:16
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
收藏
得分:0 
回复 2楼 azzbcc
恩恩。
++ p.length; 为啥写在for语句后了,不是有先 ++p.length, 才能插入一个元素,
否则可能出现分配的内存不够(p.length 大于 分配内存的最大值)。
2016-03-09 11:31
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 3楼 ldsh304
确实需要判断越界,但没看到你有判断的部分,我也就没添。




[fly]存在即是合理[/fly]
2016-03-09 13:15
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
收藏
得分:0 
回复 4楼 azzbcc
如果要判断,那 ++p.length 放哪里比较好?
2016-03-09 16:17
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
放哪里有什么区别么?放前面的话注意 int i = p.length - 1

ps:本来想这么写的
程序代码:
bool insert_SL(SqList &p, int pos, ElemType e) //e储存所插入的元素
{
    if (pos < 0 || pos > p.length) return false;
    if (p.length == p.max)
    {
        cerr << "STACK OVERFLLOW" << endl;
        return false;
    }
    for (int i = p.length++;i != pos;--i)
    {
        p.pElem[i] = p.pElem[i - 1];
    }
    p.pElem[pos] = e;

    return true;
}



[fly]存在即是合理[/fly]
2016-03-10 11:48
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
收藏
得分:0 
回复 6楼 azzbcc
我看到很多代码都是那样写,还以为有什么不成文的约定了,谢谢了
2016-03-10 11:58
快速回复:用c++写的线性表,插入和删除时的问题
数据加载中...
 
   



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

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