插入到头部时丢失节点

时间:2016-03-20 15:02:22

标签: c data-structures

当我将节点插入头部时,它不起作用。但插入其他位置效果很好。

这是我的插入功能

int insert_before(ListNode *head, ListNode *p, int x){ 
ListNode *tmp, *cursor;
if(head == NULL || p == NULL) return -1;                                                                                                         
if(head == p){ 
    tmp = malloc(sizeof(ListNode));
    tmp->val = x;
    // insert node
    tmp->next = p;
    p = tmp;

    printf("insert before: \n");
    printList(head);
    return 0;
}   
cursor = head;
while(cursor->next != p && cursor->next != NULL ) cursor = cursor->next;
tmp = malloc(sizeof(ListNode));
tmp->val = x;
//insert node
tmp->next = p;
cursor->next = tmp;


printf("insert before: \n");
printList(head);
return 0;

}

我的主要功能

int main(){
ListNode *head, *tmp;
int x=0;
int arr[5] = {1,2,4,5,6};
head =  createList(arr, 5);
printList(head);
tmp = get_by_index(head,3);

// insert
//insert_after(head, x);
 insert_before(head, tmp, 100);
// insert_before(head, head, 100);
printf("in main: ");
printList(head);

printf("insert_before return %d \n", x);
return 0;

}

当我运行insert_before(head,tmp,x)时,它工作正常 enter image description here , 当我运行insert_before(head,head,100); 它没有变化;

2 个答案:

答案 0 :(得分:1)

插入到链表头部会替换它的头部,你不能用函数foo(node * head)来做。相反,你应该传递head指针的指针,这样函数就可以改变它。

答案 1 :(得分:0)

你必须稍微改变代码的语法,

int insert_before(ListNode **head, ListNode *p, int x)

我认为你得到了我在这里想说的话。