作业
搭建个场景:
将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 :
1】顺序表的创建 2】判满 3】判空 4】往顺序表里增加学生 5】遍历 6】任意位置插入学生 7】任意位置删除学生 8】修改 9】查找(按学生的学号查找) 10】去重 11】销毁顺序表
头文件:
#ifndef __WORK_H__
#define __WORK_H__
#include <myhead.h>
//学生信息最大容量
#define MAX 100
//定义一个顺序表的结构体类型
typedef struct student
{
char name[32]; //姓名
char sex; //性别
int age; //年龄
int id; //学号
}stu, *stu_ptr;
typedef struct studentlist
{
stu_ptr Stu[MAX]; //学生数组
int len; //顺序表长度
}stulist, *stulist_ptr;
//创建顺序表
stulist_ptr Stu_create();
//判满
int Stu_full(stulist_ptr S);
//判空
int Stu_empty(stulist_ptr S);
//顺序表增加学生
void Stu_add(stulist_ptr S);
//遍历顺序表
void Stu_show(stulist_ptr S);
//插入学生信息
void Stu_insert(stulist_ptr S);
//删除学生信息
void Stu_delet(stulist_ptr S);
//修改学生信息
void Stu_change(stulist_ptr S);
//查找学生信息
void Stu_find(stulist_ptr S);
//学生信息去重
void Stu_remove(stulist_ptr S);
//销毁顺序表
void Stu_destory(stulist_ptr S);
#endif
源文件:
#include "work.h"
//创建顺序表
stulist_ptr Stu_create()
{
//堆区申请空间
stulist_ptr S = (stulist_ptr)malloc(sizeof(stulist));
stu_ptr Stu = (stu_ptr)malloc(sizeof(stu)*MAX);
if(S == NULL)
{
printf("Error!\n");
return NULL;
}
//顺序表长度置0
S->len = 0;
//数组清空
memset(S->Stu, 0, sizeof(S->Stu));
printf("Secceed to create a sequential table\n");
return S;
}
//判满
int Stu_full(stulist_ptr S)
{
//判断顺序表是否合法
if(S == NULL)
{
printf("Error!\n");
return -1;
}
return S->len == MAX;
}
//判空
int Stu_empty(stulist_ptr S)
{
//判断顺序表是否合法
if(S == NULL)
{
printf("Error!\n");
return -1;
}
return S->len == 0;
}
//增加学生
void Stu_add(stulist_ptr S)
{
//判断顺序表是否合法、已满
if(S == NULL || Stu_full(S))
{
printf("Error!\n");
return;
}
//输入学生信息
printf("Please enter name: ");
scanf("%s", S->Stu[S->len]->name);
printf("Please enter sex: ");
scanf("%c", &S->Stu[S->len]->sex);
printf("Please enter age: ");
scanf("%d", &S->Stu[S->len]->age);
printf("Please enter id: ");
scanf("%d", &S->Stu[S->len]->id);
S->len++;
}
//遍历
void Stu_show(stulist_ptr S)
{
//判断顺序表是否合法、为空
if(S == NULL || Stu_empty(S))
{
printf("Error!\n");
return;
}
for(int i=0; i<S->len; i++)
{
printf("%d、Name:%s ",i+1 , S->Stu[i]->name);
printf("Sex:%c ", S->Stu[i]->sex);
printf("Age:%d ", S->Stu[i]->age);
printf("Id:%d\n", S->Stu[i]->id);
}
putchar(10);
}
//指定位置插入学生信息
void Stu_insert(stulist_ptr S)
{
int position;
//判断顺序表是否合法、已满
if(S == NULL || Stu_full(S))
{
printf("Error!\n");
return;
}
//输入指定插入位置
printf("Enter position(insert) ");
scanf("%d", &position);
//判断插入位置是否合法
if(position > S->len || position <= 0)
{
printf("Error!\n");
return;
}
//空出位置
for(int i=S->len-1; i>=position; i--)
S->Stu[i] = S->Stu[i-1];
//插入信息
printf("Please enter name: ");
scanf("%s", S->Stu[position-1]->name);
printf("Please enter sex: ");
scanf("%c", &S->Stu[position-1]->sex);
printf("Please enter age: ");
scanf("%d", &S->Stu[position-1]->age);
printf("Please enter id: ");
scanf("%d", &S->Stu[position-1]->id);
S->len++;
}
//删除指定位置学生信息
void Stu_delet(stulist_ptr S)
{
int position;
//判断顺序表是否合法、为空
if(S == NULL || Stu_empty(S))
{
printf("Error!\n");
return;
}
//输入指定删除位置
printf("Enter position(delet) ");
scanf("%d", &position);
//判断删除位置是否合法
if(position > S->len || position <= 0)
{
printf("Error!\n");
return;
}
//删除信息
for(int i=position-1; i<S->len; i++)
S->Stu[i] = S->Stu[i+1];
S->len--;
}
//修改指定位置学生信息
void Stu_change(stulist_ptr S)
{
int position;
//判断顺序表是否合法、为空
if(S == NULL || Stu_empty(S))
{
printf("Error!\n");
return;
}
//输入指定修改位置
printf("Enter position(change) ");
scanf("%d", &position);
//判断修改位置是否合法
if(position > S->len || position <= 0)
{
printf("Error!\n");
return;
}
//修改信息
printf("Please enter name: ");
scanf("%s", S->Stu[position-1]->name);
printf("Please enter sex: ");
scanf("%c", &S->Stu[position-1]->sex);
printf("Please enter age: ");
scanf("%d", &S->Stu[position-1]->age);
printf("Please enter id: ");
scanf("%d", &S->Stu[position-1]->id);
}
//按学号查找学生信息
void Stu_find(stulist_ptr S)
{
int num, flag = 0;
//判断顺序表是否合法、为空
if(S == NULL || Stu_empty(S))
{
printf("Error!\n");
return;
}
//输入查找的学号
printf("Enter StudentID: ");
scanf("%d", &num);
//打印学生信息
for(int i=0; i<S->len; i++)
{
if(S->Stu[i]->id == num)
{
flag = 1;
printf("%d、Name:%s ",i+1 , S->Stu[i]->name);
printf("Sex:%c ", S->Stu[i]->sex);
printf("Age:%d ", S->Stu[i]->age);
printf("Id:%d\n", S->Stu[i]->id);
}
}
if(flag == 0)
printf("Not found!\n");
}
//信息去重
void Stu_remove(stulist_ptr S)
{
//判断顺序表是否合法、为空
if(S == NULL || Stu_empty(S))
{
printf("Error!\n");
return;
}
//去重
for(int i=0; i<S->len; i++)
{
for(int j=i+1; j<S->len; j++)
{
if(S->Stu[i]->id == S->Stu[j]->id)
{
//删除重复数据
for(int k=j; k<S->len; k++)
S->Stu[k] = S->Stu[k+1];
S->len--;
j--;
}
}
}
}
//顺序表销毁
void Stu_destory(stulist_ptr S)
{
free(S->Stu);
free(S);
}
测试文件:
#include "work.h"
int main(int argc, const char *argv[])
{
int choice;
//创建顺序表
stulist_ptr S = Stu_create();
strcpy(S->Stu[0]->name, "Jack");
S->Stu[0]->sex = 'Y';
S->Stu[0]->age = 17;
S->Stu[0]->id = 1000;
S->len = 1;
printf("1、遍历数据\n");
printf("2、增加数据\n");
printf("3、插入数据\n");
printf("4、删除数据\n");
printf("5、修改数据\n");
printf("6、查找数据\n");
printf("7、数据去重\n");
printf("8、销毁\n");
printf("请输入选项 ");
scanf("%d", &choice);
switch(choice)
{
case 1: Stu_show(S);
break;
case 2: Stu_add(S);
Stu_show(S);
break;
case 3: Stu_insert(S);
Stu_show(S);
break;
case 4: Stu_delet(S);
Stu_show(S);
break;
case 5: Stu_change(S);
Stu_show(S);
break;
case 6: Stu_find(S);
break;
case 7: Stu_remove(S);
Stu_show(S);
break;
case 8: Stu_destory(S);
break;
default:printf("Error!\n");
break;
}
return 0;
}