注册 登录
编程论坛 数据结构与算法

用c++写的线性表,插入和删除时的问题

ldsh304 发布于 2016-03-08 17:44, 7107 次点击
程序代码:
#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 时, 源代码就出现问题了
请问代码那个地方有问题
6 回复
#2
azzbcc2016-03-09 09:16
主要是循环体的问题

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;
}

#3
ldsh3042016-03-09 11:31
回复 2楼 azzbcc
恩恩。
++ p.length; 为啥写在for语句后了,不是有先 ++p.length, 才能插入一个元素,
否则可能出现分配的内存不够(p.length 大于 分配内存的最大值)。
#4
azzbcc2016-03-09 13:15
回复 3楼 ldsh304
确实需要判断越界,但没看到你有判断的部分,我也就没添。


#5
ldsh3042016-03-09 16:17
回复 4楼 azzbcc
如果要判断,那 ++p.length 放哪里比较好?
#6
azzbcc2016-03-10 11:48
放哪里有什么区别么?放前面的话注意 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;
}

#7
ldsh3042016-03-10 11:58
回复 6楼 azzbcc
我看到很多代码都是那样写,还以为有什么不成文的约定了,谢谢了
1