1128作业
思维导图
作业
main.c
#include <myhead.h>
#include"seqlist.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,8);
list_add(S,2);
list_add(S,4);
//调用遍历函数
list_show(S);
//调用任意位置插入函数
list_insert_pos(S,2,520);
list_show(S);
list_insert_pos(S,2,1314);
list_show(S);
//调用删除函数
//删除第一个元素
//删除最后一个元素
//删除任意一个元素
list_delete_pos(S,0);
list_show(S);
list_delete_pos(S,S->len-1);
list_show(S);
list_delete_pos(S,2);
list_show(S);
//调用按值查找位置函数
printf("该元素位置在:%d\n",list_search_value(S,1314));
//调用按位置查找元素的值函数
printf("该位置的元素的值为:%d\n",list_search_pos(S,2));
//调用顺序表按位置进行修改
list_update_pos(S,888,1);
list_show(S);
//调用按值进行修改函数
list_update_value(S,888,10);
list_show(S);
//调用排序函数
list_sort(S);
list_show(S);
//调用去重函数
list_unique(S);
list_show(S);
//调用顺序表反转函数
list_reverse(S);
list_show(S);
//调用输出顺序表长度函数
printf("该顺序表的长度为:%d\n",list_long(S));
//调用清空数组函数
list_empty_all(S);
list_show(S);
//销毁顺序表
list_destroy(S);
list_show(S);
return 0;
}
源文件
#include <myhead.h>
#include"seqlist.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; //数据表长度为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 0; //后续不能操作
}
//判断顺序表长度是否为最大长度
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) || NULL==S)
{
printf("查看失败\n");
return ;
}
//遍历整个顺序表
printf("当前循序表中的数据分别是:");
for(int i=0;i<S->len;i++)
{
printf("%d\t",S->data[i]);
}
putchar(10);
}
//顺序表按任意位置进行插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e)
{
//判断逻辑
if(pos<0 || pos>S->len || list_full(S))
{
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");
return 0;
}
//顺序表按任意位置删除操作
int list_delete_pos(SeqList_ptr S,int pos)
{
//判断逻辑
if(list_full(S) || pos<0 || pos>=S->len)
{
printf("删除失败\n");
return -1;
}
//删除逻辑
for(int i=pos+1;i<S->len;i++)
{
S->data[i-1] = S->data[i];
}
//表长变化
S->len--;
printf("删除成功\n");
return 0;
}
//顺序表按值查找返回位置
int list_search_value(SeqList_ptr S,datatype e)
{
//判断逻辑
if(list_full(S))
{
printf("查找失败\n");
return -1;
}
//处理逻辑
for(int i=0;i<S->len;i++)
{
//判断是否跟任意一个元素相等
if(S->data[i]==e)
{
return i;
}
}
printf("查找失败\n");
return -1; //表示没找到
}
//顺序表按位置查找元素的值
int list_search_pos(SeqList_ptr S,int pos)
{
//判断逻辑
if(list_full(S))
{
printf("查找失败\n");
return -1;
}
//处理逻辑
printf("查找成功\n");
return S->data[pos];
}
//顺序表按位置进行修改
int list_update_pos(SeqList_ptr S,datatype new_e,int pos)
{
//判断逻辑
if(list_empty(S))
{
printf("修改失败\n");
return -1;
}
//通过位置查找元素进行替换
S->data[pos] = new_e;
printf("更新成功\n");
return 0;
}
//顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e)
{
//判断逻辑
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;
}
//顺序表排序
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");
return 0;
}
//顺序表去重操作
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++) //遍历 S->data[i]后的元素
{
if(S->data[i] == S->data[j])
{
//说明有重复元素
list_delete_pos(S,j);//按位置删除下标j的元素
j--; //防止连续重复数据导致的漏删
}
}
}
printf("去重成功\n");
return 0;
}
//顺序表反转
void list_reverse(SeqList_ptr S)
{
//判断逻辑
if(list_empty(S))
{
printf("反转失败\n");
return ;
}
//反转逻辑
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");
}
//获取顺序表的长度
int list_long(SeqList_ptr S)
{
return S->len;
}
//清空数组
int list_empty_all(SeqList_ptr S)
{
memset(S->data,0,sizeof(datatype));
S->len = 0;
printf("已经清空\n");
}
//顺序表销毁
void list_destroy(SeqList_ptr S)
{
if(NULL!=S)
{
//销毁顺序表
free(S);
S = NULL;
}
printf("销毁成功\n");
}
头文件
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAX 100 //宏定义顺序表最大长度
typedef int datatype; //数据元素类型
//定义顺序表类型
typedef struct
{
datatype data[MAX]; //存储数据表的数组容器
int len;//存储顺序表的长度
}SeqList,*SeqList_ptr;
//创建顺序表
SeqList_ptr list_create();
//判断顺序表是否为空
int list_empty(SeqList_ptr S);
//判断顺序表是否为满
int list_full(SeqList_ptr S);
//向顺序表中添加元素
int list_add(SeqList_ptr S,datatype e);
//查看顺序表内容函数
void list_show(SeqList_ptr S);
//顺序表按任意位置插入操作
int list_insert_pos(SeqList_ptr S,int pos,datatype e);
//顺序表按任意位置删除操作
int list_delete_pos(SeqList_ptr S,int pos);
//顺序表按值查找返回位置
int list_search_value(SeqList_ptr S,datatype e);
//顺序表按位置查找元素的值
int list_search_pos(SeqList_ptr S,datatype e);
//顺序表按位置进行修改
int list_update_pos(SeqList_ptr S,datatype new_e,int pos);
//顺序表按值进行修改
int list_update_value(SeqList_ptr S,datatype old_e,datatype new_e);
//顺序表排序
int list_sort(SeqList_ptr S);
//顺序表去重操作
int list_unique(SeqList_ptr S);
//顺序表反转
void list_reverse(SeqList_ptr S);
//获取顺序表的长度
int list_long(SeqList_ptr S);
//清空数组
int list_empty_all(SeqList_ptr S);
//顺序表销毁
void list_destroy(SeqList_ptr S);
#endif