数据结构0707作业

作业

搭建个场景:

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

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;
}

思维导图

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值