C ++基于指针的LinkedList

时间:2017-09-08 22:24:33

标签: c++ string pointers

我开始学习C ++ - 特别是指针。我以为我会尝试一个基本的链表。这是我的代码:

#include <iostream>

using namespace std;

struct Linked {
    Linked *next;
    string val;
};

Linked newLinked(string val);
Linked addLinked(Linked l, string val);
void printLinked(Linked l);

Linked newLinked(string val) {
    Linked l;
    l.val = val;
    l.next = NULL;
    return l;
}

Linked addLinked(Linked l, string val) {
    Linked n = newLinked(val);
    n.next = &l;
    return n;
}

void printLinked(Linked l) {
    Linked *r = &l;
    while (r != NULL) {
        cout << (*r).val << endl;
        r = (*r).next;
    }
}

int main() {
    Linked list = newLinked("This is the root node.");
    list = addLinked(list, "This is the second node.");
    list = addLinked(list, "This is the third node.");
    list = addLinked(list, "This is the fourth, and final, node.");
    printLinked(list);
    return 0;
}

很抱歉,如果我的格式很糟糕,或者我违反惯例,仍在学习。 (如果您愿意,请继续并指出我如何改进我的代码风格,我来自Java / JS背景!)

跑步时,我明白了:

This is the fourth, and final, node.
�;��R�;��R 
This is the fourth, and 
�;��R�;��R 

我的猜测是,包含早期字符串的内存被覆盖 - &#34;这是第四个的长度,&#34;与&#34相同;这是第二个节点。&#34;。

不幸的是,我很难过为什么会这样......我希望这里的某个人能够指向我(哈哈)朝着正确的方向前进。

1 个答案:

答案 0 :(得分:0)

这就是使代码正常工作的方法。

struct Linked {
Linked *next;
string val;
};

Linked* newLinked(string val);
Linked* addLinked(Linked* l, string val);
void printLinked(Linked l);

Linked* newLinked(string val) {
   Linked *l = new Linked;
   l->val = val;
   l->next = NULL;
   return l;
}

Linked* addLinked(Linked* l, string val) {
   Linked *n = newLinked(val);
   n->next = l;
   return n;
}

void printLinked(Linked* l) {
    Linked *r = l;
    while (r != NULL) {
       cout << (*r).val << endl;
       r = (*r).next;
    }
}

int main(){
    Linked *list = newLinked("This is the root node.");
    list = addLinked(list, "This is the second node.");
    list = addLinked(list, "This is the third node.");
    list = addLinked(list, "This is the fourth, and final, node.");
    printLinked(list);

    return 0;
}

请注意,这会导致内存泄漏,因为我们执行但没有删除。我们需要类似的东西:

void destroyList(Linked *l){
   while(l){
      Linked *r = l->next;
      delete l;
      l = r;
   }
}

避免泄漏。在main()的末尾调用此 destroyList