2024.11.28(作业)
思维导图
功能函数声明文件
#ifndef _FUN_H__
#define _FUN_H__
#include <myhead.h>
#define MAX 50 //数组大小
#define QAZ 20 //长度和字符串大小
typedef int datatype; //数据元素类型
//2.1 定义顺序表类型
typedef struct
{
datatype data[MAX];
int len;
}SeqList,*SeqList_ptr;
//2.2 创建顺序表
SeqList_ptr list_create();
//2.3 判断顺序表是否为空
int list_empty(SeqList_ptr S);
//2.4 判断顺序表是否满了
int list_full(SeqList_ptr S);
//2.5 向顺序表中添加元素
int list_add(SeqList_ptr S,datatype e);
//2.6 查看顺序表内容函数
void list_show(SeqList_ptr S);
//2.7 顺序表按任意位置进行插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e);
//2.8 顺序表按位置进行删除
int list_delete_pos(SeqList_ptr S,int pos);
//2.9 顺序表按值查找
int list_search_value(SeqList_ptr S,datatype e);
//2.10 顺序表按位置查找返回元素值
int List_search_position(SeqList_ptr S,int pos);
//2.11 顺序表按位置进行修改元素
int list_update_position(SeqList_ptr S,int pos,datatype e);
//2.12 顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e);
//2.13 顺序表排序
int list_sort(SeqList_ptr S);
//2.14 顺序表去重操作
int list_unique(SeqList_ptr S);
//2.15 顺序表翻转
int list_flip(SeqList_ptr S);
//2.16 获取顺序表的长度
int list_long(SeqList_ptr S);
//2.17 清空数组
int list_clear(SeqList_ptr S);
//2.18 销毁顺序表
int list_destroy(SeqList_ptr S);
#endif
功能函数
#include "fun.h"
//创建顺序表的定义
SeqList_ptr list_create()
{
//在堆区申请一个顺序表
SeqList_ptr S = (SeqList_ptr)malloc(sizeof(SeqList));
if(NULL == S)
{
printf("创建顺序表失败\n");
return NULL;
}
//程序执行至此,表示创建成功
//给顺序表进行初始化
bzero(S->data,sizeof(datatype)*MAX); //初始化数组
S->len = 0;
printf("顺序表创建成功\n");
return S;
}
//判断顺序表是否为空
int list_empty(SeqList_ptr S)
{
//判断传入的顺序表是否合法
if(NULL==S)
{
printf("非法顺序表\n");
return 0; //后续不能操作
}
//判断顺序表长度
return 0==S->len ? 1:0;
}
//判断顺序表是否满了
int list_full(SeqList_ptr S)
{
//判断传入的顺序表是否合法
if(NULL==S)
{
printf("非法顺序表\n");
return 1; //后续不能操作
}
//判断顺序表长度是否为最大长度
return S->len == MAX ? 1:0;
}
//向顺序表中添加元素
int list_add(SeqList_ptr S, datatype e)
{
//判断合法性
if(list_full(S))
{
printf("顺序表已满,添加失败\n");
return -1;
}
//添加逻辑
S->data[S->len] = e;
//表长变化
S->len++;
printf("添加成功\n");
return 0;
}
//查看顺序表内容函数
void list_show(SeqList_ptr S)
{
//判空
if(list_empty(S))
{
printf("查看失败\n");
return ;
}
//遍历整个顺序表
printf("当前顺序表中数据分别是:");
for(int i=0; i<S->len; i++)
{
printf("%d\t", S->data[i]);
}
printf("\n");
}
//顺序表按任意位置进行插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e)
{
//判断逻辑
if(pos > S->len||pos<0)
{
printf("该位置不可插入\n");
return -1;
}
//腾空逻辑
for(int i=S->len-1;i>=pos;i--)
{
S->data[i+1] = S->data[i];
}
//将数据放入顺序表
S->data[pos] = e;
//表长变化
S->len++;
printf("插入成功\n");
}
//顺序表按位置进行删除
int list_delete_pos(SeqList_ptr S,int pos)
{
//判断逻辑
if(list_empty(S)||pos > S->len||pos<0)
{
printf("该位置不可删除\n");
return -1;
}
//删除逻辑
for(int i=pos+1;i<S->len;i++)
{
S->data[i-1] = S->data[i];
}
//表长变化
S->len--;
printf("删除成功\n");
}
//顺序表按值查找
int list_search_value(SeqList_ptr S,datatype e)
{
//判断逻辑
if(list_empty(S))
{
printf("查找失败\n");
return -1;
}
//处理逻辑
for(int i=0;i<S->len;i++)
{
//判断是否跟任意一个元素相等
if(S->data[i] == e)
{
return i;
}
}
printf("查找成功\n");
return -1; //表示没找到
//表长变化
}
//2.10 顺序表按位置查找返回元素值
int List_search_position(SeqList_ptr S,int pos)
{
//判断逻辑
if(pos<0||pos>S->len)
{
printf("查找失败\n");
return -1;
}
//运行逻辑
printf("查找成功\n");
return S->data[pos];
}
//2.11 顺序表按位置进行修改元素
int list_update_position(SeqList_ptr S,int pos,datatype e)
{
//判断逻辑
if(list_empty(S)||pos<0||pos>S->len)
{
printf("修改失败\n");
return -1;
}
//运行逻辑
S->data[pos] = e;
printf("修改成功\n");
return 0;
}
//顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e)
{
//判断逻辑
//通过旧值查找旧值的位置
//程序执行至此,res表示就是要修改的值的位置//顺序表按值进行修改
//判断逻辑
if(list_empty(S))
{
printf("修改失败\n");
return -1;
}
//通过旧值查找旧值的位置
int res = list_search_value(S, old_e);
if(res == -1)
{
printf("更新失败\n");
return -1;
}
//程序执行 至此,res表示的就是要修改的值的下标
S->data[res] = new_e;
printf("修改成功\n");
return 0;
}
//2.13 顺序表排序
int list_sort(SeqList_ptr S)
{
//判断逻辑
if(list_empty(S))
{
printf("修改失败\n");
return -1;
}
for(int i=1;i<S->len;i++)
{
for(int j=0;j<S->len-i;j++)
{
if(S->data[j] >S->data[j+1])
{
datatype temp = S->data[j];
S->data[j] = S->data[j+1];
S->data[j+1] = temp;
}
}
}
printf("修改成功\n");
}
//顺序表去重操作
int list_unique(SeqList_ptr S)
{
//判断逻辑
if(list_empty(S) || S->len == 1)
{
printf("排序失败\n");
return -1;
}
//去重逻辑
for(int i=0;i<S->len;i++) //遍历所有的元素
{
//找到任意元素S->data[i]
for(int j=i+1;j<S->len;j++)
{
if(S->data[i] == S->data[j])
{
//说明有重复元素
list_delete_pos(S,j);
j--; //防止漏网之雨
}
}
}
printf("去重成功\n");
return 0;
}
//2.15 顺序表翻转
int list_flip(SeqList_ptr S)
{
//判断逻辑
if(list_empty(S) || S->len == 1)
{
printf("翻转失败\n");
return -1;
}
//翻转逻辑
for(int i=0;i<S->len/2;i++)
{
datatype temp = S->data[i];
S->data[i] = S->data[S->len-1-i];
S->data[S->len-1-i] = temp;
}
printf("翻转失败\n");
return 0;
}
//2.16 获取顺序表的长度
int list_long(SeqList_ptr S)
{
return S->len;
}
//2.17 清空数组
int list_clear(SeqList_ptr S)
{
bzero(S->data,sizeof(datatype)*MAX); //初始化数组
S->len = 0;
return -1;
}
//2.18 销毁顺序表
int list_destroy(SeqList_ptr S)
{
if(NULL == S)
{
free(S);
S = NULL;
}
printf("销毁成功\n");
return 0;
}
主函数文件
#include "fun.h"
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义一个顺序表指针,调用创建函数
SeqList_ptr S = list_create();
if(NULL==S)
{
return -1;
}
//顺序表后续操作
//调用添加数据操作
list_add(S,3);
list_add(S,7);
list_add(S,2);
list_add(S,5);
//调用遍历函数
list_show(S);
//顺序表按任意位置进行插入操作
list_insert_pos(S,2,89);
list_show(S);
//顺序表按位置进行删除
list_delete_pos(S,2);
list_show(S);
//添加元素
list_add(S,666);
list_add(S,666);
list_add(S,666);
list_add(S,666);
//去重
list_unique(S);
list_show(S);
//排序
list_sort(S);
list_show(S);
//翻转
list_flip(S);
list_show(S);
//清空数组
list_clear(S);
//销毁
list_destroy(S);
return 0;
}