对于一个项目,im尝试设置一个链表对象,以便可以使用显式值构造函数对其进行初始化。 我希望它看起来像这样:
WORD you("you");//where the object you's linked list now contains y o u;
但是当我打印出对象时,我看到的只是这个符号"="当我打印出你的长度时,我得到-858993459
这是我的显式值构造函数,有人可以告诉我我做错了什么吗?
WORD::WORD(string s)
{
front = 0;
int i = 0;
int len = s.length();
if(front == 0)
{
front = new alpha_numeric;
alpha_numeric *p = front;
while(s[i] <= len)
{
p -> symbol = s[i];
p -> next = new alpha_numeric;
p = p -> next;
p -> symbol = s[i++];
}
p -> next = 0;
}
}
这是类声明文件,如果它有帮助
#include <iostream>
#include <string>
using namespace std;
#pragma once
class alpha_numeric //node
{
public:
char symbol; //data in node
alpha_numeric *next;//points to next node
};
class WORD
{
public:
WORD(); //front of list initially set to Null
WORD(const WORD& other);
WORD(string s); //***EXPLICIT VALUE CONSTRUCTOR
bool IsEmpty(); //done
int Length();
void Add(char); //done
//void Insert(WORD bword, int position);
//void operator=(char *s);
friend ostream & operator<<(ostream & out, const WORD& w);//done
private:
alpha_numeric *front; //points to the front node of a list
int length;
};
你从不设置长度,所以这就是为什么它是垃圾。正如luthien256 ahd LihO指出的那样,你的while循环也是错误的,if(前面== 0)测试毫无意义。
最后,不需要p -> symbol = s[i++];
。只需递增 i。
试试这个:
class alpha_numeric //node
{
public:
char symbol; //data in node
alpha_numeric *next;//points to next node
};
class WORD
{
public:
WORD(); //front of list initially set to Null
WORD(const WORD& other);
WORD(string s); //***EXPLICIT VALUE CONSTRUCTOR
bool IsEmpty(); //done
int Length() { return length; }
alpha_numeric *Front() { return front; }
void Add(char); //done
//void Insert(WORD bword, int position);
//void operator=(char *s);
friend ostream & operator<<(ostream & out, const WORD& w);//done
private:
alpha_numeric *front; //points to the front node of a list
int length;
};
WORD::WORD(string s)
{
front = 0;
int i = 0;
int len = s.length();
length = len;
if (length == 0) {
front = NULL;
return;
}
front = new alpha_numeric;
alpha_numeric *p = front;
while(i < len)
{
p -> symbol = s[i];
if (i != len - 1) {
p -> next = new alpha_numeric;
p = p -> next;
}
else
p -> next = NULL;
++i;
}
}
int main() {
WORD you("you");
alpha_numeric* front = you.Front();
while(front != NULL) {
cout<<(front->symbol)<<endl;
front = front->next;
}
cout<<you.Length()<<endl;
return 0;
}
您已std::string s
和int i
初始化为0
。然后int len
初始化为 s.length();
并且想要遍历此字符串:
while(s[i] <= len) <----------------- THIS IS WRONG
{
...
p -> symbol = s[i++];
}
另请注意,std::basic_string::length()
的复杂性为 O(1)。使用临时变量len
没有意义。您还做了很多多余的事情,例如将0
分配给front
,然后检查if (front == 0)
。它可能看起来像这样:
WORD::WORD(std::string s)
{
length = s.length();
if (length == 0)
{
front = NULL
return;
}
front = new alpha_numeric;
alpha_numeric *p = front;
int i = 0;
while(i < length - 1)
{
p->symbol = s[i++];
p->next = new alpha_numeric;
p = p->next;
}
p->symbol = s[i];
p->next = NULL;
}
你的 while 循环不太可能正在执行。 我相信:
while(s[i] <= len)
应该是
while(i < len)
试试这个:
WORD::WORD(string s)
{
int i;
int len = s.length();
front = new alpha_numeric;
alpha_numeric *p = front;
for(i = 0; i < len; i++)
{
p -> symbol = s[i];
p -> next = (i == len - 1) ? 0 : new alpha_numeric;
p = p -> next;
}
}