#include "stdio.h"
#include "string.h"
#define OK 1
#define ERROR 0
typedef struct student{ //定义学生结构体
int num; //学号
char name[10]; //姓名
float score; //成绩
char sex[2]; //性别
}student;
typedef struct Node{ /* 定义单链表结点类型 */
student data; //数据域存放学生信息
Node *next;
}Node,*LinkList; //定义单链表指针
//2)输入下面的创建函数,也可自行设置。
/* 创建单链表*/
Node *creatList(LinkList L,int n)
{ int i; Node *r,*p;
L=new Node; //申请新结点,作为表头
L->next=NULL;
r=L;
for(i=1;i<=n; i++)
{ printf("i=%d\n",i);
p=new Node; //申请新结点,有数据的
printf("input node data:格式=学号 姓名 成绩 性别\n");
scanf("%d",&p->data.num);
scanf("%s",p->data.name);
scanf("%f",&p->data.score);
scanf("%s",p->data.sex);
p->next = NULL; //新节点的指针置为空
r->next=p;
r=p;
}
printf("creatList函数执行,链表创建成功\n");
return L; //返回链表的头指针
}
//3)下面是输出函数,请补充填写完整
void output_L(LinkList L)
{
LinkList p;
p=L->next;
printf("链表结点如下:\n");
while(p!=NULL)
{ printf("%d\t",p->data.num);
printf("%s\t",p->data.name);
printf("%.1f\t",p->data.score);
printf("%s\t\n",p->data.sex); //输出学生的成绩和性别
p=p->next;
}
printf("\n");
}
//4) 下面是根据学号(int no)查找学生的函数,如果找到返回指向该学生的指针,否则返回NULL。请填空代码。
Node *LocateElem_L(LinkList L, int no) {
LinkList p;
p = L->next;
while (p&&p->data.num!=no)
p = p->next;
return p; //查找成功返回结点地址p,查找失败p为NULL
}
//5) 下面是插入函数,在i位置插入一个学生记录
int List_insert(LinkList L,int i,student e)
{ Node *p=NULL,*q,*s; int j=1;
if(i<1) { printf("出错!");return ERROR;}
p=L;
while(p&&(jnext; j++; //移动到插入位置i
}
if(!p) { printf("出错!");return ERROR;}
s=new Node; //申请新节点,并接收学生记录各字段
s->data.num =e.num;
strcpy(s->data.name,e.name);
s->data.score =e.score; //接收学生的姓名和成绩
strcpy(s->data.sex,e.sex);
s->next=p->next;
p->next=s;
return OK;
}
//6) 下面是删除第i个学生记录的函数,请补充完整。
int List_delete(LinkList L,int i)
{ LinkList p,q;
int j=1;
p=L;
if(i<1) return ERROR;
while((p)&&(jnext; j++; }
if(!p->next) return ERROR;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
//7) 编写计算所有学生的平均成绩的函数,下面是函数框架,也可自行编写。
float average_L(LinkList L)
{ LinkList p; float avg, sum=0.0; int count=0;
p=L->next;
while(p!=NULL)
{ sum+=p->data.score;
count++;
p=p->next;
}
avg=sum/count;
return avg;
}
//8) 下面是main函数,请添加适当的语句,实现对学号为1004的学生的查找;并将学号为1003的学生成绩修改为100分。
int main()
{
LinkList La,p,q; int no;student e;float avg,s;
int n; int i,k;int max;
printf("输入结点数n");
scanf("%d",&n);
La=creatList(La,n);
output_L(La);
printf("请输入查找的学号:\n");
scanf("%d",&no);
p=LocateElem_L(La,no);
if(p) printf("%d %s %0.1f %s\n",p->data.num ,p->data.name,p->data.score,p->data.sex);
else
printf("No found!\n");
printf("请输入要修改成绩的学号和成绩:\n");
scanf("%d%f",&no,&s);
q=LocateElem_L(La, no);
if(q) q->data.score=s;
else
printf("No found!");
output_L(La); //修改后的输出
printf("插入的位置i和值e,i=?,e=?\n");
scanf("%d",&i);
scanf("%d",&e.num);
scanf("%s",e.name);
scanf("%f",&e.score);
scanf("%s",e.sex);
List_insert(La,i,e);
output_L(La); //插入后的输出
avg=average_L(La); //求平均成绩avg
printf("average=%0.1f\n",avg);
printf("删除位置i=?\n");
scanf("%d",&i);
List_delete(La,i);
output_L(La); //删除后的输出
}