问题0:链表和C的理解
上面有很多材料。例如,查看数据结构讲座中的这些幻灯片。
问题 1:“头部未申报”
在使用变量之前,您需要先引入它。问题是由于head
不在函数范围内(根据 C 规则)。因此,您需要将指向它的指针作为参数传递:
void addLL(struct nodeTest *head, int data){
// now you can access head->data, head->next
// ..
}
如果您使用0
表示没有数据可用,那么您不能存储任何零。另一个你可以保持列表元素的计数并检查计数是否为零以确定列表是否为空。
问题 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
}