数据结构(顺序表)

1.顺序表

代码:

seqlist.h:

#ifndef SEQLIST_H
#define SEQLIST_H
#include<myhead.h>

#define MAX 20
typedef int datatype;

typedef struct
{
	datatype data[MAX];
	int len;
}SeqList,*SeqListPtr;

//声明顺序表的创建函数
SeqListPtr list_create();

//判空函数,空返回真,非空返回假
int list_empty(SeqListPtr L);

//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L);

//添加元素
int list_add(SeqListPtr L, datatype e);

//遍历顺序表
void list_show(SeqListPtr L);

//定义按任意位置插入函数
int list_insert_pos(SeqListPtr L, int pos, datatype e);

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos);

//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e);

//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e);

//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e);

#endif

seqlist.c:

#include"seqlist.h"

//定义顺序表的创建函数
SeqListPtr list_create()
{
	//在堆区申请一个顺序表的大小空间
	SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));
	if(NULL == L)
	{
		printf("创建失败\n");
		return NULL;
	}
	//程序执行至此,表示顺序表创建成功
	memset(L->data, 0, sizeof(L->data));    //将数组初始化
	L->len = 0;           //顺序表长度为0

	printf("创建成功\n");

	return L;
}

//判空函数,空返回真,非空返回假
int list_empty(SeqListPtr L)
{
	return L->len==0;
}
 
//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L)
{
	return L->len==MAX;
}

//添加元素
int list_add(SeqListPtr L, datatype e)
{
	//判断逻辑
	if(NULL==L || list_full(L))
	{
		printf("添加失败\n");
		return -1;
	}

	//添加逻辑:将要添加的元素放到最后一个位置
	L->data[L->len] = e;

	//表的变化
	L->len++;
	printf("添加成功\n");
	return 0;
}

//遍历顺序表
void list_show(SeqListPtr L)
{
	//判断逻辑
	if(NULL == L || list_empty(L))
	{
		printf("遍历失败\n");
		return ;
	}
	//遍历
	printf("顺序表中元素分别是:");
	for(int i=0; i<L->len; i++)
	{
		printf("%d\t", L->data[i]);
	}

	printf("\n");
}

//定义任意位置插入函数
int list_insert_pos(SeqListPtr L, int pos, datatype e)
{
	//判断逻辑
	if(NULL==L || list_full(L) || pos<0 || pos>L->len)
	{
		printf("插入失败\n");
		return -1;
	}


	//腾空逻辑
	for(int i=L->len-1; i>=pos; i--)
	{
		L->data[i+1] = L->data[i];//将前面的元素后移
	}

	//插入数据
	L->data[pos] = e;


	//表长变化
	L->len++;

	printf("插入成功\n");
	return 0;
}

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos)
{
	//判断逻辑
	if(NULL==L || list_empty(L) || pos<0 || pos>=L->len)
	{
		printf("删除失败\n");
		return -1;
	}

	//删除逻辑
	for(int i=pos+1; i<L->len; i++)
	{
	  L->data[i-1] = L->data[i];      //将元素向前偏移
	}


	//表长变化
	L->len --;

	printf("删除成功\n");
	return 0;
}

//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}

	//遍历整个顺序表
	for(int i=0; i<L->len; i++)
	{
		if(L->data[i] == e)
		{
			return i;        //返回查找到的数据下标
		}
	}

	printf("没找到\n");
	return -1;
}

//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e)
{
	//判断逻辑
	if(NULL==L || pos<0 || pos>=L->len || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}

	//正常进行修改
	L->data[pos] = e;

	printf("修改成功\n");
	return 0;
}

//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}

	//根据旧值找的位置
	int res = list_search_value(L, old_e);
	if(res == -1)
	{
		printf("没有要修改的值\n");
		return -1;
	}
	//调用函数完成按位置修改
	list_update_pos(L, res, new_e);

	printf("修改成功\n");
	return 0;
}

main.c:

#include"seqlist.h"

int main(int argc, const char *argv[])
{
	//创建一个顺序表
	SeqListPtr L = list_create();
	if(NULL == L)
	{
		return -1;
	}

	//调用添加函数
	list_add(L, 520);
	list_add(L, 1314);
	list_add(L, 999);
	list_add(L, 666);
 
	//调用遍历函数
	list_show(L);
 
	//调用任意位置插入函数
	list_insert_pos(L, 0, 100);
	list_insert_pos(L, 2, 100);
	list_insert_pos(L, 6, 100);
 
	//输出
	list_show(L);
 
	//调用删除函数
	list_delete_pos(L, 3);
	list_show(L);
 
	//调用查找函数
	int res = list_search_value(L, 999);
	if(res >= 0)
	{
		printf("您要找的元素在第%d个位置\n", res+1);
	}
 
	//调用按位置修改函数
	list_update_pos(L, 0, 1234);
	list_show(L);
 
	//调用按值修改函数
	list_update_value(L, 999, 888);
	list_show(L);

	
	return 0;
}

 运行结果:

2.班级管理系统

代码:

head.h:

#ifndef HEAD_H
#define HEAD_H
#include<myhead.h>

#define MAX 100            //最大容量

//定义学生类型
typedef struct Stu
{
    char name[20];
    int age;
    double score;
}Stu,* Stu_str;

//定义班级类型
typedef struct Class
{
    struct Stu student[MAX];       //存放学生的容器
    int size;                      //实际人数
}Class,* Class_str;

//函数声明
void create_menu();

Class_str create();

int empty(Class_str C);

int full(Class_str C);

int del(Class_str C, int pos);

int update(Class_str C,int pos,char *a, int b, double c);

int search(Class_str C, char *n);

void input(Class_str C);

void sort(Class_str C);

void maxmin(Class_str C);

void output(Class_str C);

void destroy(Class_str C);

void class_add(Class_str C);

void class_del(Class_str C);

void class_update(Class_str C);

void class_search(Class_str C);
#endif

hs.h:

#include "head.h"

//定义创建菜单函数
void create_menu()
{
		printf("\n\t\t======班级管理系统========\n");
		printf("\t\t1、录入班级学生信息\n");
		printf("\t\t2、按成绩把班级学生信息降序\n");
		printf("\t\t3、展示成绩最高和最低学生的信息\n");
		printf("\t\t4、展示班级学生信息\n");
		printf("\t\t5、销毁班级\n");
		printf("\t\t6、增加班级学生信息\n");
		printf("\t\t7、删除班级学生信息\n");
		printf("\t\t8、修改班级学生信息\n");
		printf("\t\t9、查询班级学生信息\n");
		printf("\t\t0、退出\n");
}

//定义创建班级函数
Class_str create()
{
	//申请内存
	Class_str C = (Class_str)malloc(sizeof(Class));

	if(NULL == C)
	{
		printf("创建失败!");
		return NULL;
	}

	//内存空间初始化
	memset(C->student,0,sizeof(C->student));
	C->size = 0;

	printf("创建成功!\n");

	//返回内存地址
	return C;
}
 
//判空函数,空返回真,非空返回假
int empty(Class_str C)
{
	return C->size==0;
}
 
//判满函数,满返回真,非满返回假
int full(Class_str C)
{
	return C->size==MAX;
}

//定义添加函数
int add(Class_str C, char *a, int b, double c)
{
	//判断逻辑
	if(NULL==C || full(C))
	{
		printf("添加失败\n");
		return -1;
	}

	//添加逻辑:将要添加的元素放到最后一个位置
	strcpy(C->student[C->size].name,a);
	C->student[C->size].age = b;
	C->student[C->size].score = c;

	//表的变化
	C->size++;
	printf("添加成功!\n");
	return 0;
}

//定义删除函数
int del(Class_str C, int pos)
{
	//判断逻辑 
	if(NULL==C || empty(C) || pos<0 || pos>=C->size)
	{
		printf("删除失败!\n");
		return -1;
	}
	
	//删除逻辑
	for(int i=pos+1; i<C->size; i++)
	{
	  C->student[i-1] = C->student[i];      //将元素向前偏移
	}
	
 
	//表长变化
	C->size --;
 
	printf("删除成功!\n");
	return 0;
}

//定义修改函数
int update(Class_str C,int pos,char *a, int b, double c)
{
	//判断逻辑
	if(NULL==C || pos<0 || pos>=C->size || empty(C))
	{
		printf("修改失败!\n");
		return -1;
	}

	//正常进行修改
	strcpy(C->student[pos].name,a);
	C->student[pos].age = b;
	C->student[pos].score = c;

	printf("修改成功!\n");
	return 0;
}

//定义查找函数
int search(Class_str C, char *n)
{
	//判断逻辑
	if(NULL==C || empty(C))
	{
		printf("查找失败!\n");
		return -1;
	}
 
	//遍历整个顺序表
	for(int i=0; i<C->size; i++)
	{
		if(strcmp(C->student[i].name,n) == 0)
		{
			return i;        //返回查找到的数据下标
		}
	}
 
	printf("班里没有这名同学!\n");
	return -1;
}

//定义班级学生信息录入函数
void input(Class_str C)
{
	printf("请输入班级学生人数:");
	scanf("%d",&C->size);
	getchar();
	putchar(10);

	for(int i=0; i<C->size; i++)
	{
		printf("请输入第%d个学生的名字:", i+1);
		scanf("%s", C->student[i].name);
		printf("请输入第%d个学生的年龄:", i+1);
		scanf("%d", &C->student[i].age);
		printf("请输入第%d个学生的分数:", i+1);
		scanf("%lf", &C->student[i].score);

		putchar(10);
	}
	printf("录入成功!\n");
}

//定义按成绩把班级学生信息降序函数
void sort(Class_str C)
{
	if(NULL == C)
	{
		printf("班级不存在!");
		return;
	}

	for(int i=1;i<C->size;i++)
	{
		for(int j=0;j<C->size - i;j++)
		{
			if(C->student[j].score < C->student[j+1].score)
			{
				Stu temp = C->student[j];
				C->student[j] = C->student[j+1];
				C->student[j+1] = temp;
			}
		}
	}
	printf("排序成功!\n");
}

//定义展示成绩最好和最差学生信息函数
void maxmin(Class_str C)
{
	if(NULL == C)
	{
		printf("班级不存在!");
		return;
	}

	int max = 0,maxi = 0,min = 0,mini = 0;
	max = C->student[0].score;
	min = C->student[0].score;
	for(int i=0;i<C->size;i++)
	{
		if(max < C->student[i].score)
		{
			max = C->student[i].score;
			maxi = i;
		}
		if(min > C->student[i].score)
		{

			min = C->student[i].score;
			mini = i;
		}
	}
	printf("班级成绩最好学生信息如下:\n");
	printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
			C->student[maxi].name, C->student[maxi].age, C->student[maxi].score);
	printf("班级成绩最差学生信息如下:\n");
	printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
			C->student[mini].name, C->student[mini].age, C->student[mini].score);
}

//定义展示班级学生信息函数
void output(Class_str C)
{
	if(NULL == C || empty(C))
	{
		printf("班级不存在!\n");
		return;
	}
	printf("班级学生信息如下:\n");
	for(int i=0; i<C->size; i++)
	{
		printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
				C->student[i].name, C->student[i].age, C->student[i].score);
	}
}

//定义销毁班级函数
void destroy(Class_str C)
{
		//释放内存
	if(NULL != C)
	{
		free(C);       //释放空间
		C = NULL;
	}
}

//定义增加班级学生信息函数
void class_add(Class_str C)
{
	char a[20] = {0};
	int b = 0;
	double c = 0;

	printf("请输入要添加的学生姓名:");
	scanf("%s",a);
	printf("请输入要添加的学生年龄:");
	scanf("%d",&b);
	printf("请输入要添加的学生分数:");
	scanf("%lf",&c);

	add(C,a,b,c);
}

//定义删除班级学生信息函数
void class_del(Class_str C)
{
	char n[20] = {0};
	printf("请输入要删除的学生姓名:");
	scanf("%s",n);
	getchar();

	int pos = search(C,n);
	del(C,pos);
}

//定义修改班级学生信息函数
void class_update(Class_str C)
{
	char n[20] = {0}, a[20] = {0};
	int b = 0;
	double c = 0;
	
	printf("请输入要修改的学生姓名:");
	scanf("%s",n);
	putchar(10);

	int pos = search(C,n);

	printf("请输入修改后的学生姓名:");
	scanf("%s",a);
	printf("请输入修改后的学生年龄:");
	scanf("%d",&b);
	printf("请输入修改后的学生分数:");
	scanf("%lf",&c);

	update(C,pos,a,b,c);
}

//定义查询班级学生信息函数
void class_search(Class_str C)
{
	char n[20] = {0};
	printf("请输入要查询的学生姓名:");
	scanf("%s",n);
	putchar(10);

	int pos = search(C,n);

	printf("该学生信息如下:\n");
	printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
			C->student[pos].name, C->student[pos].age, C->student[pos].score);

}

main.h:

#include "head.h"

int main(int argc, const char *argv[])
{
	//菜单
	int menu =0;

	//创建一个班级
	Class_str C = create();
	if(NULL == C)
	{
		return -1;
	}

	while(1)
	{
		create_menu();       //创建菜单

		printf("请输入操作码:");
		scanf("%d",&menu);
		getchar();

		switch(menu)
		{
		case 1:
			{
				input(C); //录入
			}
			break;
		case 2:
			{
				sort(C); //排序
			}
			break;
		case 3:
			{
				maxmin(C); //成绩最好最差的学生
			}
			break;
		case 4:
			{
				output(C); //输出
			}
			break;
		case 5:
			{
				destroy(C); //销毁
				C = NULL;
				printf("销毁成功!\n");
			}
			break;
		case 6:
			{
				class_add(C); //添加
			}
			break;
		case 7:
			{
				class_del(C); //删除
			}
			break;
		case 8:
			{
				class_update(C); //修改
			}
			break;
		case 9:
			{
				class_search(C); //查询
			}
			break;

		case 0:goto END;

		default:printf("不存在该操作码!\n");
		}

	}
	
END:	
	return 0;
}

运行结果:

3.思维导图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值