Quenya 发表于 2020-3-14 17:32:14

[已修改]C++ 顺序表的加法实现,帮忙看看吧QAQ

本帖最后由 Quenya 于 2020-3-15 13:28 编辑

要在C++顺序表中添加连接两个表的功能:就是定义了线性表中的顺序表,然后要实现顺序表c=a+b的功能,比如a是1,2,3 ;b是4,5,6,7,8,9,那c就应该是1,2,3,4,5,6,7,8,9嘛,但是我得到的c前两个元素不对,不管怎么改都是随机的两个数比如输出1549200,1510976,3,4,5,6,7,8,9
下面是我的错误代码,其他应该没问题,就是重载的加法、赋值和复制构造函数可能有错(seqList.h的118行起),能帮我看看吗
用的codeblocks

#include "Seqlist.h"

using namespace std;

int main()
{
    seqList <int> a;
    a.insert(0, 1);
    a.insert(1, 2);
    a.insert(2, 3);
    cout << a.length();
    a.traverse();//构建了一个顺序表a,表长为3,表内元素是1,2,3

    seqList <int> b;
    b.insert(0, 4);
    b.insert(1, 5);
    b.insert(2, 6);
    b.insert(3, 7);
    b.insert(4, 8);
    b.insert(5, 9);

    b.traverse();
    //再建一个顺序表b:4,5,6,7,8,9,表长为6


    seqList <int> c;
    c = a + b;       //新增的加法功能,应得到新的顺序表c,表长为9,元素为1,2,3,4,5,6,7,8,9

    c.traverse();                               //c表的第一第二个元素不正常,如果写c=a;c.traverse(); 输出正常
    cout << c.length();


    return 0;
}





头文件:seqList.h

#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED

#include <iostream>
#include <cstdlib>
#include "list.h"

using namespace std;

//顺序表的定义
template <class elemType>
class seqList : public list <elemType>
{
private:
    elemType *data;            //动态数组
    int currentLength;         //表长
    int maxSize;               //容量
    void doubleSpace();      //扩容函数

public:
    seqList (int initSize = 10);                        //构造函数
    ~seqList (){delete [] data;}                        //析构函数
    void clear (){currentLength=0;}                     //清除线性表
    int length()const {return currentLength;}         //求表长
    void insert (int i, const elemType &x);             //插入
    void remove (int i);                              //删除
    int search (const elemType &x)const;                //查询
    elemType visit(int i)const {return data;}      //访问
    void traverse()const;                               //遍历输出

    seqList <elemType> operator+ (const seqList <elemType> &b);//加法重载
    seqList(const seqList<elemType> &d);//复制构造函数
    seqList <elemType> &operator= (const elemType &c);//赋值运算符重载函数


};


//扩容函数
template <class elemType>
void seqList <elemType>::doubleSpace()
{
    elemType *tmp = data;
    maxSize *= 2;
    data = new elemType ;

    for (int i = 0; i < currentLength; ++i )
      data = tmp;

    delete []tmp;
}


//构造函数
template<class elemType>
seqList<elemType> :: seqList(int initSize)
{
    data = new elemType ;
    maxSize = initSize;
    currentLength = 0;
}



//插入
template <class elemType>
void seqList <elemType> ::insert(int i , const elemType &x)
{
    if (currentLength == maxSize) doubleSpace();

    for (int j = currentLength; j > i; j--)
      data = data;

    data = x;
    ++currentLength;
}


//删除
template <class elemType>
void seqList <elemType> :: remove(int i)
{
    if (i < 0 || i >= currentLength)return;

    for (int j = i; j < currentLength; ++j)
      data = data;

    --currentLength;
}


//查询
template <class elemType>
int seqList <elemType> :: search(const elemType &x)const
{
    int i;
    for (i = 0; i < currentLength; i++)
      if (data == x) break;

    if (i == currentLength) return -1;
   else return i;
}


//遍历输出
template <class elemType>
void seqList <elemType> :: traverse () const
{
    cout<<endl;

    for (int i = 0; i < currentLength; ++i)
      cout<< data <<' ';

    cout<<endl;
}


//加法重载
template <class elemType>
seqList <elemType> seqList <elemType> :: operator+ (const seqList <elemType> &b)
{
    seqList<elemType>c(currentLength + b.currentLength);    //新建表c存放加法结果,表长为a,b表长之和

    for (int i = 0; i < currentLength; ++i)
       c.data = data;                                 //把表a的数据复制到c

    for (int j = 0; j < b.currentLength; ++j)
      c.data = b.data;             //把表b的数据j接在表a后复制到c

    c.currentLength = currentLength + b.currentLength;      //设置表长
                                                                                 //如果在这里加代码:cout<<c.data<<c.data;输出1 2

    return c;
}


//复制构造函数
template <class elemType>
seqList <elemType> :: seqList(const seqList<elemType> &d)
{
    currentLength = d.currentLength;
    maxSize = d.maxSize;
    data = new elemType;
    for(int i = 0; i < currentLength; ++i)
      data = d.data;
}


//赋值运算符重载函数
template <class elemType>
seqList <elemType> &seqList <elemType>:: operator= (const elemType &c)
{
    if(this == &c)return *this;   //防止自我赋值

    delete[]data;                     //释放当前对象指向的空间

    currentLength = c.currentLength;
    maxSize = c.maxSize;
    data = new elemType;
    for (int i = 0; i < currentLength; ++i)
      data = c.data;
                                 //构造和等号右边一样的对象


    return *this;

}

#endif // SEQLIST_H_INCLUDED



//头文件list.h,线性表的抽象类
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

#include <iostream>

using namespace std;

template <class elemType>
class list
{
public:
    virtual void clear ()=0;
    virtual intlength()const =0;
    virtual void insert (int i, const elemType &x)=0;
    virtual void remove (int i)=0;
    virtual int search (const elemType &x)const=0;
    virtual elemType visit (int i)const=0;
    virtual void traverse()const=0;
    virtual ~list(){};
};

#endif // LIST_H_INCLUDED

————————————头文件中其他对顺序表的定义和实现没有问题——



之前不知道江湖规矩。。。。:P 直接把代码贴上来了hhh抱歉~

先谢谢大佬们~[鞠躬]

Quenya 发表于 2020-3-15 13:54:29

hhhhh我知道了!
赋值运算符重载的参数写错了:seqList <elemType> &seqList <elemType>:: operator= (const elemType &c)
应该是seqList <elemType> &seqList <elemType>:: operator= (constseqList <elemType> &c)

bin554385863 发表于 2020-3-14 22:54:37

本帖最后由 bin554385863 于 2020-3-14 22:56 编辑

注释注释注释!@!!!!!!!!!!!!!!!!!!!!!!!
几百行代码一行注释都没!!!!!!!!
错误代码也不发!!!!!!!!!!!!
说实话,几百行代码,一句注释都没?谁能知道你想些什么

Quenya 发表于 2020-3-15 12:03:32

本帖最后由 Quenya 于 2020-3-15 12:10 编辑

bin554385863 发表于 2020-3-14 22:54
注释注释注释!@!!!!!!!!!!!!!!!!!!!!!!!
几百行代码一行注释都没!!!!!!! ...

对不起对不起我错了,我现在加注释了QwQ
因为等级太低没有办法传图片,错误的结果如下:
3                                                         a的表长
1 2 3                                                   a的数据

4 5 6 7 8 9                                             b的数据

1549200 1510976 3 4 5 6 7 8 9               c的数据,但是前两个是错的
9                                                          c的表长,正确

Quenya 发表于 2020-3-15 13:51:36

本帖最后由 Quenya 于 2020-3-15 13:54 编辑

不用麻烦了!我知道哪里错了!
页: [1]
查看完整版本: [已修改]C++ 顺序表的加法实现,帮忙看看吧QAQ