【C语言】结构体顺序表练习题

搭建个场景:将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数
1】顺序表的创建,
2】判满、
3】判空、
4】往顺序表里增加学生
5】遍历、
6】任意位置插入学生
7】任意位置删除学生
8】修改、
9】查找(按学生的学号查找)
10】去重、
11】销毁顺序表

头文件:seqStudent.h
#ifndef _SEQSTUDENT_H
#define _SEQSTUDENT_H

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

#define MAXSTR 20 	//最大字符串长度
#define MAX 100  	//最大顺序表长度

typedef struct Student 	//定义存储学生信息的结构体
{
	int id; 	//学号
	char name[MAXSTR]; 	//学生姓名
	int age; 			//年龄
}Student;

typedef Student DateType;

typedef struct seqStudents
{
	DateType date[MAX]; 	//用数组来存放连续的数据
	int len; 	//顺序表的长度
}seqStudents,*seqStudentsPtr; 	//顺序表的定义

//在堆区创建顺序表函数
seqStudentsPtr create();

//顺序表判满函数
int fill(seqStudentsPtr S);

//顺序表判空函数
int empty(seqStudentsPtr S);

//获取一条学生信息函数
DateType gete();

//往顺序表里面增加学生函数
int add(seqStudentsPtr S,DateType e);

//遍历顺序表函数
void show(seqStudentsPtr S);

//在任意指定下标位置插入学生函数
int insert(seqStudentsPtr S,int n,DateType e);

//删除任意指定下标位置学生函数
int del(seqStudentsPtr S,int n);

//修改指定位置的学生信息函数
int update(seqStudentsPtr S,int n,DateType e);

//按学生的学号查找学生函数,返回下标,失败-1
int find(seqStudentsPtr S,int id);

//顺序表去重函数
void delrepeate(seqStudentsPtr S);

//销毁顺序表函数
void seqfree(seqStudentsPtr *S);

#endif
源文件:seqStudent.c
#include "seqStudent.h"

//在堆区创建顺序表函数
seqStudentsPtr create()
{
	seqStudentsPtr S=(seqStudentsPtr)malloc(sizeof(seqStudents));
	if(NULL==S)
	{
		printf("fail create\n");
		return NULL;
	}
	memset(S->date,0,sizeof(S->date)); 		//清空顺序表元素
	S->len=0; 								//顺序表吃长度置零
	printf("seccess create\n");
	return S;
}

//顺序表判满函数
int fill(seqStudentsPtr S)
{
	if(NULL==S)
	{
		printf("fail fill\n");
		return -1;
	}
	if(S->len==MAX)
	{
		return 1;
	}else{
		return 0;
	}
}

//顺序表判空函数
int empty(seqStudentsPtr S)
{
	if(NULL==S)
	{
		printf("fail empty\n");
		return -1;
	}
	if(S->len==0)
	{
		return 1;
	}else
	{
		return 0;
	}
}

//获取一条学生信息函数
DateType gete()
{
	DateType e;
	printf("请输入学生信息:\n");
	printf("学号:");
	scanf("%d",&e.id);
	printf("姓名:");
	scanf("%s",e.name);
	printf("年龄:");
	scanf("%d",&e.age);
	return e;
}

//往顺序表里面增加学生函数
int add(seqStudentsPtr S,DateType e)
{
	if(NULL==S||fill(S))
	{
		printf("fail add\n");
		return 0;
	}
	//添加学生信息
	S->date[S->len].id=e.id;
	strcpy(S->date[S->len].name,e.name);
	S->date[S->len].age=e.age;
	S->len++; 			//顺序表的长度自增
	printf("seccess add\n");
	return 1;
}

//遍历顺序表函数
void show(seqStudentsPtr S)
{
	if(NULL==S||empty(S))
	{
		printf("fail show\n");
		return;
	}
	for(int i=0;i<S->len;i++)
	{
		printf("[%d] 学号:%d\t学生姓名:%s\t年龄:%d\n",i,S->date[i].id,S->date[i].name,S->date[i].age);
	}
}

//在任意指定下标位置插入学生函数
int insert(seqStudentsPtr S,int n,DateType e)
{
	if(NULL==S||fill(S)||n<0||n>S->len)
	{
		printf("fail insert\n");
		return 0;
	}
	for(int i=S->len;i>n;i--) 		//腾出指定位置
	{
		S->date[i].id=S->date[i-1].id;
		strcpy(S->date[i].name,S->date[i-1].name);
		S->date[i].age=S->date[i-1].age;
	}
	//插入信息
	S->date[n].id=e.id;
	strcpy(S->date[n].name,e.name);
	S->date[n].age=e.age;
	S->len++;
	printf("seccess insert\n");
	return 1;
}

//删除任意指定下标位置学生函数
int del(seqStudentsPtr S,int n)
{
	if(NULL==S||empty(S)||n<0||n>=S->len)
	{
		printf("fail del\n");
		return 0;
	}
	for(int i=n;i<S->len;i++)
	{
		S->date[i].id=S->date[i+1].id;
		strcpy(S->date[i].name,S->date[i+1].name);
		S->date[i].age=S->date[i+1].age;
	}
	S->len--;
	printf("seccess del\n");
	return 1;
}

//修改指定位置的学生信息函数
int update(seqStudentsPtr S,int n,DateType e)
{
	if(NULL==S||empty(S)||n<0||n>=S->len)
	{
		printf("fail update\n");
		return 0;
	}
	//修改信息
	S->date[n].id=e.id;
	strcpy(S->date[n].name,e.name);
	S->date[n].age=e.age;
	printf("seccess update\n");
	return 1;
}

//按学生的学号查找学生函数,返回下标,失败-1
int find(seqStudentsPtr S,int id)
{
	if(NULL==S||empty(S))
	{
		printf("fail find\n");
		return -1;
	}
	for(int i=0;i<S->len;i++)
	{
		if(S->date[i].id==id)
		{
			printf("find index:%d\n",i);
			return i;
		}
	}
	printf("find no id\n");
	return -1;
}

//顺序表去重函数
void delrepeate(seqStudentsPtr S)
{
	if(NULL==S||empty(S))
	{
		printf("fail delrepeate\n");
		return;
	}
	for(int i=0;i<S->len-1;i++)
	{
		for(int j=i+1;j<S->len;j++)
		{
			if(S->date[i].id==S->date[j].id && strcmp(S->date[i].name,S->date[j].name)==0 && S->date[i].age==S->date[j].age)
			{
				del(S,j); 	//调用删除学生函数
				j--; 		//防止漏删除
			}
		}
	}
	printf("seccess delrepeate\n");
}


//销毁顺序表函数
void seqfree(seqStudentsPtr *S)
{
	if(NULL==S||NULL==*S)
	{
		printf("fail seqfree\n");
		return;
	}
	free(*S); 
	*S=NULL; 		//防止野指针
	printf("seccess seqfree\n");
}
主函数文件:main.c
#include "seqStudent.h"

int main(int argc, const char *argv[])
{
	//测试代码
	//创建一个学生信息顺序表
	seqStudentsPtr S=create();

	printf("判满输出:%d\n",fill(S));
	printf("判空输出:%d\n",empty(S));

	//获取学生信息函数测试,add函数测试,show函数测试
	DateType e=gete();
	add(S,e);
	add(S,e);
	add(S,e);
	add(S,gete());
	add(S,gete());
	show(S);
	
	//指定下标位置添加
	insert(S,2,gete());
	show(S);

	//指定下标位置删除
	del(S,2);
	show(S);

	//按学号查找学生
	int id=0;
	printf("请输入查找学生的学号:");
	scanf("%d",&id);
	find(S,id);
	printf("请输入查找学生的学号:");
	scanf("%d",&id);
	find(S,id);
	
	//去重
	delrepeate(S);
	show(S);

	//释放顺序表
	seqfree(&S); 		//用二级指针不会有段错误

	return 0;
}
编译指令

gcc *.c
./a.out

测试结果

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值