使用链表的字符串类

String class using linked list

本文关键字:字符串 链表      更新时间:2023-10-16

我必须编写这个使用链表表示的String类。我的复制构造函数似乎有问题,我不知道如何编写赋值运算符。知道错误在哪里以及如何书写吗?所示的代码用于复制构造函数,具有以下操作String s="word"。我不知道如何为字符串s1=s2编写一个。这是我到目前为止的代码:


struct Element
{
char data;
Element* next;
};
class String
{
   Element* top;
public:
   String();
   bool empty() const;
   char last() const;
   char pop();
   void push(char);
   friend std::ostream& operator<<(std::ostream&, const String&);
   friend std::istream& operator>>(std::istream&, String&);
   String(const char*);
};
String::String(const char *p)
{
    int l = strlen(p);
    for(int i=0; i < l+1 ; i++)
    {
        Element *newElement;
        newElement = new Element;
        newElement->data = p[i];
        newElement->next = NULL;
        if(top == NULL)
        {
            top = newElement;
        }
        else
        {
            Element *tmp = top;
            while(tmp->next != NULL)
            {
                tmp = tmp->next;
                tmp->next = newElement;
            }
        }
    }
}
int main()
{
String s="Hello";
std::cout<<s;//operator<< works tested it
}

如果您定义了单链表,那么最好在列表的开头而不是尾部添加新元素。尽管如此,你的功能可能看起来像

字符串::字符串(const char*p({for(;*p;++p({Element*newElement=新元素;newElement->数据=*p;newElement->next=NULL;if(top==NULL({top=新元素;}其他的{元素*tmp=顶部;而(tmp->next!=NULL(temp=tmp->next;tmp->next=newElement;}}}

顺便说一下,它不是一个复制构造函数。至于复制构造函数,则可以将其定义为

String::String(const String&s(:top(NULL({if(s.top({top=新元素;top->data=s.top->data;top->next=NULL;for(元素*tmp1=top,tmp2=s.top;tmp2->next;tmp1=tmp1->next,tmp2=tmp2->next({tmp1->next=新元素;tmp1->next->data=tmp2->next->data;tmp1->next->next=NULL;}}}

在下面的代码中,while循环将永远不会执行,因为top->next将是NULL

Element *tmp = top;
while(tmp->next != NULL)
{
    ...
}

此外,正如@Claptrap所评论的,您在每个循环迭代中都分配了newElement

考虑到所有这些,我不明白为什么它会失败,但它可能在您尚未发布的代码中。请尽量将您的代码减少到再现问题所需的最低限度,然后将该代码包含在您的帖子中。