下边这段代码删除操作,我知道我写的有问题,但是神奇的是结果却是正确的,能正常运行,但是我取调试的时候就线出现delete中陷入死循环永远执行不完,我都特喵以为我见鬼了,这是什么鬼
#include <stdio.h>
#include <stdlib.h>
/*
单链表的操作
*/
typedef struct Node
{
int data;
struct Node *next;
} Node;
//列表初始化
Node *initList()
{
Node *list = (Node *)malloc(sizeof(Node));
list->data = 0;
list->next = NULL;
return list;
}
//头插法
void headInsert(Node *list, int data)
{
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = list->next;
list->next = node;
list->data++;
}
//尾插法
void tailTnsert(Node *list, int data){
Node *head = list;
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
head = head->next;
while(head->next){
head = head->next;
}
head->next = node;
list->data++;
}
//单链表的插入,在链表的第i个位置插入x的元素
void LinkedListInsert(Node *list,int i,int data) {
Node *pre; //pre为前驱结点
pre = list;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++) {
pre = pre->next; //查找第i个位置的前驱结点
}
Node *node = (Node *)malloc(sizeof(Node));; //插入的结点为p
node->data = data;
node->next = pre->next;
pre->next = node;
list->data++;
}
//删除 单个
// void delete(Node *list, int data){
// Node *pre = list;
// Node *current = list->next;
// while (current)
// {
// if (current->data == data)
// {
// pre->next = current->next;
// free(current);
// break;
// }
// pre = current;
// current = current->next;
// }
// list->data--;
// }
//这里如果删除所有的怎么弄;删除所有
void delete(Node *list, int data){
Node *pre = list;
Node *current = list->next;
while (current)
{
// printf("%d :", current->data);
if (current->data == data)
{
pre->next = current->next;
current = current->next;
free(current);
list->data--;//我写的这段可能存在内存的问题,因为我释放掉了但是current还能用,释放掉的还是之前的
// pre->next = current->next;
// Node *temp = current->next; // 保存下一个节点的指针
// free(current);
// current = temp;
}
else{
pre = current;
current = current->next;
}
}
}
// void delete(Node *list, int data){
// Node *pre = list;
// // Node *current = list->next;
// while (pre->next)
// {
// Node *p = pre->next;//暂存当前指针要释放的节点,用于释放该节点,此外用于不需要释放的时候指针向后移动
// // printf("%d :", p->data);
// if (p->data == data)//这里要注意p->data解引用,所以p不能为空
// {
// pre->next = p->next;//前结点指向要释放的结点的下一结点
// free(p);
// list->data--;
// }
// else{
// pre = pre->next;//移动前驱指针
// }
// }
// }
// //单链表的删除,在链表中删除值为x的元素
// LinkedList LinkedListDelete(LinkedList L,int x) {
// Node *p,*pre; //pre为前驱结点,p为查找的结点。
// p = L->next;
// while(p->data != x) { //查找值为x的元素
// pre = p;
// p = p->next;
// }
// pre->next = p->next; //删除操作,将其前驱next指向其后继。
// free(p);
// return L;
// }
//链表内容的修改,再链表中修改值为x的元素变为为k。
void LinkedListReplace(Node* list,int data,int newdata) {
Node *p=list->next;
int i=0;
while(p){
if(p->data==data){
p->data=newdata;
}
p=p->next;
}
}
//打印链表
void printList(Node *list){
list = list->next;
while (list)
{
printf("%d ", list->data);
list = list->next;
}
}
int main(int argc, char const *argv[])
{
Node *list = initList();
headInsert(list, 1);
headInsert(list, 2);
headInsert(list, 3);
headInsert(list, 4);
headInsert(list, 5);
headInsert(list, 288);
tailTnsert(list, 6);
tailTnsert(list, 7);
tailTnsert(list, 8);
tailTnsert(list, 9);
tailTnsert(list, 10);
tailTnsert(list, 288);
LinkedListInsert(list, 5, 288);
LinkedListInsert(list, 5, 288);
delete(list, 288);
// LinkedListReplace(list, 288, 10000);
printList(list);
return 0;
}