我想制作链表..
但第一个节点带有数据和空链接
如果我输入一个字符串(123) 链表如下:
1 / null - 2 /指向最后一个(1) - 3 /指向最后一个(2)
#include <iostream>
#include <string>
using namespace std;
struct link
{
int data;
link* next;
};
class LinkedList
{
private:
link* first;
public:
LinkedList(){}
void Add(string s)
{
for (int i = 0; i > s.length(); i++)
{
if (i == 0)
{
first->data = s[i];
first->next = NULL;
}
else
{
link* NewOne = new link;
NewOne->data = s[i];
NewOne->next = first;
first = NewOne;
}
}
}
void display()
{
cout << first->data;
}
};
int main()
{
LinkedList l1;
l1.Add("2734");
l1.display();
return 0;
}
代码中的错误
答案 0 :(得分:1)
您忘记为first
分配内存。
以下内容可能有所帮助(使用std::unique_ptr
进行免费/正确的内存管理):
struct link{
char data;
std::unique_ptr<link> next;
};
class LinkedList {
private:
std::unique_ptr<link> first;
public:
void Set(const std::string& s){
for (auto c : s) {
std::unique_ptr<link> node = std::move(first);
first = std::make_unique<link>();
first->data = c;
first->next = std::move(node);
}
}
答案 1 :(得分:1)
它看起来像是在int中存储字符。您的输出将是字符的ASCII值,而不是原始int值。
我建议使用Jarod42已经完成的独特指针。话虽如此,下面的这个简单示例不使用它们,因此您需要适当地调用delete或使用unique_ptr。
我添加了一个最后一个指针,用于在我们建立新链接时帮助遍历列表。
private:
Link * first;
Link *last;
int numLinks;
public:
LinkedList()
{
first = NULL;
last = NULL;
numLinks = 0;
}
现在添加
void Add(string s)
{
for (int i = 0; i < s.length(); i++)
{
if (numLinks == 0)
{
first = new Link;
first->data = (s[i] - '0');
first->next = NULL;
last = first;
numLinks++;
}
else
{
Link * newLink = new Link;
newLink->data = (s[i] - '0');
newLink->next = NULL;
last->next = newLink;
last = newLink;
numLinks++;
}
}
}
答案 2 :(得分:0)
构造函数不初始化first
成员。随后,在Add()
:
for (int i = 0; i > s.length();i++){
if (i == 0){
first->data = s[i];
first->next = NULL;
}
这最终取消引用未初始化的指针,导致未定义的行为。
您的display()
也存在问题,但这是主要问题。