c-链表中的删除功能



你明白为什么当我在这里调用delete函数时,输出会变成一个无限循环吗?如果没有这个函数,代码就可以工作。

int main(){
node *head = NULL;
end(&head);
begin(&head);
begin(&head);
end(&head);
begin(&head);
end(&head);
begin(&head);
delete(&head);
display(head);
return 0;
}
void delete(node **head){
node *tmp,*prev = NULL;
int num;
printf("Insert the number that you want to delete: ");
scanf("%d",&num);
tmp = *head;
if (tmp->data == num){
*head = tmp->next;
free(tmp);
return;
}
while(tmp->data!=num && tmp!=NULL){
prev = tmp;
tmp = tmp->next;
}
if(tmp == NULL){
return;
}
prev->next = tmp->next;
free(tmp);
}

这是我的另一个功能:

void begin(node **head){
node *new;
int num;
new = malloc(sizeof(node));
if(new ==  NULL){
perror("malloc");
EXIT_FAILURE;
}
printf("Insert number at the beginning: ");
scanf("%d",&num);
new->data  = num;
new->next = *head;
*head = new;
}
void end(node **head){
int num;
node *tmp,*new;
new = malloc(sizeof(node));
if(new == NULL){
perror("malloc");
EXIT_FAILURE;
}
printf("Insert number at the end: ");
scanf("%d",&num);
new->data = num;
tmp = *head;
if(tmp == NULL){
tmp = malloc(sizeof(node));
tmp->data = num;
tmp->next = NULL;
}
while(tmp->next!=NULL){
tmp = tmp->next;
}
new->next = NULL;
tmp->next = new;
}

void display(node *head){
node *tmp;
if(head == NULL){
printf("Empty list");
}
else{
while(tmp!=NULL){
printf("%d ",tmp->data);
tmp = tmp->next;
}
}
}

temp!=NULL条件应位于temp->数据!=num在while循环中。因为如果temp在没有任何匹配的情况下到达列表的末尾,那么temp将为NULL,并且您不能为NULL指针设置检查值(temp->data!=num(。

好的,我理解这个问题。我忘记在display()函数的else{}条件中添加tmp = head

相关内容

  • 没有找到相关文章

最新更新