#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
动态链表,删除指定学号的人所在的结点,并输出删除后结点中的内容
最新推荐文章于 2024-07-27 17:00:00 发布