关于删除链表中的元素失效的问题
本帖最后由 GodLordGee 于 2021-11-19 00:28 编辑在不看小甲鱼的视频前提下,想要自己实现链表的删除功能
目前遇到了一个问题,就是我在删除元素的函数里面定义了一个指针结构体temp,然后让这个指针结构体指向头指针head,然后我通过temp执行了删除操作
在函数中打印,可以看到temp中我指定的元素都被我删除了,但是当返回主程序打印head时,发现head中的元素没有改变,是哪里出问题了吗?
以下是输出实例
请直接输入数据?-1退出:1
1当前head中的数值是:
1请直接输入数据?-1退出:1
11当前head中的数值是:
11请直接输入数据?-1退出:2
112当前head中的数值是:
112请直接输入数据?-1退出:999
开始删除。。。请输入要删除的数值:1
要删除的原始链表是:112
当前temp中的数值是:12
当前temp中的数值是:2
--=-=-=-=
................
当前head中的数值是:112
可以看到,temp中正确删除了数据,但是head没有改变。
以下是代码,在执行完输入数据操作后,输入999可以开始进行删除的操作。请重点看看delet函数。
#include <stdio.h>
#include <stdlib.h>
struct Node{
int value;
struct Node *next;
};
void insertNum(struct Node **head, int nums){
struct Node *insertValue;
struct Node *prior;
struct Node *current;
current = *head;
prior = NULL;
insertValue = (struct Node *)malloc(sizeof(struct Node));
// insertValue->value = nums;
while(current != NULL && current->value <nums){
prior = current;
current = current->next;
}
if(insertValue == NULL){
printf("分配失败\n");
exit(1);
}
insertValue->value = nums;
insertValue->next = current;
if(prior == NULL){
*head = insertValue;
}
else{
prior->next = insertValue;
}
}
void printNum(struct Node **head){
struct Node *tmp;
tmp = *head;
while(tmp!=NULL){
printf("%d", tmp->value);
tmp = tmp->next;
}
}
void delet(struct Node **head, int num){
struct Node *temp;
struct Node *prior;
temp = *head;
prior = NULL;
printf("要删除的原始链表是:");
printNum(head);
putchar('\n');
while(temp != NULL){
if(temp->value == num && prior == NULL){
temp = temp->next;
printf("当前temp中的数值是:");
printNum(&temp);
putchar('\n');
}
else if(temp->value == num && prior != NULL){
prior->next = temp->next;
temp = prior;
printf("-----------------------------");
prior = temp;
temp = temp->next;
printf("^^^^^^^^^^^^^^^^^^^^^%p\n", temp);
}
// printf("tttttttttttt");
else{
temp = temp->next;
printf("--=-=-=-=\n");
printNum(&temp);
printf("................\n");
}
}
}
int main(void){
struct Node *head = NULL;
int nums;
while(1){
printf("请直接输入数据?-1退出:");
scanf("%d", &nums);
if (nums != -1 && nums!= 999){
insertNum(&head, nums);
printNum(&head);
}
else if(nums == 999){
int del_num;
printf("开始删除。。。请输入要删除的数值:");
scanf("%d", &del_num);
delet(&head, del_num);
printf("当前head中的数值是:");
printNum(&head);
break;
}
printf("当前head中的数值是:\n");
printNum(&head);
}
} 本帖最后由 jhq999 于 2021-11-19 06:45 编辑
void delet(struct Node **head, int num){
struct Node *temp;
struct Node *prior;
temp = *head;
prior = NULL;
printf("要删除的原始链表是:");
printNum(head);
putchar('\n');
while(temp != NULL)
{
if(temp->value == num )
{
printf("当前temp中的数值是:");
printNum(&temp);
putchar('\n');
if(NULL==prior)////////符合条件的是表头
*head=temp->next;
else ////////符合条件的不是表头
prior->next=temp->next;
free(temp);
break;/////跳出循环
}
prior=temp;
temp=temp->next;
}
//temp=NULL,链表没有符合条件的
}
页:
[1]