不知道哪里錯了,當我除錯代碼時發現'new node'地址是'new node'地址,基本上new node是指自己
void insertend(struct node *parent, int item)
{
while (parent->addr != NULL)
parent = parent->addr;
struct node new_node;
new_node.a = item;
parent->addr = &new_node;
parent->addr->addr = NULL;
}
uj5u.com熱心網友回復:
我不確定addr指的是什么,但我會假設它指向鏈表中的下一個節點。在您的代碼中,需要有另一個節點用作臨時節點,因為父節點不斷被重新分配,并且之前的專案丟失了。我們還需要檢查父節點不是NULL.
void insertend(struct node **parent, int item)
{
node *new_node = new node;
new_node->a = item;
new_node->addr = NULL;
if(*parent == NULL)
{
*parent = new_node;
}
else
{
node *temp = *parent;
while (temp->addr != NULL)
temp = temp->addr;
temp->addr = new_node;
}
}
if 陳述句檢查父節點是否為NULL. 如果true,那么我們將parent節點分配給new_node。如果false,那么我們轉到串列的末尾并將串列中的下一個節點分配給new_node。
uj5u.com熱心網友回復:
正如 Igor 正確指出的那樣,當函式完成時,您的新節點會被銷毀。因此,在這種情況下,您可以只分配記憶體。您可以new為此使用運算子。但是,您最終需要顯式釋放記憶體。
void insertend(struct node *parent, int item)
{
while (parent->addr != NULL)
parent = parent->addr;
struct * new_node = new node;
new_node->a = item;
parent->addr = new_node;
parent->addr->addr = NULL;
}
uj5u.com熱心網友回復:
void insertend(struct node *parent, int item) { while (parent->addr != NULL) parent = parent->addr; struct node new_node; new_node.a = item; parent->addr = &new_node; parent->addr->addr = NULL; }
的生命周期new_node僅限于函式。一旦該函式回傳,它就不再有效。
為了規避這種情況,有必要為 new_node. 當然,正如已經指出的,這意味著最終顯式地釋放記憶體。
注意:由于這里是 C 而不是 C,所以我們不需要struct在使用的型別前面加上,NULL最好拼寫為nullptr.
void insertend(node *parent, int item)
{
while (parent->addr != nullptr)
parent = parent->addr;
node *new_node = new node;
new_node.a = item;
parent->addr = new_node;
parent->addr->addr = nullptr;
}
由于 C 結構只是具有默認公共訪問權限的類,因此還值得注意的是,我們可以將其實作為成員函式。就像是:
template <typename T>
struct Node {
T value;
Node<T> *next;
void append(T val) {
Node<T> * temp = this;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = new Node<T>;
temp->next->value = val;
temp->next->next = nullptr;
}
};
int main() {
auto n = Node<int>();
n.value = 27;
n.append(42);
n.append(34);
for (Node<int> *t = &n; t != nullptr; t = t->next) {
std::cout << t->value << std::endl;
}
return 0;
}
下一步將是實作建構式和解構式。
要記住的另一件事是,以這種方式到達串列的末尾是 O(n) 時間復雜度。一遍又一遍地這樣做是昂貴的。如果您Node::append回傳了指向 new 的指標Node,那么您可以呼叫append它。
template <typename T>
struct Node {
T value;
Node<T> *next;
Node<T> *append(T val) {
Node<T> * temp = this;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = new Node<T>;
temp->next->value = val;
temp->next->next = nullptr;
return temp->next;
}
};
int main() {
auto n = Node<int>();
n.value = 27;
auto n2 = n.append(42);
n2 = n2->append(34);
n2 = n2->append(15);
for (Node<int> *t = &n; t != nullptr; t = t->next) {
std::cout << t->value << std::endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483985.html
上一篇:定義2d陣列:int*arr[]和intarr[][]在記憶體中的表示方式有什么區別?
下一篇:程式的指標訪問表示
