数据结构之实现学生信息顺序表的增删改查功能

搭建个场景:

将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 :

1】顺序表的创建

2】判满

3】判空

4】往顺序表里增加学生

5】遍历

6】任意位置插入学生

7】任意位置删除学生

8】修改

9】查找(按学生的学号查找)

10】去重

11】销毁顺序表

代码如下:

student_seqlist.h

#ifndef __STUDENT_SEQLIST_H__
#define __STUDENT_SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
typedef struct student
{
	char name[128];
	char gender[10];
	int age;
	int id;
}stu,*stu_p;
typedef struct seqlist
{
	stu student[MAX];
	int length;
}seq,*seq_p;
seq_p create_seq();
int empty_seqlist(seq_p Seq);
int full_seqlist(seq_p Seq);
void add_stu(seq_p Seq,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void show_stu(seq_p Seq);
void insert_pos(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void delete_pos(seq_p Seq,int pos);
void mod_stu(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void find_stu(seq_p Seq,int find_id);
void rm_repeat(seq_p Seq);
void free_seq(seq_p *Seq);
#endif

student_seqlist.c

#include "student_seqlist.h"
//顺序表的创建
seq_p create_seq()
{
	//从堆区申请空间创建顺序表
	seq_p Seq=(seq_p)malloc(sizeof(seq));
	if(NULL == Seq)
	{
		printf("创建学生顺序表失败!\n");
		return NULL;
	}
	bzero(Seq->student,sizeof(Seq->student));//将顺序表中学生结构体数组清空
	Seq->length=0;//将顺序表的长度置0
	printf("顺序表创建成功!\n");
	return Seq;
}
//判空
int empty_seqlist(seq_p Seq)
{
	if(NULL == Seq)
	{
		printf("顺序表不合法!\n");
		return -1;
	}
	return Seq->length==0?1:0;
}
//判满
int full_seqlist(seq_p Seq)
{
	if(NULL == Seq)
	{
		printf("顺序表不合法!\n");
		return -1;
	}
	return Seq->length==MAX?1:0;
}
//往顺序表里面添加学生(尾插)
void add_stu(seq_p Seq,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
	if(NULL == Seq || full_seqlist(Seq))
	{
		printf("添加失败!\n");
		return;
	}
	strcpy(Seq->student[Seq->length].name,insert_name);
	strcpy(Seq->student[Seq->length].gender,insert_gender);
	Seq->student[Seq->length].age=insert_age;
	Seq->student[Seq->length].id=insert_id;
	printf("学生信息添加成功!\n");
	Seq->length++;
	putchar(10);
}
//遍历显示输出学生信息
void show_stu(seq_p Seq)
{
	if(NULL == Seq || empty_seqlist(Seq))
	{
		printf("输出显示学生信息失败!\n");
		return;
	}
	printf("姓名\t性别\t年龄\t学号\n");
	for(int i=0;i<Seq->length;i++)
	{
		printf("%s\t%s\t%d\t%d\n",Seq->student[i].name,Seq->student[i].gender,Seq->student[i].age,Seq->student[i].id);
	}
	putchar(10);
}
//任意位置插入学生
void insert_pos(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
	if(NULL == Seq || full_seqlist(Seq) || pos <=0 || pos >MAX)
	{
		printf("插入学生信息失败!\n");
		return;
	}
	for(int i=Seq->length-1;i>=pos-1;i--)
	{
		strcpy(Seq->student[i+1].name,Seq->student[i].name);
		strcpy(Seq->student[i+1].gender,Seq->student[i].gender);
		Seq->student[i+1].age=Seq->student[i].age;
		Seq->student[i+1].id=Seq->student[i].id;
	}
	strcpy(Seq->student[pos-1].name,insert_name);
	strcpy(Seq->student[pos-1].gender,insert_gender);
	Seq->student[pos-1].age=insert_age;
	Seq->student[pos-1].id=insert_id;
	printf("学生信息插入成功!\n");
	Seq->length++;
	putchar(10);
}
//任意位置删除学生
void delete_pos(seq_p Seq,int pos)
{
	if(NULL == Seq || empty_seqlist(Seq) || pos <=0 || pos >MAX)
	{
		printf("学生信息删除失败!\n");
		return;
	}
	for(int i=pos-1;i<Seq->length-1;i++)
	{
		strcpy(Seq->student[i].name,Seq->student[i+1].name);
		strcpy(Seq->student[i].gender,Seq->student[i+1].gender);
		Seq->student[i].age=Seq->student[i+1].age;
		Seq->student[i].id=Seq->student[i+1].id;
	}
	printf("学生信息删除成功!\n");
	Seq->length--;
	putchar(10);
}
//修改学生信息
void mod_stu(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
	if(NULL == Seq || empty_seqlist(Seq) || pos <=0 ||pos >MAX)
	{
		printf("修改学生信息失败!\n");
		return;
	}
	strcpy(Seq->student[pos-1].name,insert_name);
	strcpy(Seq->student[pos-1].gender,insert_gender);
	Seq->student[pos-1].age=insert_age;
	Seq->student[pos-1].id=insert_id;
	printf("学生信息修改成功!\n");
	putchar(10);
}
//按学号查找学生信息
void find_stu(seq_p Seq,int find_id)
{
	if(NULL == Seq || empty_seqlist(Seq))
	{
		printf("查找学生信息失败!\n");
		return;
	}
	int flag=0;
	for(int i=0;i<Seq->length;i++)
	{
		if(Seq->student[i].id == find_id)
		{
			flag=1;
			printf("您要查找的学生信息如下:\n");
			printf("%s\t%s\t%d\t%d\n",Seq->student[i].name,Seq->student[i].gender,Seq->student[i].age,Seq->student[i].id);
		}
	}
	if(flag == 0)
	{
		printf("查无此学号的学生信息!\n");
	}
	putchar(10);
}
//学生信息去重
void rm_repeat(seq_p Seq)
{
	if(NULL == Seq || empty_seqlist(Seq))
	{
		printf("学生信息去重失败!\n");
		return;
	}
	for(int i=0;i<Seq->length;i++)
	{
		for(int j=i+1;j<Seq->length;j++)
		{
			if(Seq->student[i].id == Seq->student[j].id)
			{
				delete_pos(Seq,j+1);
				j--;
			}
		}
	}
}
//释放学生顺序表
void free_seq(seq_p *Seq)
{
	if(NULL == *Seq)
	{
		printf("释放学生顺序表失败!\n");
		return;
	}
	free(*Seq);
	*Seq=NULL;//指针置空,防止野指针
}

main.c

#include "student_seqlist.h"

int main(int argc, const char *argv[])
{
	stu_p student=(stu_p)malloc(sizeof(stu));
	seq_p Seq=create_seq();
	add_stu(Seq,"小明","男",20,1001);//插入学生信息
	add_stu(Seq,"小华","男",22,1002);
	add_stu(Seq,"小兰","女",21,1003);
	show_stu(Seq);//输出显示学生信息
	insert_pos(Seq,2,"小丽","女",23,1004);//任意位置插入学生信息
	show_stu(Seq);
	delete_pos(Seq,3);//删除任意位置学生信息
	show_stu(Seq);
	mod_stu(Seq,3,"小李","男",25,1005);//修改学生信息
	show_stu(Seq);
	find_stu(Seq,1005);//查找学生信息
	insert_pos(Seq,2,"小李","男",25,1005);
	show_stu(Seq);
	rm_repeat(Seq);//学生信息去重
	show_stu(Seq);
	free_seq(&Seq);//释放学生顺序表
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值