#include<stdio.h>
struct Node
{
int date;
struct Node* next;
};
int main()
{
struct Node*list=NULL;
struct Node*tail=NULL;
int m=0,n=0,i=0,del;
scanf("%d",&n);
//接受数字
/*****************************接收功能**********************************/
for(i=0;i<n;i++)
{
scanf("%d",&m);
struct Node*pd=(struct Node*)malloc(sizeof(struct Node));//创建一个动态内存存储
pd->date=m;//将m存入第一个动态内存的date中
pd->next=NULL;//然后创建的新的动态内存的节点中指针域指向为空
if(list==NULL)//如果指向第一个指针的头指针的指针域没有指向任何一个节点
{
list=pd;//将第一个节点给头指针
tail=pd;//将第一个节点给尾指针,用于连接下一个节点
}
else
{
tail->next=pd;//将新创建的节点的地址给tail的next 用于连接两个节点
tail=pd;//再将新节点的地址给尾指针重复上述操作
}
}
scanf("%d",&del);//输入要删除的数字;
/******************************删除功能***************************/
struct Node* cur=NULL;//用于查找的指针
struct Node* prov=NULL;//记录前一个节点的指针
cur=list;//将头指针指向的第一个节点给上cur
while(cur)//如果cur->next==NULL认为已经遍历完所有数组,结束循环
{
if(del==cur->date)//如果要删除的数字等于cur->date
{
struct Node*pd=cur;//用于释放的指针,先指向第一个元素的地址, 与cur同步进行遍历
if(cur==list)//如果要删除的元素在第一个节点的位置
{
list=list->next;//将头指针指向第二个节点的位置
cur=list;//再将list赋值给cur,使得cur重新指向第二个
}
else//如果在第二个或者后面的位置
{
prov->next=cur->next;//怕想不明白,要记得自己结合着图来走,例如:要删除第二个吧,将第二个元素cur->next的地址赋值给保留上一个节点的指针,既将第三个节点的位置放到第一个节点的next中,使之第一个与第三个进行连接
cur=cur->next; //自我指向下一个节点的位置,将pd留下,每次判断的时候又会重新将pd与cur同步
}
free(pd);//将pd释放,每一次循环判断都会重新将pd赋值为cur也就是新一轮的第一个节点的位置
n--;
}
else//如果要删除的节点不等于cur->data,那么往后遍历
{
prov=cur;//记录上一个节点的位置
cur=cur->next;//cur去找下一个节点的元素
}
}
/*******************************输出功能**************************/
cur=list;
while(cur)
{
printf("%d ",cur->date);//输出每个节点的data的数值;
cur=cur->next;//遍历数组
}
/*******************************释放功能***************************/
cur=list;
struct Node* sf=NULL;
while(cur)
{
sf=cur;//释放指针指向cur第一个节点
cur=cur->next;//向下遍历
free(sf);//释放指针;
}
list=NULL;//头指针的释放
return 0;
}