作业
今天学习的顺序表在写一遍
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