我一般無法理解鏈接列表。我明白他們是如何在紙面上工作的,但是一旦我開始編寫它們,我似乎從未做過任何事情。添加到C中的鏈接列表的前面
這裏是我的代碼:
頭文件:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct List {
int data;
struct List * next;
} List;
實現文件:
#include "test.h"
void addToFront(int data, List * head);
int main(void) {
List * list;
list = malloc(sizeof(List));
list->next = NULL;
List * head;
head = NULL;
addToFront(5,head);
printf("%d",head->data); //print first element
printf("%d",list->data); //print first element
}
void addToFront(int data, List * head) {
if(head == NULL) {
List * newNode = malloc(sizeof(List));
newNode->data = data;
head = newNode;
}
else {
List * newNode = malloc(sizeof(List));
newNode->data = data;
newNode->next = head;
head = newNode;
}
}
我知道,對於一個鏈表是空的,標題是NULL
,所以我有檢查那裏。問題出現了,因爲我得到一個段落錯誤,說頭沒有初始化,顯然不是,如果我初始化,我不能跟蹤列表是否爲空,因此使用頭節點。
我現在能做什麼?我不想使用雙指針,至於我的課程,目前爲止還沒有其他人使用它們(請不要讓我使用雙指針),並且我完全不知道如何在此處繼續。
我在想沒有頭節點的情況下嘗試。因此,我可以有一個跟蹤列表中的項目的計數器,檢查它是否爲零,然後將基本元素添加到前面,否則在我的else語句中執行相同的操作?
而且有沒有辦法避免使用雙指針,當使用鏈接列表? – efefe
而不是使用雙指針,你可以返回指針,這樣你就可以改變它。例如'List * addToFront(int data,List * head);' –
您可以擁有一個包含頭部,尾部和大小的結構。所以當你傳遞一個指針時,內部指針的修改將會有效。 (假設這個結構名稱將是List,並且你當前的List結構被重命名爲ListNode) – Tezirg