题解 | #KiKi学结构体和指针#
KiKi学结构体和指针
http://www.nowcoder.com/practice/0ab593ca56b1476eb05b1ff848fd7fcc
#include<stdio.h>
struct numNode{
int data;
struct numNode *next;
};
int main(void)
{
int n,m;
scanf("%d",&n);
struct numNode *head=NULL;//设置一个头结点
struct numNode *tail=NULL;//设置一个尾节点
for(int i=0;i<n;i++)
{
int val;
scanf("%d",&val);
struct numNode *node=(struct numNode *)malloc(sizeof(struct numNode));//对输入的每个数用新结点存放
node->data=val;
node->next=NULL;
if(tail==NULL)//如果尾节点指向NULL,则将新结点设置成尾节点
tail=node;
else//如果尾节点不为空,则将新结点连接到尾节点后面,并且将其设置为尾节点
{
tail->next=node;
tail=node;
}//如果头指针为空,则将新结点设置为头指针
if(head==NULL)
head=node;
}
scanf("%d",&m);
int count=0;
struct numNode *newhead=head;//定义一个newhead指针,用于遍历和删除链表相应结点
while(newhead!=NULL)
{
if(newhead->data==m)//如果要删除的是头结点,则将头结点的下一个结点设置成新的头结点
{
count++;//删了后计数
head=newhead->next;
newhead=newhead->next;
}
else if(newhead->next!=NULL&&newhead->next->data==m)//如果要删除的是newhead的下一个结点
{
count++;//删了后计数
newhead->next=newhead->next->next;//则直接将newhead的next指针指向要删除的下一个结点
}
else
newhead=newhead->next;//如果不是要删除的结点,则newhead继续向后遍历
}
printf("%d\n",n-count);
while(head!=NULL)
{
printf("%d ",head->data);
head=head->next;
}
return 0;
}