解释都在代码里了
#include <stdio.h>
#include <stdlib.h>
//主要讲删除部分的函数
struct ListNode
{
int data;
struct ListNode* next;
};
struct ListNode* readlist()
{
struct ListNode* head=NULL,*node,*tempp=NULL;
int n;
while (scanf("%d", &n)&&n !=-1)
{
node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->data = n;
node->next = NULL;
if (head == NULL)
head = node;
else
tempp->next = node;
tempp = node;
}
return head;
}
struct ListNode* deletem(struct ListNode* L, int m)
{
struct ListNode *head,*tempp,*t;//t保存被释放内存地址,tempp是上一节点地址,head就是头节点的地址
head = tempp = t = NULL;
head = L;
while (L!=NULL)
{
if (L->data == m)//符合条件
{
if (head->data == m)//头节点的删除
{
t = head;//t的作用是保存被删除节点的地址,在循环尾部再释放
head = head->next;//头部后移,这就是为什么要返回头部的值重新赋值给L的原因
}
else//普通节点和尾节点
{
t = L;//作用同上
tempp->next = L->next;//上一个节点的指针跨过中间的节点指向下一个节点的地址
}
}
tempp = L;//tempp储存上一个节点的地址
L = L->next;//节点下移一位
free(t);//释放内存
t = NULL;//这点很重要,否则当下一个值不符合条件,t将指向被释放的内存的地址
}
return (head);//返回头指针(这括号其实没啥用,说明这是一个指针)
}
void printlist(struct ListNode* L)
{
struct ListNode* p = L;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int m;
struct ListNode* L = readlist();//函数作用:输入并创建链表,将链表头指针返回存到L中
scanf("%d", &m);//输入要删除的数
L = deletem(L, m);//该函数返回删除数据后链表的头指针
printlist(L);//打印
return 0;
}