seqlist.h文件代码
#ifndef __SEQLIST_H
#define __SEQLIST_H
#define Max 20 //数组最大容量
typedef int datatype; //类型重定义
//定义顺序类型
typedef struct
{
datatype data[Max]; //存储顺序表的数组
int len; //顺序表长度
}seqList;
//创建顺序表
seqList *list_create(); //声明
//判空
int list_empty(seqList *L);
//判满
int list_full(seqList *L);
//添加元素
int list_add(seqList *L,datatype e);
//遍历
void list_show(seqList *L);
//任意位置插入
int list_insert_pos(seqList *L,int pos,datatype e);
//任意位置删除
int list_delete_pos(seqList *L,int pos);
//按位置修改
int list_update_pos(seqList *L,int pos,datatype new_e);
//按值修改
int list_update_value(seqList *L,datatype e,datatype new_e);
//按位置查找
int list_search_pos(seqList *L,int pos);
//按值查找
int list_search_value(seqList *L,datatype e);
//排序
int list_sort(seqList *L);
//最值
int list_max(seqList *L);
int list_min(seqList *L);
//去重
int list_rdup(seqList *L);
//销毁
void list_free(seqList *L);
#endif
seqlist.c文件代码
#include"seqlist.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//创建顺序表
seqList *list_create()
{
//在堆区申请一个顺序表大小的空间
//将该空间的起始地址赋值给指针变量会报错
seqList *L = (seqList *)malloc(sizeof(seqList));
if(NULL == L)
{
printf("申请失败\n");
return NULL;
}
//给顺序表初始化
L->len = 0;
//给数组初始化
memset(L,0,sizeof(datatype)*Max); //初始化为0,如果不初始化就是任意值,都可以
printf("申请成功\n");
return L; //将申请好的顺序表返回
}
//判空
int list_empty(seqList *L)
{
return L->len==0 ?1:0; //1表示空0表示非空
}
//判满
int list_full(seqList *L)
{
return L->len==Max ? 1:0; //1表示满0表示非满
}
//添加元素
int list_add(seqList *L,datatype e)
{
//判断逻辑
if(list_full(L))
{
printf("表满,添加失败\n");
return 0;
}
//添加逻辑
L->data[L->len] = e;
//表的变化
L->len++;
printf("添加成功\n");
return 1;
}
//遍历
void list_show(seqList *L)
{
//判断逻辑
if(NULL==L||list_empty(L))
{
printf("遍历失败\n");
return;
}
//遍历逻辑
printf("此时顺序表的元素分别是:");
for(int i=0;i<L->len;i++)
{
printf("%-4d",L->data[i]);
}
printf("\n");
}
//任意位置插入
int list_insert_pos(seqList *L,int pos,datatype e)
{
//判断逻辑
if(list_full(L)||pos<0||pos>L->len)
{
printf("插入失败\n");
return 0;
}
//腾空过程
for(int i=L->len-1;i>=pos;i--)
{
L->data[i+1]=L->data[i]; //循环当前的元素放到后一个元素中
}
//插入数据
L->data[pos] = e;
//表长变化
L->len++;
printf("插入成功\n");
return 1;
}
//任意位置删除
int list_delete_pos(seqList *L,int pos)
{
//判断逻辑
if(list_empty(L)||pos<0||pos>=L->len)
{
printf("删除失败\n");
return 0;
}
//移动逻辑
for(int i=pos;i<L->len;i++)
{
L->data[i]=L->data[i+1]; //将当前元素向前移动一位
}
//表的变化
L->len--;
printf("删除成功\n");
return 1;
}
//按位置修改
int list_update_pos(seqList *L,int pos,datatype new_e)
{
//判断逻辑
if(list_empty(L)||pos<0||pos>=L->len)
{
printf("修改失败\n");
return 0;
}
//更新逻辑
L->data[pos]=new_e;
printf("修改成功\n");
return 1;
}
//按值修改
int list_update_value(seqList *L,datatype e,datatype new_e)
{
//判断逻辑
if(list_empty(L))
{
printf("修改失败\n");
return -2;
}
//查找并更新逻辑
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e)
{
L->data[i]=new_e;
printf("修改成功\n");
return 1;
}
else
{
printf("输入的数不存在,无法修改\n");
return -1;
}
}
}
//按位置查找
int list_search_pos(seqList *L,int pos)
{
//判断逻辑
if(list_empty(L)||pos<0||pos>=L->len)
{
printf("查找失败\n");
return 0;
}
//查找逻辑
for(int i=0;i<L->len;i++)
{
if(i==pos) //查找成功
return L->data[pos-1];
}
}
//按值查找
int list_search_value(seqList *L,datatype e)
{
//判断逻辑
if(list_empty(L))
{
printf("查找失败\n");
return -2;
}
//查找逻辑
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e) //查找成功
return i;
}
return -1; //没找到返回-1
}
//排序
int list_sort(seqList *L)
{
if(list_empty(L))
{
printf("该数组为空,无法排序\n");
return 0;
}
for(int i=0;i<L->len-1;i++)
{
for(int j=i;j<L->len-i-1;j++)
{
if(L->data[j+1]<L->data[j])
{
int temp=L->data[j];
L->data[j]=L->data[j+1];
L->data[j+1]=temp;
}
}
}
printf("排序完成\n");
return 1;
}
//最大值
int list_max(seqList *L)
{
if(list_empty(L))
{
printf("该数组为空,无最大值\n");
return 0;
}
int max=L->data[0];
for(int i=0;i<L->len-1;i++)
{
if(L->data[i]<L->data[i+1])
{
max = L->data[i+1];
}
}
return max;
}
//最小值
int list_min(seqList *L)
{
if(list_empty(L))
{
printf("该数组为空,为最小值\n");
return 0;
}
int min = L->data[0];
for(int j=0;j<L->len-1;j++)
{
if(L->data[j]>L->data[j+1])
{
min =L->data[j+1];
}
}
return min;
}
//去重
int list_rdup(seqList *L)
{
//判断逻辑
if(list_empty(L)||L->len==1)
{
printf("无法去重\n");
}
//去重逻辑
for(int i=0;i<L->len-1;i++)
{
for(int j=i+1;j<L->len-1;j++)
{
if(L->data[i]==L->data[j]) //循环查找重复的元素
{
for(int k=j;k<L->len;k++)
{
L->data[k]=L->data[k+1];
}
L->len--; //去重成功1次,长度减1
}
}
}
return 1;
}
//销毁
void list_free(seqList *L)
{
if(L!=NULL)
{
free(L);
L=NULL;
printf("销毁成功");
}
}
main主函数代码
#include"seqlist.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
//调用创建函数创建一个顺序表
seqList *L = list_create();
if(NULL==L)
{
return -1;
}
//调用添加函数
list_add(L,3);
list_add(L,8);
list_add(L,2);
list_add(L,4);
list_add(L,4);
list_add(L,2);
//调用遍历函数
list_show(L);
//调用位置插入函数
list_insert_pos(L,1,9);
list_show(L);
//调用删除函数
list_delete_pos(L,1);
list_show(L);
//调用按位置修改函数
list_update_pos(L,1,1);
list_show(L);
//调用按值修改函数
list_update_value(L,3,9);
list_show(L);
//调用按值查找函数
int pos=list_search_value(L,2);
if(pos>=0)
{
printf("想要查找的值在第%d的位置\n",pos+1);
}
else
{
printf("查找失败\n");
}
//调用按位置查找函数
int i=list_search_pos(L,3);
if(pos>=0)
{
printf("想要查找的位置的值是%d\n",i);
}
//调用排序函数
list_sort(L);
list_show(L);
//调用最大值函数
int m=list_max(L);
printf("顺序表的最大值为%d\n",m);
//调用最小值函数
int n=list_min(L);
printf("顺序表的最小值为%d\n",n);
//调用去重函数
list_rdup(L);
list_show(L);
//调用销毁函数
list_free(L);
L=NULL;
list_show(L);
return 0;
}
运行结果: