顺序表--学生信息管理

顺序表结构

  • 逻辑结构:线性表
  • 存储结构:顺序存储
  • 基本运算:
    1. 初始化
    2. 查找节点
    3. 插入节点
    4. 删除节点

数据准备

typedef int Status;

typedef struct		
{
	char name[20];		 // 姓名
    char stuId[8]; 		// 学号

}student;

typedef student ElemType;

typedef struct		
{
	ElemType *elem; 	// 存储空间的基地址 
	int length; 	// 当前长度 
}SqList;

初始化

分配内存,此时长度设为0。

Status InitList(SqList *L)   // 初始化 
{ 
 L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
 if(!L->elem)  exit(-1); 
 L->length=0; 
 printf("初始化成功\n\n");
 return 1;
}

查找

int FindByStuId(SqList &L) // 根据学号查找,返回该同学在顺序表中的编号 
{
	printf("请输入要查找的学生学号:");	
	char s[20];	

	scanf("%s",s);
	
	for(int i=1;i<=L.length;i++)
	{
		if(strcmp(L.elem[i].stuId,s)==0)
		
			return i;

	}
	return 0;
}

插入

Status ListInsert(SqList &L,int i,ElemType data) // 在 i位置插入
{

	if((i<1)||(i>L.length+1))	//序号不正确 
	
		return 0;

	if(L.length>=MAXSIZE)	//已经达到最大值 
		
		return 0;

	for(int j=L.length;j>=i;j--)
	{
		L.elem[j+1]=L.elem[j];		//元素后移 
	}

	L.elem[i]=data;

	L.length++;

	return 1;
}

删除

Status ListDelete(SqList &L,int i) // 		删除 i位置的学生信息 
{
	if((i<1)||(i>L.length))		//序号不正确 
		
		return 0;

	for(int j=i;j<=L.length;j++)
	{
		L.elem[j]=L.elem[j+1];		//元素前移 
	}

	L.length--;

	return 1;
}

总的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 10

int num;

typedef int Status;

typedef struct
{
	char name[20];		 // 姓名
    char stuId[8]; 		// 学号

}student;

typedef student ElemType;
typedef struct
{
	ElemType *elem; 	// 存储空间的基地址 
	int length; 	// 当前长度 
}SqList;

Status InitList(SqList *L) 		// 初始化 
{	
	L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
	if(!L->elem)  exit(-1); 
	L->length=0;	
	printf("初始化成功\n\n");
	return 1;
}

void GetElem(SqList &L,int i) 		// 访问顺序表
{
	printf("学号:%-10s\t姓名:%-20s\n",L.elem[i].stuId,L.elem[i].name);
}

void Input(ElemType *e)
{
	printf("姓名:");	
	scanf("%s",e->name);

	printf("学号:");	
	scanf("%s",e->stuId);
	
	printf("输入完成\n\n");
}


void Input(SqList &L)
{
	printf("请输入要录入学生的人数:");
	scanf("%d",&num);
	
	for(int i=1;i<=num;i++)
	{
		printf("第%d个学生:\n",i);
		Input(&L.elem[i]);
	}	
	L.length=num;
}

void Output(SqList &L)
{
	for(int i=1;i<=num;i++)
	{					
		GetElem(L,i);
	}
}

int FindByStuId(SqList &L) // 根据学号查找,返回该同学在顺序表中的编号 
{
	printf("请输入要查找的学生学号:");	
	char s[20];	

	scanf("%s",s);
	
	for(int i=1;i<=L.length;i++)
	{
		if(strcmp(L.elem[i].stuId,s)==0)
		
			return i;

	}
	return 0;
}

ElemType FindByNum(SqList &L) // 根据序号查找,返回该同学的信息 
{
	printf("请输入要查询的位置:");
	int n;
	
	scanf("%d",&n);
	GetElem(L,n);
}

Status ListInsert(SqList &L,int i,ElemType data) // 在 i位置插入
{

	if((i<1)||(i>L.length+1))	//序号不正确 
	
		return 0;

	if(L.length>=MAXSIZE)	//已经达到最大值 
		
		return 0;

	for(int j=L.length;j>=i;j--)
	{
		L.elem[j+1]=L.elem[j];		//元素后移 
	}

	L.elem[i]=data;

	L.length++;

	return 1;
}

void ListInsert(SqList &L)
{
	printf ("请输入要插入的位置:");

	int id;	
	scanf("%d",&id);
	
	printf("请输入学生信息:\n");
	ElemType temp;
	Input(&temp);
	
	if(ListInsert(L,id,temp))
	{
		num++;
		printf("插入成功\n");
	}
	else
	{
		printf("插入失败\n");
	}
}

Status ListDelete(SqList &L,int i) // 		删除 i位置的学生信息 
{
	if((i<1)||(i>L.length))		//序号不正确 
		
		return 0;

	for(int j=i;j<=L.length;j++)
	{
		L.elem[j]=L.elem[j+1];		//元素前移 
	}

	L.length--;

	return 1;
}

void ListDelete(SqList &L)
{
	printf("请输入要删除的位置:");
	
	int id;	
	scanf("%d",&id);
	
	if(ListDelete(L,id))
	{
		num--;
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败\n");
	}
}

void menu()
{
	printf("\n********************************\n\n");

	printf("1. 录入信息\n");

	printf("2. 显示信息\n");

	printf("3. 按学号查找学生\n");

	printf("4. 按序号查找学生\n"); 

	printf("5. 在指定位置插入学生信息\n");

	printf("6. 在指定位置删除学生信息\n");

	printf("7. 学生总数\n");
	
	printf("\n********************************\n\n");
}

int main()
{
	menu();
	
	SqList L;		

	ElemType a,b,c,d;
	
	int num,choose;
	
	if(InitList(&L)){
	 
		while(1)
		{
			printf("请输入选择,其他键退出:");
			
			scanf("%d",&choose);
			
			switch(choose)
			{
				case 1:	Input(L); 						break;	
				case 2:	Output(L); 						break;	
				case 3:	GetElem(L,FindByStuId(L));		break;	
				case 4:	FindByNum(L);					break;	
				case 5:	ListInsert(L);					break;		
				case 6:	ListDelete(L);					break;
				case 7:
					printf("已录入的学生个数为:%d\n\n",L.length);
					break;						
				default:	
					exit(1);
			}	
		}
	} 
	else
	{
		printf("初始化失败!");
	} 

	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:此程序没有太在意数据校验,乱输入可能有bug。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值