我一直在嘗試在 for 回圈中初始化一個鏈表。每次迭代,我都會創建一個指向節點結構的指標,并將串列中的最后一個節點指向它。但是,發生的一些奇怪的事情是,當我嘗試將結構的資料欄位的值分配給 5(for 回圈中的第二行)時,我不斷遇到分段錯誤。不知道為什么會這樣。
struct node{
int data;
node* next;
};
void CreateLinkedList(node* start, int numberOfNodes)
{
int i = 0;
node* tempo = start;
for(i=0; i<numberOfNodes; i ){
node* newNode;
newNode->data = 5;
newNode->next = NULL;
while(tempo->next != NULL){
tempo = tempo->next;
}
tempo->next = newNode;
}
}
我嘗試過的其他方法是使用“new”運算子并且它有效(再次,不知道為什么):
void CreateLinkedList(node* start, int numberOfNodes)
{
int i = 0;
node* tempo = start;
node* newNode;
for(i=0; i<numberOfNodes; i ){
newNode = new node;
newNode->data = 5;
newNode->next = NULL;
while(tempo->next != NULL){
tempo = tempo->next;
}
tempo->next = newNode;
}
}
有任何想法嗎?
PS:這是我在這里的第一篇文章!
uj5u.com熱心網友回復:
這兩個函式都不正確。在第一個函式中,您至少使用具有不確定值的未初始??化指標 newNode 來訪問呼叫未定義行為的記憶體
for(i=0; i<numberOfNodes; i ){
node* newNode;
newNode->data = 5;
newNode->next = NULL;
//..
盡管如此,即使在第二個函式中使用運算子 new
for(i=0; i<numberOfNodes; i ){
newNode = new node;
newNode->data = 5;
newNode->next = NULL;
//...
不會使功能正確。
用戶可以將空指標傳遞給函式(當串列為空時)。在這種情況下,您會遇到使用空指標訪問記憶體的相同問題
while(tempo->next != NULL){
^^^^^^^^^^
該函式可以通過以下方式宣告和定義
void CreateLinkedList( node * &start, size_t numberOfNodes )
{
node **current = &start;
while (numberOfNodes--)
{
*current = new node{ 5, nullptr };
current = &( *current )->next;
}
}
uj5u.com熱心網友回復:
我同意弗拉德的觀點。首先,當您應該在構造結構后設定資料時,您只是在創建該結構的新指標。這意味著您的記憶體尚未分配,并且您正在嘗試訪問不可訪問的記憶體區域。為了解決這個問題,您需要創建一些建構式(或使用默認值),然后使用 new 建構式創建物件。一些天真的版本可以。
struct node{
int data;
node* next;
node()
{
data = 0;
node* = nullptr;
}
};
//.
//.
//.
for(i=0; i<numberOfNodes; i ){
node* new node();
//.
//.
//.
此外,正如 Vlad 告訴您的那樣,注意 while 子句很重要,因為該函式可以接收一些空值,所以也要注意這一點。
uj5u.com熱心網友回復:
C 具有初始化結構的建構式,因此它們永遠不會處于未定義狀態。所以使用它們。
struct Node {
int data{};
Node* next{nullptr};
Node(Node **head, int data_) : data{data_} {
while(*head != nullptr) head = &(*head)->next;
*head = this;
}
};
然后,這簡化了函式:
Node * CreateLinkedList1(int numberOfNodes) {
Node *head{nullptr};
for(int i=0; i < numberOfNodes; i ) {
new Node(&head, 5);
}
return head;
}
不過記住串列的尾部會快得多,這樣你就可以直接附加到它上面。
Node * CreateLinkedList2(int numberOfNodes) {
Node *head{nullptr};
Node **tail{head};
for(int i=0; i < numberOfNodes; i ) {
tail = &(new Node(tail, 5))->next;
}
return head;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480165.html
下一篇:“C”中函式內部的資料操作