所以我一直在通過頭檔案處理 C 中的鏈表。當我向其中插入值時,它作業正常,但是一旦我回傳主類并嘗試列印存盤在節點內的值,它就會回傳一個負數。這是迄今為止我的代碼的摘錄,我試圖使其盡可能簡單。
這是包含鏈表代碼的頭檔案。
#pragma once
#include <iostream>
using namespace std;
template <typename T>
class LinkedList {
public:
struct Node {
T data;
struct Node* next;
};
Node* head;
void AddHead(const T& addData) {
Node n;
n.data = addData;
n.next = head;
head = &n;
Print();
}
void Print() {
cout << head << " " << (*head).data << endl;
}
private:
};
這是來自 main 的參考。
LinkedList<int> l = LinkedList<int>();
int i = 5;
l.AddHead(i);
l.Print();
現在我認為這可以正常作業,但顯然在添加節點、程式從頭檔案回傳以及再次列印之間發生了一些事情。我在里面放了第二個列印陳述句來顯示差異。
就目前而言,輸出如下所示:
0000004F9A8FF7F8 5
0000004F9A8FF7F8 -1464607816
那么在同一個記憶體地址,里面存盤的值會發生變化嗎?我不知道我做錯了什么,我很感激任何幫助。
uj5u.com熱心網友回復:
void AddHead(const T& addData) {
Node n;
n.data = addData;
n.next = head;
head = &n;
Print();
}
一旦 AddHead 結束n被釋放,它就是堆疊上的一個臨時變數。您必須在堆上創建節點
void AddHead(const T& addData) {
Node *n = new Node();
n->data = addData;
n->next = head;
head = n;
Print();
}
和下一個建議。不要使用裸指標,使用 std::shared_ptr 或 std::unique_ptr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429311.html
上一篇:可變大小的內置陣列?
下一篇:C 如何用字母和數字分割字串
