在這里,我嘗試創建一個鏈表并創建一個函式,該函式將任何給定的數字添加到鏈表的起始位置。
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node* next;
};
struct Node* head=NULL;
void Add(int n){
head=(struct Node*)malloc(sizeof(struct Node));
head->data=n;
head->next=NULL;
return;
}
現在我的疑問是,這里我們定義head
了一個 datatype 的指標變數struct Node
。在Add
函式中,我們已經為head
指標變數分配了新記憶體的地址。
但是當我們寫的時候head->data=n
,為什么我們不head
先解參考,因為它head
是一個指標變數,所以它存盤地址,并存盤像資料這樣的變數,為什么不應該*head->data
呢?類似的*head->next=NULL
。
uj5u.com熱心網友回復:
運算子->
已經是解參考運算子。head->data
相當于(*head).data
。
uj5u.com熱心網友回復:
不,您需要分兩步進行添加。首先創建新節點并初始化,然后鏈接到鏈表。否則您將丟失整個串列,如下所示:
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node* next;
};
struct Node* head = NULL;
void Add(int n)
{
// create the node.
struct Node *node = malloc(sizeof *node); /* better */
// then initialize it.
node->data=n;
// now you can link it to the list
node->next=head; // this must be done before touching header, so we don't lose header's value.
head = node;
}
順便說一句,不要強制轉換由 回傳的值malloc()
,這會導致您在代碼中出現不希望出現的錯誤。如果你忘記了,#include <stdlib.h>
你可能會遇到嚴重的未定義行為(在 64 位系統中更多,其中指標和整數具有不同的大小)強制轉換告訴編譯器你知道你在做什么,所以你可能會沉默來自編譯器的警告和訊息能夠解決問題將不勝感激。不要這樣做,很久以前就沒有必要了(從STD-C發布第一版的時間開始)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384314.html
上一篇:向下轉換指標到指標