當我在 c 中做一個關于鏈表的練習時,有一個問題是在串列中間插入一個新節點。我完成了,但后來我不明白為什么我必須從 2 開始。
例如,如果我開始 I = 0
鏈表 = 1,2,3,4,5
我要在位置 2 插入的值是 6。所以我希望我的鏈表將 = 1,6,2,3, 4,5。但實際輸出將是 1,2,3,6,4,5。
這是我的代碼。
void Inserting(Node* head)
{
int n;
int i;
Node* Cur_Node = head;
Display(Cur_Node);
Node* NewNode = (Node*)malloc(sizeof(Node));
NewNode->next == NULL;
printf("What value your want to add : ");
scanf("%d",&(NewNode->number));
if (Cur_Node == NULL && NewNode == NULL)
{
return 0;
}
printf("Where do you want to put : ");
scanf("%d",&n);
for(int i=2; i < n; i )
{
if(Cur_Node->next != NULL) {
Cur_Node = Cur_Node->next;
}
}
NewNode->next = Cur_Node->next;
Cur_Node->next = NewNode;
}
uj5u.com熱心網友回復:
畫出來
回答這類問題的唯一方法是拿出一張紙和一支鉛筆,給自己畫一個鏈表。這是一個例子:
┌───┐ ┌───┐ ┌───┐
head ──?│ 2 ├──?│ 3 ├──?│ 7 ├──? NULL
└───┘ └───┘ └───┘
假設您要創建一個新節點并將其添加到串列的第 3 位:
┌───┐
new_node ──? │ 5 ├──?
└───┘
你會怎么做?
┌───┐ ┌───┐ ┌───┐
head ──?│ 2 ├──?│ 3 ├──?│ 7 ├──? NULL
└───┘ └───┘ └───┘
▲
┌───┐ │
new_node ──? │ 5 ├─┘
└───┘
然后:
┌───┐ ┌───┐ ┌───┐
head ──?│ 2 ├──?│ 3 │ │ 7 ├──? NULL
└───┘ └─┬─┘ └───┘
│ ▲
▼ ┌───┐ │
new_node ──?│ 5 ├─┘
└───┘
稍微整理一下圖片:
┌───┐ ┌───┐ ┌───┐ ┌───┐
head ──?│ 2 ├──?│ 3 ├──?│ 5 ├──?│ 7 ├──? NULL
└───┘ └───┘ └───┘ └───┘
▲
│
new_node ──────────┘
注意事情必須如何以特定的順序作業?
為什么從 2 開始?
現在,再看看我們必須插入節點的方式。哪個節點是我們必須有一個指標才能插入新節點:在我們希望新節點去的位置之前的那個還是之后的那個?
我們如何倒計時到達那個節點?
(如果計數太大怎么辦?)
功能和輸入
函式的目的是做一件事。在這種情況下,你的函式應該不會被要求和獲取用戶輸入。它的唯一目的應該是通過在特定位置插入新節點來更新串列。
在別處執行所有 I/O,然后呼叫該函式。
void insert_item_at( int index, int number );
uj5u.com熱心網友回復:
我猜是因為你在比較i < n而不是i <= n. 在i沒有環路內使用,它的存在只是為了計算在串列中的位置。您可以從任何數字開始,這并不重要,只要您在完成的地方進行補償。
uj5u.com熱心網友回復:
您需要從 2 開始,因為設計中存在根本問題。它不處理在頭部位置插入。特別是,它不處理空串列。從 2 開始可以在您的函式正常作業的情況下彌補這個問題。
為了修復設計缺陷,您需要更改函式簽名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420515.html
標籤:
下一篇:轉換為指標錯誤多執行緒程式
