更新时间:2021-08-03 01:31:37
有可能在你的code其他错误,但一个大问题是,你正试图设置头节点插入
,但只影响传入的指针的本地副本,所以它在主叫方没有任何影响:
There may be other errors in your code, but one big issue is that you are attempting to set a head node in insert
, but that only affects a local copy of the pointer passed in, so it has no effect in the caller side:
void insert(struct node *head,int data){
....
head = malloc(sizeof(struct node)); // head is local, caller won't see this
您还需要确保当你通过这不是一个节点 NULL
,你居然attatch新节点的头部。
您可以通过传递一个指针的指针,或返回集指针解决的第一个问题。例如,
You also need to ensure that when you pass a node that is not NULL
, you actually attatch the new node to the head.
You can fix the first problem by passing a pointer to a pointer, or by returning the set pointer. For example,
void insert(struct node **head, int data) {
if(*head == NULL) {
// create the head node
...
*head = malloc(sizeof(struct node));
....
else {
// create a new node and attach it to the head
struct node* tmp = malloc(sizeof(struct node));
....
(*head)->next = tmp;
}
}
然后,在主
,你需要一个指针传递给头指针,即使用地址运算符&安培;
:
Then, in main
, you need to pass a pointer to the head pointer, i.e. use the address-of operator &
:
struct node *head = NULL;
insert(&head, 5);
注意的部分问题是该函数试图做太多。这就是所谓的插入
,但它试图创建一个新的节点,如果传入的指针 NULL
。这将是更好的分离这些职责:
Note part of the problem is that the function is trying to do too much. It is called insert
, but it attempts to create a new node if the pointer passed in is NULL
. It would be better to separate these responsibilities:
// allocate a node and set its data field
struct node* create_node(int data)
{
struct node* n = malloc(sizeof(struct node));
n->next = NULL;
n->data = data;
return n;
}
// create a node and add to end node.
// return the new end node.
// end has to point to a valid node object.
struct node* append_node(struct node* tail, int node_data)
{
struct node* new_tail = create_node(node_data);
tail->next = new_tail;
return new_tail;
}