数据库DAY3-顺序表

作业

今天学习的顺序表在写一遍

1>顺序表按元素修改 2>顺序表空间释放 3>顺序表排序

main.c

#include "head.h"
 
int main(int argc, const char *argv[])
{
    seqlist *list = Create();
 
    // 在顺序表尾部插入
    int n = 0;
    datetype e = 0; // e表示插入的值
    printf("请输入输入的个数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        printf("请输入要插入的值:");
        scanf("%d", &e);
        insert_rear(list, e); // 在尾部插入需要顺序表和插入的值做参数
    }
 
    Out(list);
 
    // 在尾部删除
    printf("\n删除后的数据\n");
    delete_rear(list);
    delete_rear(list);
    delete_rear(list);
    Out(list);
 
    // 按下标查找
    int sub = 0;
    printf("请输入要查找的下表:");
    scanf("%d", &sub);
    search(list, sub);
 
    // 按下标修改
    printf("\n请输入要修改的下标:");
    scanf("%d", &sub);
    printf("请输入要修改的值:");
    scanf("%d", &e);
    int flag = update(list, e, sub);
    if (flag == 0)
        Out(list);
 
    // 按下标插入
    printf("请输入要插入的下标:");
    scanf("%d", &sub);
    printf("请输入要插入的值:");
    scanf("%d", &e);
    flag = insert_by_sub(list, sub, e);
    if (flag == 0)
    {
        Out(list);
    }
 
    // 按下标删除
    printf("请输入要删除的下标:");
    scanf("%d", &sub);
    flag = delete_by_sub(list, sub);
    if (flag == 0)
    {
        Out(list);
    }
 
    // 表按元素查找
    datetype key;
    printf("请输入想要查找的元素:");
    scanf("%d", &key);
    flag = search_by_key(list, key);
    if (flag == -1)
    {
        printf("查找的元素不存在\n");
    }
    else
    {
        printf("查找的元素所在下标在%d\n", flag);
    }
 
    // 按元素删除
    printf("请输入要删除的元素:");
    scanf("%d", &key);
    flag = delete_by_key(list, key);
    if (flag == -1)
    {
        printf("按元素删除失败\n");
    }
    else
    {
        Out(list);
    }
 
    // 按元素修改
    printf("请输入要修改的元素:");
    scanf("%d", &e);
    printf("请输入要替换的元素:");
    scanf("%d", &key);
    flag = Xiugai(list, e, key);
    if (flag == -1)
    {
        printf("元素修改失败\n");
    }
    else
    {
        Out(list);
    }
 
    //顺序表排序
    Bubble(list);
    printf("\n");
    Out(list);
 
    //顺序表释放
    list=Free(list);
 
    return 0;
}

test.c

#include "head.h"
 
// 在堆区创建顺序表
seqlist *Create()
{
    // 在堆区创建了一个顺序表
    seqlist *list = (seqlist *)malloc(sizeof(seqlist));
    if (list == NULL)
    {
        return NULL;
    }
 
    list->len = 0; // 表示顺序表为空
    return list;
}
 
// 判断顺序表是否为满
int full_seqlist(seqlist *list) // 判断顺序表是否为满
{
    // 满了返回-1,否则返回0
    return list->len == MAXISZE ? -1 : 0;
}
 
// 插入
void insert_rear(seqlist *list, datetype e)
{
    // 1.判断顺序表是否为满
    if (full_seqlist(list))
    {
        printf("顺序表已满,插入失败\n");
        return; // 结束函数不在向下执行
    }
    // 2.不满的花在尾部插入
    list->date[list->len] = e;
    list->len++;
}
 
// 判断顺序表是否为空
int empty_seqlist(seqlist *list) // 判断顺序表是否为空
{
    // 为空返回0,不为空返回-1
    return list->len == 0 ? -1 : 0;
}
 
// 删除
int delete_rear(seqlist *list)
{
    // 判断顺序表是否为空
    if (empty_seqlist(list))
    {
        printf("顺序表为空,删除失败\n");
        return -1;
    }
    // 删除尾部
    list->len--;
    return 0;
}
 
// 输出
void Out(seqlist *list)
{
    for (int i = 0; i < list->len; i++)
    {
        printf("%d\n", list->date[i]);
    }
}
 
// 查找
int search(seqlist *list, int sub)
{
    // 1.判断顺序表是否为空
    // 2.判断顺序表下表是否合法
    if (empty_seqlist(list) || sub < 0 || sub > list->len)
    {
        printf("查找失败\n");
        return -1;
    }
    // 3.查找sub对应的值
    printf("%d\n", list->date[sub]);
    return 0;
}
 
// 修改
int update(seqlist *list, int e, int sub)
{
    // 1.判断顺序表书否为空
    // 2.判断顺序表下表是否合法
    if (empty_seqlist(list) || sub < 0 || sub >= list->len)
    {
        printf("修改失败\n");
        return -1;
    }
    // 3.按下标直接复制
    list->date[sub] = e;
    return 0;
}
 
int insert_by_sub(seqlist *list, int sub, int e)
{
    // 1.判断顺序表是否为满
    // 2.判断顺序表下表是否合法
    if (full_seqlist(list) || sub < 0 || sub > list->len)
    {
        printf("插入失败\n");
        return -1;
    }
 
    // 3.循环后移
    for (int i = list->len - 1; i >= sub; i--)
    {
        list->date[i + 1] = list->date[i];
    }
    // 4.插入值
    list->date[sub] = e;
    list->len++;
 
    return 0;
}
 
int delete_by_sub(seqlist *list, int sub)
{
    // 1.判断顺序表是否为空
    // 2.判断顺序表下表是否合法
    if (empty_seqlist(list) || sub < 0 || sub >= list->len)
    {
        printf("删除失败\n");
        return -1;
    }
 
    // 循环前移
    for (int i = sub; i < sub; i++)
    {
        list->date[i] = list->date[i + 1];
    }
 
    // 顺序表长度自检
    list->len--;
    return 0;
}
 
int search_by_key(seqlist *list, datetype key)
{
    for (int i = 0; i < list->len; i++)
    {
        if (list->date[i] == key)
        {
            return i;
        }
    }
 
    return -1;
}
 
int delete_by_key(seqlist *list, datetype key)
{
    int sub = search_by_key(list, key);
    {
        if (sub == -1)
        {
            printf("要删除的元素不不存在\n");
            return -1;
        }
 
        int flag = delete_by_sub(list, sub);
        if (flag == -1)
        {
            printf("按元素删除失败\n");
            return -1;
        }
 
        return 0;
    }
}
 
int Xiugai(seqlist *list, datetype e, datetype key)
{
    //1.先找到ke对应的下标
    int sub = search_by_key(list, e);
    if (sub == -1)
    {
        printf("未查找到要修改的元素\n");
        return -1;
    }

    //2.根据下标修改
    int flag = update(list, key, sub);
    if (flag == -1)
    {
        printf("元素修改失败\n");
        return -1;
    }
 
    return 0;
}
 
void Bubble(seqlist *list)
{
    for (int i = 0; i < list->len - 1; i++)
    {
        for (int j = 0; j < list->len - i - 1; j++)
        {
            if (list->date[j] > list->date[j + 1])
            {
                datetype t;
                t = list->date[j];
                list->date[j] = list->date[j + 1];
                list->date[j + 1] = t;
            }
        }
    }
}
 
seqlist *Free(seqlist *list)
{
    if(list!=NULL)
    {
        free(list);
        list==NULL;
    }
 
    return list;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef int datetype; //把int起别名

#define MAXISZE 9  //线性表长度:不变

typedef struct 
{   
    //数据元素整数
    datetype date[MAXISZE];

    //顺序表长度
    int len;

}seqlist;

seqlist *Create();
void insert_rear(seqlist *list,datetype e);
int full_seqlist(seqlist *list);
void insert_rear(seqlist *list,datetype e);
int empty_seqlist(seqlist *list);
int delete_rear(seqlist *list);
void Out(seqlist *list);
int search(seqlist *list,int sub);
int insert_by_sub(seqlist *list, int sub, int e);
int delete_by_sub(seqlist *list,int sub);
int search_by_key(seqlist *list,datetype key);
int delete_by_key(seqlist *list,datetype key);
int Xiugai(seqlist *list,datetype e,datetype key);
void Bubble(seqlist *list);
seqlist *Free(seqlist *list);

#include "test.c"
#endif