問題 0: 連結リストと C の理解
その上にたくさんの資料があります。たとえば、データ構造に関する講義のスライドをご覧ください。
問題 1: 'head undeclared'
変数を使用する前に、まず導入する必要があります。この問題head
は、(C の規則に従って) 関数の範囲内にないことが原因で発生します。そのため、ポインタを引数として渡す必要があります。
void addLL(struct nodeTest *head, int data){
// now you can access head->data, head->next
// ..
}
利用可能なデータがないことを示すために使用する場合0
、ゼロを保存することはできません。もう 1 つの方法は、リスト要素の数を保持し、その数がゼロかどうかをチェックして、リストが空かどうかを判断することです。
問題 2: 'first->data' が宣言されていない
最初に宣言するか ( と同じhead
)、または を使用しますhead->data
。
問題 3: リストの設計と API
グローバルな状態を使用することは一般に悪い習慣であることが認められているため、グローバル リストは使用しないでください。list_add()
リストに別の構造体を定義し、 orのような他の関数の周りにポイントを渡すことをお勧めしますlist_remove()
。これにより、最後の要素へのポインターを保存して、O(1) 操作を追加することもできます。
struct list {
struct node *first;
struct node *last;
unsigned long length;
};
したがって、リストが空かどうかを確認する関数を実装できます。
inline bool list_is_empty(struct list* l) {
assert(l != NULL);
return l->length;
}
で複数のリストを使用しますmain
。
struct list *list1 = list_create(); // sets length to 0
struct list *list2 = list_create(); // return a new list
//...
list_add(&list1, data); // you pass a pointer to the list to which you want to add
//...
struct node *e = list_search(&list1, data);
if (e == NULL)
printf("not found\n");
//...
list_remove(&list1, data);
//
list_destroy(&list1);
リストへの要素の追加は、次のように実装できます。
int list_add(struct list* l, int data) {
if (l == NULL)
return LIST_FAILURE; // or exit with an error message
l->last->next = list_elem_create(data); // dynamically creates a new node
l->last = l->last->next;
l->length++;
return LIST_SuCCESS; // symbolc constant defined elsewhere
}