一.作业
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "zuoye.h"
/*******************主函数********************/
int main(int argc, char const *argv[])
{
Classptr class_ptr=NULL;
int menu=0;
while(1)
{
caidan1();
printf("请输入:");
scanf("%d",&menu);
getchar();
switch (menu)
{
case 1:
{
class_ptr=list_create();
}
break;
case 2:
{
intput(class_ptr);
}
break;
case 3:
{
output(class_ptr);
}
break;
case 4:
{
max_min(class_ptr);
}
break;
case 5:
{
paixu(class_ptr);
output(class_ptr);
}
break;
case 6:
{
list_charu(class_ptr);
}
break;
case 7:
{
list_shanchu(class_ptr);
}
break;
case 8:
{
list_gai(class_ptr);
}
break;
case 9:
{
int res=list_cha(class_ptr);
if(res>=0)
{
printf("您要查找的值在第%d个位置\n",res+1);
}
}
break;
case 10:
destroy(&class_ptr);
break;
case 0:goto END;
default:printf("输入错误\n");
}
}
END:
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
//定义结构体类型
typedef struct
{
char name[20]; //姓名
int age; //年龄
double score; //成绩
}Stu;
typedef struct Class
{
Stu student[MAX];
int size;
}Class,*Classptr;
//顺序表的创建函数
Classptr list_create();
//声明菜单
void caidan1();
//声明输入函数
void intput(Class*ptr);
//声明输出函数
void output(Class*ptr);
//成绩最高和最低的函数
void max_min(Classptr ptr);
//降序函数
void paixu(Classptr ptr);
//声明判空函数
int list_empty(Classptr ptr);
//定义判满函数
int list_full(Classptr ptr);
//定义charu函数
int list_charu(Classptr ptr);
//定义shanchu函数
int list_shanchu(Classptr ptr);
//定义gai函数
int list_gai(Classptr ptr);
//按值查找位置函数
int list_cha(Classptr ptr);
//
void destroy(Classptr*ptr);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
//定义结构体类型
typedef struct
{
char name[20]; //姓名
int age; //年龄
double score; //成绩
}Stu;
typedef struct Class
{
Stu student[MAX];
int size;
}Class,*Classptr;
void caidan1()
{
printf("\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=======5.按成绩将学生进行降序排序========\n");
printf("\t\t=======6.添加学生信息=================\n");
printf("\t\t=======7.删除学生信息=================\n");
printf("\t\t=======8.通过位置修改学生信息===========\n");
printf("\t\t=======9.按找学生成绩查找学生===========\n");
printf("\t\t=======10.学生信息销毁=====================\n");
printf("\t\t=======0.退出=============================\n");
printf("\t\t==========================================\n");
}
//定义顺序表的创建函数
Classptr list_create()
{
Classptr ptr=(Classptr )malloc(sizeof(Class));
if(ptr==NULL)
{
printf("创建失败\n");
return NULL;
}
//程序执行至此,表示顺序表创建成功
memset(ptr->student,0,sizeof(ptr->student));
printf("创建成功\n");
return ptr;
}
//录入函数
void intput(Classptr ptr)
{
int n=0;
printf("输入班级人数:");
scanf("%d",&n);
if(NULL == ptr)
{
printf("录入失败\n");
return;
}
for(int i=ptr->size;i<ptr->size+n;i++)
{
printf("请输入第%d个学生的姓名:", i+1);
scanf("%s",ptr->student[i].name);
printf("请输入第%d个学生的年龄:",i+1);
scanf("%d",&ptr->student[i].age);
printf("请输入第%d个学生的成绩:",i+1);
scanf("%lf",&ptr->student[i].score);
printf("\n");
}
ptr->size+=n;
}
//输出函数
void output(Classptr ptr)
{
if(NULL == ptr)
{
printf("error\n");
return ;
}
printf("所有学生信息如下:\n");
printf("姓名\t年龄\t成绩\n");
for(int i=0;i<ptr->size;i++)
{
printf("%s\t%d\t%.2lf\n",ptr->student[i].name,ptr->student[i].age,ptr->student[i].score);
}
printf("\n");
}
//成绩最高和最低的函数
void max_min(Classptr ptr)
{
if(NULL == ptr)
{
printf("error\n");
return ;
}
int maxi=0;
int mini=0;
for(int i=0;i<ptr->size;i++)
{
if(ptr->student[maxi].score < ptr->student[i].score)
{
maxi=i;
}
if(ptr->student[maxi].score > ptr->student[i].score)
{
mini=i;
}
}
printf("成绩最高的学生信息为:\n");
printf("%s\t%d\t%.2f\n",ptr->student[maxi].name,ptr->student[maxi].age,ptr->student[maxi].score);
printf("成绩最低的学生信息为:\n");
printf("%s\t%d\t%.2f\n",ptr->student[mini].name,ptr->student[mini].age,ptr->student[mini].score);
}
//降序函数
void paixu(Classptr ptr)
{
if(NULL == ptr)
{
printf("error\n");
return ;
}
for(int i=1;i<ptr->size;i++)
{
for(int j=0;j<ptr->size-i;j++)
{
if(ptr->student[j].score < ptr->student[j+1].score)
{
Stu temp = ptr->student[j];
ptr->student[j]=ptr->student[j+1];
ptr->student[j+1] = temp;
}
}
}
printf("排序完成\n");
}
//声明判空函数
int list_empty(Classptr ptr)
{
return ptr->size==0;
}
//定义判满函数
int list_full(Classptr ptr)
{
return ptr->size==MAX;
}
//任意位置插入元素
int list_charu(Classptr ptr)
{
int pos=0;
Stu new_student;
printf("请输入插入的地方:");
scanf("%d",&pos);
printf("请输入要插入的数据:");
scanf("%s%d%lf",new_student.name,&new_student.age,&new_student.score);
if(ptr==NULL||list_full(ptr)||pos<0||pos>ptr->size)
{
printf("插入失败\n");
return -1;
}
for(int i=ptr->size-1;i>=pos;i--)
{
ptr->student[i+1]=ptr->student[i];
}
ptr->student[pos]=new_student;
ptr->size++;
return 0;
}
//按照位置删除学生信息
int list_shanchu(Classptr ptr)
{
int pos=0;
printf("请输入要删除数据的位置:");
scanf("%d",&pos);
if(ptr==NULL||list_empty(ptr)||pos<0||pos>ptr->size-1)
{
printf("删除失败\n");
return -1;
}
//腾空逻辑
for(int i=pos;i<ptr->size;i++)
{
ptr->student[i]=ptr->student[i+1]; //将元素向前移动
}
//表长变化
ptr->size--;
printf("删除成功\n");
return 0;
}
//通过位置修改学生信息
int list_gai(Classptr ptr)
{
int pos=0;
Stu new_student;
printf("请输入xiugai的地方:");
scanf("%d",&pos);
printf("请输入要xiugai的数据:");
scanf("%s%d%lf",new_student.name,&new_student.age,&new_student.score);
//判断逻辑
if(NULL==ptr||list_empty(ptr)||pos<0||pos>=ptr->size)
{
printf("修改失败\n");
return -1;
}
//正常进行修改
ptr->student[pos]=new_student;
ptr->size++;
printf("修改成功\n");
return 0;
}
//按值查找位置函数
int list_cha(Classptr ptr)
{
Stu new_student;
printf("请输入要chazhao的xingming:");
scanf("%s",new_student.name);
//判断逻辑
if(NULL==ptr||list_empty(ptr))
{
printf("查找失败\n");
return -1;
}
//遍历整个顺序表
for (int i = 0; i < ptr->size; i++)
{
if(ptr->student[i].name==new_student.name)
{
return i;//返回查找到的数据下标
}
}
printf("没找到\n");
return -1;
}
//
void destroy(Classptr*ptr)
{
//释放内存
if(NULL != *ptr)
{
free(*ptr); //释放空间
*ptr = NULL;
}
}
二.笔记
1.数据结构相关内容
1.1 数据的相关内容
1> 数据:是能够被计算机识别、存储、处理的用于描述客观事实的符号
2> 数据的基本单位:数据元素
数据元素:所谓数据元素就是能够完成描述事物的基本单位。例如24061班的一个学生的信息
3> 数据的最小单位:数据项
数据项:用于组成数据元素的不可分割的最小单位。例如一个学生的学号、性别、成绩...
4> 数据对象:由多个数据元素组成的一个集合称为数据对象。例如:24061整个班级
5> 数据之间的关系:数据项 ==> 数据元素 ==> 数据对象 ==> 数据
1.2 结构
1> 数据结构中,结构分为两部分:逻辑结构、存储结构
2> 逻辑结构:表示数据元素之间的关系
3> 存储结构:所谓存储结构,就是逻辑结构在物理内存上的映射(内存如何存储多个数据元素)
4> 数据结构:所谓数据结构,其实就是数据之间存在的一种或多种关系的集合,以及加在该集合上的一组操作(增删改查)
二、线性表
1> 概念:由多个相同特性的数据元素组成的线性结构叫做线性表
2> 特点:除了第一个元素没有前驱,最后一个元素没有后继外,其他的数据元素有且仅有一个前驱和一个后继
3> 线性表的分类:
按存储方式:
顺序表:顺序存储的线性表称为顺序表
链表:链式存储的线性表称为链表
按操作受限的方式:
栈:只允许在同一个端点处进行插入和删除操作的线性表
队列:只允许在异端进行插入和删除操作的线性表
三、顺序表
3.1 顺序表的概念
1> 顺序存储的线性表叫做顺序表
线性表:说明该容器对应的逻辑结构为线性结构
顺序存储:表示存储结构为顺序结构,就是使用连续的存储空间进行操作
2> 连续存储空间:可以使用数组来完成或者使用堆区空间
3> 顺序表的表示方式:除了使用一个连续的内存存储顺序表外,还需要外加一个表示顺序表实际长度的变量完成
4> 对顺序表长度的解析:
1、顺序表的长度能够表示顺序表中实际使用的元素个数
2、也能够表示数组中第一个没有存放数据元素的数组元素下标
3、要遍历整个顺序表时,顺序表的长度是最大上限
3.2 有关顺序表的操作
1> 创建顺序表
1、可以在堆区申请一个顺序表,后面操作时,只需要将该顺序表的起始地址传递即可
2、申请出顺序表的空间后,至少需要对顺序表的长度初始化
2> 顺序表判空和判断满
1、对于添加顺序表元素的操作而言,需要判断顺序表是否已经满了,如果满了的话,则添加失败
一般情况:len <= MAX 满:len == MAX
2、对于减少顺序表元素的操作而言,需要判断顺序表是否已经空了,如果空了的话,就减少失败
空:len == 0
3> 向顺序表中添加元素
1、判断条件:如果顺序表已经满了,就不能进行添加操作
2、每次添加的数据放入到顺序表的最后面,也就是放在len所在的位置
3、添加完元素后,需要将长度增加
4> 遍历顺序表
1、判断逻辑:表是否合法,表是否为空
2、本质上就是数组的遍历,只是遍历到顺序表的长度结束即可
5> 顺序表按位置进行插入元素
1、判断逻辑:顺序表不为空,顺序表不满,要插入位置不能小于0,也不能大于len
2> 插入逻辑:需要将从最后一个元素到要插入位置的元素之间所有元素整体向后移动一格
将新元素放入到要插入位置即可
6> 顺序表任意位置删除元素
1、判断逻辑:表是否为空、表是否合法、删除位置是否合法
2、需要将要删除位置后面的元素开始到最后一个位置为止,整体前移动一格