我必须编写这个使用链表表示的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
。
考虑到所有这些,我不明白为什么它会失败,但它可能在您尚未发布的代码中。请尽量将您的代码减少到再现问题所需的最低限度,然后将该代码包含在您的帖子中。