ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线性表的顺序表示来实现学生信息管理系统

2019-05-31 21:54:50  阅读:386  来源: 互联网

标签:顺序 线性表 int ElemType listsize elem length printf 信息管理系统


在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<conio.h>

#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0

#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10

typedef int Status;

typedef struct
{
	char name[10];
	float score;
}ElemType;
typedef struct
{
	ElemType *elem;		//存储空间地址
	int length;			//当前长度	
	int listsize;		//当前分配的存储容量,以sizeof(ElemType)为单位
}SqList;
Status InitList_Sq(SqList *L)
{
	//构造一个空的线性表
	L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->elem) exit(OVERFLOW);
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	return OK;
}
Status ListInser_Sq(SqList *L,int i,ElemType e)
{
	ElemType *q,*p;		//要插入的位置
	//在顺序线性表L中第i 个位置之前插入新的元素e
	//i的合法值为1<=i<=ListLengh(*L)+1
	if(i<1 || i>L->length+1) return ERROR;	//i值不合法
	if(L->length>=L->listsize)
	{
		//当前存储空间已满,增加分配
		ElemType *newbase;
		newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREAMENT)*sizeof(ElemType));
		if(!newbase)exit(OVERFLOW);	//存储分配失败
		L->elem=newbase;			//新基址
		L->listsize+=LISTINCREAMENT;//增加存储空间容量
	}
	
	q=&(L->elem[i-1]);		//编译通过了,事实证明elem是一个指针,可以作为一个数组的基地址,虽然数组没有定义
	for(p=&(L->elem[L->length-1]);p>=q;--p)
		*(p+1)=*p;    //插入位置及之后的位置右移
	*q=e;					//插入e,为了插入e,付出艰辛的操作,还没完
	++L->length;     //表长增1
	return OK;
}
Status ListDelete_Sq(SqList *L,int i,ElemType *e)
{
	//在顺表线性表L中删除第1个元素,并用e返回其值
	//i的和法制为i的合法值为1<=i<=ListLengh(*L)
	ElemType *p,*q;
	if(i<1 || (i>L->length)) return ERROR;
	p=&(L->elem[i-1]);		//p为被删除元素的位置
	*e=*p;
	q=L->elem+L->length-1;	//表尾元素的位置
	for(++p;p<=q;++p) 
		*(p-1)=*p;			//被删除元素之后的元素左移
	--L->length;			//表长减1
	return OK;
}
void Traverse(SqList L)  //函数指针不会,只能暂时用这个了
{
	int i=0;
    while(i<L.length)
	{
		printf("%s %4.2f\n",L.elem[i].name,L.elem[i].score);
		i++;
	}
}
menu()
{
	printf("\n\n\t\t*******************************************\n");
	printf("\t\t*              学生信息管理系统           *\n");
	printf("\t\t*             1.查询学生信息              *\n");
	printf("\t\t*             2.增加学生信息              *\n");
	printf("\t\t*             3.删除学生信息              *\n");
	printf("\t\t*             4.显示全部信息              *\n");
	printf("\t\t*             0.退出系统                  *\n");
	printf("\t\t*******************************************\n");
}

//全局变量
ElemType elem;
SqList L;
void add()
{
	int i;
	printf("请输入要插入的位置:");
	scanf("%d",&i);
	printf("请输入学生姓名:");
	scanf("%s",elem.name);
	printf("请输入学生成绩:");
	scanf("%f",&elem.score);
	ListInser_Sq(&L,i,elem);

	printf("插入成功! 请按任意键返回!");
	getch();
}
void dele()
{
	int i=0;
	char name[10];
	printf("请输入要删除的学生姓名:");
	scanf("%s",name);
	for(i=0;i<L.length;i++)
	{
		if(strcmp(L.elem[i].name,name)==0)
		{
			ListDelete_Sq(&L,i,&L.elem[i]);
			printf("删除操作完成! 请按任意键返回!");
			getch();
			return;
		}
	}
	printf("没有该学生! 请按任意键返回!");
	getch();
}
void look()
{
	char name[10];
	int i;
	printf("请输入学生姓名:");
	scanf("%s",name);
	for(i=0;i<L.listsize;i++)
	{
		if(strcmp(L.elem[i].name,name)==0)
		{
			printf("%s的成绩为%4.2f\n",L.elem[i].name,L.elem[i].score);
			printf("请按任意键返回!");
			getch();
			return;
		}
	}
	printf("没有查询到该学生! 请按任意键返回!");
	getch();
}
void show()
{
	printf("current listsize:%d,",L.listsize);
	printf("current length:%d\n",L.length);
	Traverse(L);
	getch();
}
void main()
{
	char x;
	InitList_Sq(&L);
	while(1)
	{
		system("cls");
		menu();
		x=getchar();
		switch(x)
		{
		case '0':exit(0);
		case '1':look();break;
		case '2':add();break;
		case '3':dele();break;
		case '4':show();break;
		default:break;
		}
	}
	exit(0);
}

标签:顺序,线性表,int,ElemType,listsize,elem,length,printf,信息管理系统
来源: https://blog.csdn.net/AnalogElectronic/article/details/90723434

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有