您還沒有按返回值返回列表的新頭部。如果插入一個節點,則必須爲一個節點分配內存。不要忘了第一個節點的初始化成員prev
最後節點與NULL
成員link
:
node* insert(char* str, node* head)
{
node* new_node = malloc(sizeof(struct node));
assert(new_node != NULL);
new_node->value = strdup(str);
new_node->link = NULL; // successor of new node is NULL
if (head == NULL)
{
new_node->pev = NULL; // prdecessor of first node is NULL
head = new_node;
return new_node; // head was NULL, return new head
}
node *lastNode = head; // go to last node of list
while (head->link != NULL)
lastNode = lastNode->link; // step one forward
lastNode->link = new_node; // successor of last node is new node
new_node->prev = lastNode; // predecesor of new node is last node
return head;
}
-
node *head = NULL;
head = insert("abc", head);
head = insert("def", head);
另一個解決方法是使用一個在輸出放慢參數你在功能insert
放慢參數head
:
void insert(char* str, node** head)
// ^^ in and output parameter
{
node* new_node = malloc(sizeof(struct node));
assert(new_node != NULL);
new_node->value = strdup(str);
new_node->link = NULL; // successor of new node is NULL
node* prev = NULL;
node* act = *head;
while (act != NULL) // go to last node in list
{
prev = act;
act = act->link; // step one forward
}
new_node->prev = prev; // predecessor of new node is last node or NULL
if (prev == NULL)
*head = new_node; // new node is the first node in list,
// write the new node back to head
else
prev->link = new_node; // successor of last node is new node
}
-
node *head = NULL;
insert("abc", &head);
insert("def", &head);
「這是否工作?測試它,你會知道。通過查看代碼很難看出它是否工作 - 除非你是真正的專家。 – Ian
這也不是所有的代碼。只有你有足夠的代碼才能知道它是否有效。 – e0k
注意'head = head-> link;'在函數範圍內修改'head'的值,但不在它之外。函數在參數副本上工作。爲了解決這個問題,即使它已經是一個指針,也要通過指針傳遞'head'。嘗試'void insert(char * str,node ** head)'和'if(* head == NULL)...' – francis