链表满足条件的一次性多个删除



#include <stdio.h>
#include <stdlib.h>
int cnt;
typedef struct stu
{
 char num[10];
 char name[10];
 char sex[2];
 int age;
 struct stu *next;
}A;
A *creat()
{
 A *head=NULL;
 A *pnew,*tail;
 int flag=1;
 cnt=0;
 pnew=tail=(A *)malloc(sizeof(A));
 while(flag)
 {
  cnt++;
  printf("请输入第%d个人的信息:\n",cnt);
  printf("请输入学号:");
  scanf("%s",pnew->num);
  printf("\n请输入姓名:");
  scanf("%s",pnew->name);
  printf("\n请输入性别:");
  scanf("%s",pnew->sex);
  printf("\n请输入年龄:");
  scanf("%d",&pnew->age);
  if(cnt==1)
  {
   pnew->next=NULL;
   tail=pnew;
   head=pnew;
  }
  else
  {
   pnew->next=NULL;
   tail->next=pnew;
   tail=pnew;
  }
  pnew=(A *)malloc(sizeof(A));
  printf("是否继续输入学生信息:(Y/1||N/0)");
  scanf("%d",&flag);
  printf("\n");
 }
 free(pnew);
 return head;
}
void out(A *head)
{
 A *pnew;
 int i=1;
 pnew=head;
 printf("本名单中共有%d个人的信息:\n",cnt);
 while(pnew!=NULL)
 {
  printf("第%d个人的信息:\n",i++);
  printf("学号:%s",pnew->num);
  printf("\n姓名:%s",pnew->name);
  printf("\n性别:%s",pnew->sex);
  printf("\n年龄:%d",pnew->age);
  printf("\n");
  pnew=pnew->next;
 }
}
A *del(A *head,int k)
{
 A *pnew,*temp,*p;
 pnew=p=head;
 while(pnew!=NULL)
 {
  if(pnew->age!=k)
   pnew=pnew->next;
  else
  {
   p=head;
   if(pnew==head)
   {
    head=head->next;
    temp=head;
   }
   else
   { 
    while(p->next!=pnew)
      p=p->next;
    temp=p;
    p->next=pnew->next;
   }
 
  free(pnew);
  cnt--;
  pnew=temp;
  }
 }
 return head;
}

int main(void)
{
 A *head;
 int k;
 head=creat();
 printf("请输入要删除的年龄:");
 scanf("%d",&k);
 head=del(head,k);
 out(head);
return 0;
}

注意:一开始的第一个    if   的是时候,后面应该加  else,还有  把p=head应该写在循环的里面,因为底下会改变 p的位置,要删除第一个的时候,应该注意temp=head;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值