头文件seqlist.h:
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#define MAX 40 //定义顺序表的最大容量
typedef int datatype; //以整形为例,数据元素类型
//定义顺序表类型的基本格式
typedef struct
{
datatype data[MAX]; //存储数据元素的数组
int len; //存储当前顺序表的长度
}seqlist,*seqlist_ptr; //重命名为一个结构体变量,和一个指针类型
//创建顺序表
seqlist_ptr listCreate();
//判断空
int listEmpty(seqlist_ptr S);
//判断满
int listFULL(seqlist_ptr S);
//向顺序表中添加元素
int listAdd(seqlist_ptr S,datatype e);
//遍历顺序表
void listShow(seqlist_ptr S);
//任意位置插入元素
int listInsertByPos(seqlist_ptr S,int pos,datatype e);
//任意位置删除元素
//
//按位置进行修改
//
//按值进行修改
//
//查找指定位置的元素
//
//按值进行查找元素(找到return真,否则假)
int listSearchByValue(seqlist_ptr S,datatype e);
//将顺序表排序(使用选择排序,传一个flag,1升0降)
void listSort(seqlist_ptr S,int flag);
//将顺序表去重
//
//扩容
//
//求最值操作
datatype listMoValue(seqlist_ptr S,int flag);
//顺序表反转
void listReverse(seqlist_ptr S);
//顺序表释放
#endif
函数seqlist.c:
#include"seqlist.h"
#include
#include
#include
//创建顺序表
seqlist_ptr listCreate(){
//在堆区申请一个顺序表的空间大小
seqlist_ptr S = (seqlist_ptr)malloc(sizeof(seqlist));
//判断是否申请成功
if(NULL == S){
printf("顺序表创建失败\n");
return NULL;
}
//此时顺序表已经创建成功
memset(S->data,0,sizeof(S->data)); //清空数组
S->len = 0; //数组长度清零
printf("顺序表创建成功\n");
return S;
}
//判满,成功返回真,失败返回假
int listFULL(seqlist_ptr S){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
//合法,则返回是否已经满了
return S->len == MAX;
}
//判空,如果空返回真,非空返回假
int listEmpty(seqlist_ptr S){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
//合法返回是否空
return S->len == 0;
}
//向顺序表中添加元素
int listAdd(seqlist_ptr S,datatype e){
//判断逻辑
if(NULL == S||listFULL(S)){
printf("添加失败\n");
return 0;
}
//添加逻辑
S->data[S->len] = e;//将新元素放入最后一个位置
//表的变化
S->len++;
printf("添加成功\n");
return 1;
}
//遍历顺序表
void listShow(seqlist_ptr S){
//判断逻辑
if(NULL == S||listEmpty(S)){
printf("遍历失败\n");
return; //会报警告
}
//遍历顺序表
printf("当前顺序表的元素分别是:");
int i = 0;
for(i=0; ilen; i++){
printf("%d\t",S->data[i]);
}
putchar(10);
}
//任意位置插入元素
int listInsertByPos(seqlist_ptr S,int pos,datatype e){
//判断逻辑
if(NULL == S||listFULL(S)||pos<0||pos>S->len){
printf("插入失败\n");
return 0; //会报警告
}
//腾空过程
int i = 0;
for(i=S->len-1; i>=pos; i--){
S->data[i+1] = S->data[i]; //将当前元素后移
}
//插入逻辑
S->data[pos] = e; //将新元素放入要插入的位置
//表的变化
S->len++;
printf("插入成功\n");
// listShow(S);
return 1;
}
//按值进行查找元素(找到return真,否则假)
int listSearchByValue(seqlist_ptr S,datatype e){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
//遍历顺序表对比是否有与要找的元素相同的元素
for(int i=0; ilen; i++){
if(e == S->data[i]){
return 1; //找到就直接返回真
}
}
return 0; //如果整个for循环都执行完了,还没有跳出,说明遍历顺序表也没能找到要找的元素
//返回假,表示没找到。
}
//将顺序表排序(使用选择排序,传一个flag,1升0降)
void listSort(seqlist_ptr S,int flag){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return;
}
//选择排序
int i = 0;
int j = 0;
int index = 0;//定义记录下标的变量
datatype tmp = 0;//定义交换的中间变量
for(i=1; ilen; i++){ //控制交换的趟数
index = 0;
if(1 == flag){ //如果flag是1,表示升序排列
for(j=0; j<=S->len-i; j++){ //一直要比到data中的最后一个元素,即下表为len-1的元素,
//之后每次都可以少比较1个元素,但由于i是从1开始的,所以判断条件为<=len-i
if(S->data[index]data[j]){
index = j;//如果遍历到的元素比index对应的元素还大,就把更大的值的下标赋给index,以找到最大值的下标
}
}
if(index!=S->len-i){ //将得到的最大值,和最后一个元素交换位置,第二大的和倒数第二个
//元素交换位置,以此类推
tmp = S->data[index];
S->data[index] = S->data[S->len-i];
S->data[S->len-i] = tmp;
}
}else{//降序排列
for(j=0; j<=S->len-i; j++){ //一直要比到data中的最后一个元素,即下表为len-1的元素,
//之后每次都可以少比较1个元素,但由于i是从1开始的,所以判断条件为<=len-i
if(S->data[index]>S->data[j]){
index = j;//如果遍历到的元素比index对应的元素还小,就把更小的值的下标赋给index,以找到最小值的下标
}
}
if(index!=S->len-i){ //将得到的最小值,和最后一个元素交换位置,第二小的和倒数第二个
//元素交换位置,以此类推
tmp = S->data[index];
S->data[index] = S->data[S->len-i];
S->data[S->len-i] = tmp;
}
}
}
}
//求最值操作
datatype listMoValue(seqlist_ptr S,int flag){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
//求最值
datatype value = S->data[0]; //定义一个变量保存最值
int i = 0;
for(i=0; ilen; i++){
if(1 == flag){ //如果flag为1说明要求最大值,否则为最小值
if(value< S->data[i]){
value = S->data[i];
}
}else{
if(value> S->data[i]){
value = S->data[i];
}
}
}
if(1 == flag){
printf("最大值为:");
}else{
printf("最小值为:");
}
return value;
}
//顺序表反转
void listReverse(seqlist_ptr S){
//判断逻辑
if(NULL == S){
printf("所给顺序表不合法\n");
return;
}
int i = 0;
datatype tmp = 0;//定义一个中间变量
for(i=0; ilen/2; i++){ //交换次数为len/2次,比如,有4个元素,那么len正好等于4,交换2次,3个元素交换1次,3/2也是1
tmp = S->data[i];
S->data[i] = S->data[S->len-1-i];
S->data[S->len-1-i] = tmp;
}
}
测试:main.c:
#include"seqlist.h"
#include
int main(int argc, const char *argv[])
{
//申请一个顺序表
seqlist_ptr S = listCreate();
if(NULL == S){
return -1;
}
//调用添加函数
listAdd(S,3);
listAdd(S,8);
listAdd(S,2);
listAdd(S,4);
//调用遍历函数
listShow(S);
//定义插入元素,并赋值
datatype e = 0;
printf("请输入想要插入的元素:");
scanf("%d",&e);
//定义插入的位置
int pos = 0;
printf("请输入想要插入的位置:");
scanf("%d",&pos);
//调用插入函数
listInsertByPos(S,pos,e);
//调用遍历函数查看插入后效果
listShow(S);
//定义查找元素
datatype ts = 0;
printf("请输入想要查找的元素:");
scanf("%d",&ts);
//因为查找函数的返回值为1或0,直接在if判断语句中调用该函数
if(listSearchByValue(S,ts)){
printf("顺序表中成功找到该元素\n");
}else{
printf("顺序表中没有找到该元素\n");
}
//定义旗帜
int flag = 0;
printf("请输入想要的排序方式(1升0降):");
scanf("%d",&flag);
//调用排序函数
listSort(S,flag);
//调用遍历函数查看排序后效果
printf("升序排列后:\n");
listShow(S);
//定义最值的旗帜
int Mflag = 0;
printf("如果要求最大值请输入1,否则默认求最小值:");
scanf("%d",&Mflag);
//调用求最值函数
printf("%d\n",listMoValue(S,Mflag));
printf("反转后:\n");
//调用翻转函数
listReverse(S);
//调用遍历函数查看反转后效果
listShow(S);
return 0;
}
升序排列求最大值:
降序排列求最小值: