我想制作一个链表。。
但是具有数据和零链路的第一个节点
如果我输入一个字符串(123)链接列表如下:
1/空-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;
}
代码有什么问题
您忘记为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);
}
}
实例
看起来您也在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++;
}
}
}
构造函数不会初始化first
成员。随后,在Add()
:中
for (int i = 0; i > s.length();i++){
if (i == 0){
first->data = s[i];
first->next = NULL;
}
这最终会取消引用未初始化的指针,从而导致未定义的行为。
你的display()
也有问题,但这是主要问题。