建立单链表(有头尾指针)用于存放学生某门课程成绩(整型);输出链表中的所有数据和平均成绩,并且能够在指定的位置插入或删除指定的某学生的成绩。要求:数据个数和数据从键盘输入。
#include <stdio.h>
#include <stdlib.h>
int Listlength=0;//链表长度,不包含头结点
//int *Q=&Listlength;
typedef struct _node
{
char Name[15];
int data;
struct _node *next;
}Node;
typedef struct _last//头尾指针
{
Node *head;
Node *tail;
}point;
int apply(point *list)//建立头结点
{
Node *p = (Node*) malloc (sizeof(Node));
list->head = list->tail = p;
list->tail->next=NULL;
}
void Insert(point *list,int *PLlength)//插入结点
{
int position;//位置
Node *L,*pre;//pre是L的前驱,L用于定位
int score,i;
Node *p=(Node*) malloc (sizeof(Node));
printf("请输入插入位置\n");
while(1)//防止定位溢出
{
scanf("%d",&position);
if(position>0&&position<=*PLlength+1)
break;
else
{
printf("ERROR!!\t请重新输入位置!\n");
continue;
}
}
getchar();
for(L=list->head,i=1;i<=position;i++,L=L->next)//输入定位
pre=L;
printf("请输入学生姓名\n");
for(i=0;i<15;i++)//姓名
{
scanf("%c",&p->Name[i]);
if(p->Name[i]=='\n') break;
}
printf("请输入学生成绩\n");
scanf("%d",&score);//成绩
p->data=score;
getchar();
pre->next=p;
p->next=L;
if(L==NULL) list->tail=p;
(*PLlength)++;//表长加一
printf("\n\n");
}
int Delete(point *list,int *PLlength)
{
int position,i;
Node *p,*pre,*del;//del指向被删除节点,pre为del前驱
if(*PLlength==0)//成绩表为空
{
printf("当前成绩表为空\n\n");
return 0;
}
printf("请输入删除位置\n");
while(1)//防止定位溢出
{
scanf("%d",&position);
if(position>0&&position<=*PLlength)
break;
else
{
printf("ERROR!!\t请重新输入位置!\n");
continue;
}
}
for(p=list->head,i=1;i<=position+1;i++,p=p->next)//删除成绩信息
{
if(i==position) pre=p;
if(i==position+1)
{
del=p;
p=p->next;
pre->next=p;
free(del);
(*PLlength)--;//表长减一
}
}
printf("\n\n");
return 0;
}
int print(point *list,int *PLlength)//输出数据
{
int i,num=1,a=1,sum=0;
float average;
Node *p;
if(*PLlength==0)//成绩表为空
{
printf("当前成绩表为空\n\n");
return 0;
}
printf("序号 姓名 成绩\n");
for( p = list->head->next; p; p = p->next)
{
printf("%d\t",num++);
for(i=0;i<15;i++)
{
if(p->Name[i]=='\n') break;
printf("%c", p->Name[i]);
}
printf("\t");
printf("%8d\n", p->data);
sum+=p->data;
}
printf("\n");
average=sum*1.0/--num;//平均值
printf("班级平均成绩为%.1f\n",average);
return 0;
}
int main()
{
int op;
point list;
apply(&list);
while(1)
{
printf("*********************************************************\n");
printf("请输入操作序号()\n\n");
printf("(1)插入学生成绩信息\n");
printf("(2)删除学生成绩信息\n");
printf("(3)打印成绩表\n");
printf("(0)退出程序\n");
printf("*********************************************************\n\n\n");
scanf("%d",&op);
switch(op)
{
case 1:Insert(&list,&Listlength); break;
case 2:Delete(&list,&Listlength); break;
case 3:print(&list,&Listlength); break;
case 0:return 0;
}
}
return 0;
}