顺序表实现简单学生信息管理

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 3000                  //定义顺序表的最大长度 
typedef long long ll;
typedef struct 
{
	ll num;
	char name[50];
	double score;
}student;                              //学生的信息包括学号,姓名,成绩三个部分 
typedef struct 
{
	student *elem;
	int length;
	int listsize;
}sqlist;                               //定义顺序表的结构体,其包含学生信息的子项和当前长度以及最大长度三个信息 
int initlist(sqlist *l)
{
	l->elem=(student *)malloc(sizeof(student)*maxsize);
	if(!l->elem)                           //建立顺序表的函数,建立一个长度为maxsize个学生信息子项的连续存储空间 
	{ 
		printf("内存分配出错\n");
		exit(1);
	}
	l->length=0; l->listsize=maxsize; 
	return 1;
}
void listlast(sqlist *l, ll num, char name[50], double score)
{
    if(l->length==l->listsize)                               //后插法插入学生信息,如果学生个数溢出时输出错误信息 
    {
    	printf("线性表已满,请重新定义长度\n");
		exit(1); 
	}
	l->elem[l->length].num=num;
	l->elem[l->length].score=score;
	strcpy(l->elem[l->length].name,name);
	l->length++;
	return ;
}
void show(sqlist *l,int length)                  //显示学生信息的函数,遍历顺序表中的每个子项 
{
	printf("学号:\t姓名:\t成绩:\n");
	for(int i=0; i<length; i++)
	{
		printf("%lld\t%s\t%5.1lf\n",l->elem[i].num,l->elem[i].name,l->elem[i].score);
	}
	return ;
}
void query(sqlist *l,int length)  //按名字查询学生信息的函数 
{
	char a[50];
	printf("请输入要查询学生的名字:");
	scanf("%s",a);
	for(int i=0; i<length; i++)
	{
		if(strcmp(a,l->elem[i].name)==0)
		{
			printf("学号:\t姓名:\t成绩:\n");
		    printf("%lld\t%s\t%5.1lf\n",l->elem[i].num,l->elem[i].name,l->elem[i].score);
	    }
	}
	return ;
}
void delet(sqlist *l,int length)         //删除学生信息的函数 
{
	char a[50]; int i;
	printf("请输入要删除的学生的名字:");   
	scanf("%s",a);
	for(i=0; i<length; i++)             //当学生名字符合时,删除此学生的信息,并将其后每一个学生信息拷贝到前一个节点中 
	{
		if(strcmp(a,l->elem[i].name)==0)
		{
			for(int j=i; j<length; j++)
			{
				l->elem[j].num=l->elem[j+1].num;
				l->elem[j].score=l->elem[j+1].score;
				strcpy(l->elem[j].name,l->elem[j+1].name);
			}
			l->length--; break;
	    }
	}
	if( i==length )                 //没有找到时输出相应的错误信息 
	printf("没有找到此人\n");
	return ;
}
void add1(sqlist *l,int length)          //按学号添加学生信息的函数 
{
	int num1,i,j; char a[50]; double score;
	printf("请输入要添加学生的信息:\n学号:\t名字:\t成绩:\n");
	scanf("%lld",&num1); getchar();scanf("%s",a); scanf("%lf",&score);
	if(num1<l->elem[0].num)            //当此学号小于第一个学生的学号时,将此顺序表中的每一个学生信息向后移一位并使顺序表长度加一 
	{
		for(int j=length; j>=1; j--)
		{
			l->elem[j].num=l->elem[j-1].num;
			l->elem[j].score=l->elem[j-1].score;
			strcpy(l->elem[j].name,l->elem[j-1].name);
		}
		l->elem[0].num=num1; l->elem[0].score=score; strcpy(l->elem[0].name,a);
		l->length++;
	}
	else if(num1>l->elem[length-1].num)           //当此学生的学号大于最后一个学生的学号时,将其添加到最后并使顺序表长度加一 
	{
		l->elem[length].num=num1;
		l->elem[length].score=score;
		strcpy(l->elem[length].name,a);
		l->length++;
	}
	else if((num1>l->elem[0].num)&&(num1<l->elem[length-1].num))
	{                                             //当其学号位于表中某两个学生学号之间时,将其添加到顺序表中并使其后每一个学生信息后移一位 
	for(i=0; i<length; i++ )
	{
		if(num1>l->elem[i].num&&num1<l->elem[i+1].num)
		{
		for( j=length; j>i+1; j--)
			{
				l->elem[j].num=l->elem[j-1].num;
				l->elem[j].score=l->elem[j-1].score;
				strcpy(l->elem[j].name,l->elem[j-1].name);
			}
			l->elem[j].num=num1; l->elem[j].score=score;strcpy(l->elem[j].name,a); 
		}
	}
	l->length++;
    }
	else                                    //其他情况下输出错误信息:即没有两个相同学号的学生 
	printf("输入学号有误\n");
	return ;
}
void add2(sqlist *l,int length)                 //按位置添加学生信息 
{
	int pos,i; ll num1;char a[50]; double score;
	printf("请输入要学生插入到的位置:");
	scanf("%d",&pos);
	printf("请输入要添加学生的信息:\n学号:\t名字:\t成绩:\n");
	scanf("%lld",&num1); getchar();scanf("%s",a); scanf("%lf",&score); 
	if(pos==1)                          //如果位置为1则添加到第一位并使学生信息全部后移一位 
	{
		for(i=length; i>=1; i--)
		{
			l->elem[i].num=l->elem[i-1].num;
		    l->elem[i].score=l->elem[i-1].score;
			strcpy(l->elem[i].name,l->elem[i-1].name);
		}
		l->elem[0].num=num1; l->elem[0].score=score; strcpy(l->elem[0].name,a);
		l->length++;
	}
    else if(pos<1||pos>length+1)            //如果位置信息错误则输出错误信息 
	{
	   printf("位置错误\n");

	}
	else if(pos==length+1)                   //当位置在最后一位时则添加到表尾 
	{
		l->elem[length].num=num1;
		l->elem[length].score=score;
		strcpy(l->elem[length].name,a);
		l->length++;
	}
    else                                    //其他情况下插入到表中并使其后学生信息后移一位 
    {
    	for(i=length; i>=pos; i--)
    	{
		    l->elem[i].num=l->elem[i-1].num;
    	    l->elem[i].score=l->elem[i-1].score;
    	    strcpy(l->elem[i].name,l->elem[i-1].name);
        }
        l->elem[pos-1].num=num1; l->elem[pos-1].score=score; strcpy(l->elem[pos-1].name,a);
        l->length++;
	}
	return ;
} 
void query1(sqlist *l,int length)     //按位置查询学生信息的函数 
{
	int pos,i;
	printf("请输入要查询学生的位置:");
	scanf("%d",&pos);
	if(pos>0&&pos<=length)
	{
	  printf("学号:\t姓名:\t成绩:\n");
      printf("%lld\t%s\t%5.2lf\n",l->elem[pos-1].num,l->elem[pos-1].name,l->elem[pos-1].score);
    }
    else
    printf("位置错误");            //位置错误时输出错误信息 
	return ;
}
void query2(sqlist *l, int length)  //查询学生个数的函数 
{
	printf("学生数量为:");
	printf("%d\n",length);
	return ;
}
int main()
{
	printf("\t\t\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\n");
	printf("\n\n\t\t\t\t学生成绩管理系统\n\n\n");
	printf("\t\t\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\1\2\n");
	printf("\n\n\n\t\t\t\t1:输入学生信息\n") ;
	printf("\n\t\t\t\t2:显示学生信息\n");
	printf("\n\t\t\t\t3:根据姓名查询学生信息\n");
	printf("\n\t\t\t\t4:根据姓名删除学生信息\n");
	printf("\n\t\t\t\t5:根据学号添加学生信息\n");
	printf("\n\t\t\t\t6:输入位置添加学生信息\n");
	printf("\n\t\t\t\t7:输入位置查询学生信息\n");
    printf("\n\t\t\t\t8:查询学生数量\n");
	printf("\n\t\t\t\t0:退出系统\n");
	printf("\n\t\t\t\t请按0-4选择菜单项:\n");
	sqlist list1;
	int n,m=0; 
	while(scanf("%d",&n))
	{
		if(n==0)
		 break;
		if(n!=1&&m==0)
		{
			printf("请先输入学生信息后才能操作\n");
			continue; 
		}
		m=1;
		switch(n)
		{
			case 1:	initlist(&list1);
	                int length; printf("请输入要添加的学生信息的个数:");
	                scanf("%d",&length);
	                ll num; char name[50]; double score;
	                printf("请依次按照学号从小到大的顺序输入要添加学生的信息:\n学号:\t姓名:\t成绩:\n"); 
                    for(int i=0; i<length; i++)
                   	{
	                  	scanf("%lld",&num);
		                getchar(); 
		                scanf("%s",name);
		                scanf("%lf",&score);
		                listlast(&list1,num,name,score);
		                if(i==length-1)
		                printf("输入完成,可以进行下一步操作\n");
	                }   break;
	        case 2: show(&list1,list1.length); break;
	        case 3: query(&list1,list1.length); break; 
	        case 4: delet(&list1,list1.length); break;
	        case 5: add1(&list1,list1.length); break; 
	        case 6: add2(&list1,list1.length); break; 
	        case 7: query1(&list1,list1.length); break;
	        case 8: query2(&list1,list1.length); break;
		}
	}	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值