单链表创建学生成绩表 输出学生姓名成绩及班级平均分

建立单链表(有头尾指针)用于存放学生某门课程成绩(整型);输出链表中的所有数据和平均成绩,并且能够在指定的位置插入或删除指定的某学生的成绩。要求:数据个数和数据从键盘输入。

#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;
}

在这里插入图片描述

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值