动态链表,删除指定学号的人所在的结点,并输出删除后结点中的内容

#include "stdio.h"
#include"stdlib.h"
void max1(struct Student *p);
struct Student * deleteNode(struct Student *p,int t);
struct Student{
 int num;
 char name[10];
 float a[3];
 float aver;
 struct Student *next;
};
 struct Student* add (){//建立链表,输入数据,并返回链头的指针 
 struct Student *p1,*p2,*head;
  int n;
 head=NULL;
  p1=p2=(struct Student*)malloc(sizeof(struct Student));
  printf("请输入学号,名字,成绩\n");
  scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->a[0],&p1->a[1],&p1->a[2]);
  p1->aver=(p1->a[0]+p1->a[1]+p1->a[2])/3;
  head=p1;
    for(n=0;n<2;n++){
      p1=(struct Student*)malloc(sizeof(struct Student));
      scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->a[0],&p1->a[1],&p1->a[2]);
      p1->aver=(p1->a[0]+p1->a[1]+p1->a[2])/3;
      p2->next=p1;
     p2=p1;
 }
        p2->next=NULL;
        return (head);
}
int main()
{ 
     int number(struct Student *p);//返回 学号为102 的位置,第一个结点的位置为0 
     struct Student *head,*m,*p;
  int t;
     head=add();
     printf("你输入的学生的信息为:\n"); 
     for(p=head;p!=NULL;p=p->next)//遍历 
     printf("%d %s\n",p->num,p->name);
  t=number(head);
  head=deleteNode(head,t);//删除学号为102的的学生信息 
  printf("删除后的信息为:\n");
  for(p=head;p!=NULL;p=p->next){
     printf("%d %s\n",p->num,p->name);
     }
     return 0;
}
struct Student * deleteNode(struct Student *p,int t) 
{
  struct Student *head=p;
  int i=1;
  if(t==0)//说明删除的是链头结点 
    return p->next; //不用加else的原因是因为如果满足if条件直接返回了,下面代码不执行。如果不满足条件那么if语句不执行  
    while(i<t)
 {
    p=p->next;
    i++; 
 }
  p->next=p->next->next;
   return head;
}
int number(struct Student *p)
{
  int t=0,i=0;//t保存平均分最高结点的位置,结点的位置从0开始标记 
  for(;p->num!=102;p=p->next,i++);
  return i; 
}




输出显示:
请输入学号,名字,成绩
109 hh 78 98 67
102 uu 78 98 23
106 bb 89 76 45
你输入的学生的信息为:
109 hh
102 uu
106 bb
删除后的信息为:
109 hh
106 bb
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值