作业需求如下:
完成顺序表的按值修改、按位置查找、排序、最值、去重
实现过程如下:
seqlist.h文件实现函数申明:
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAX 20 //数组的最大容量
typedef int datatype; //类型重定义
//定义顺序表类型
typedef struct
{
datatype data[MAX]; //顺序表的最大容量
int len; //顺序表的长度
}seqlist;
//函数声明
//创建顺序表
seqlist *list_creat();
//判空
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(seqlist *L,int pos,datatype e);
//任意位置删除
int list_delete(seqlist *L,int pos);
//按位置修改
int list_revise(seqlist *L,int pos,datatype e);
//按值修改
int list_update_value(seqlist *L,datatype e,datatype i);
//按位置查找
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_delete_repeat(seqlist *L);
//销毁
void list_free(seqlist *L);
#endif
seqlist.c文件实现函数的封装:
#include"seqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
seqlist *list_creat()
{
seqlist *L=(seqlist *)malloc(sizeof(seqlist));
if(NULL == L)
{
printf("创建失败");
return NULL;
}
//给顺序表初始化
L->len=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)==1)
{
printf("顺序表已满");
return 0;
}
L->data[L->len]=e;
L->len++;
printf("添加成功\n");
return 0;
}
void list_show(seqlist *L)
{
if(NULL==L || list_empty(L)==1)
{
printf("顺序表为空\n");
return;
}
for(int i=0;i<L->len;i++)
{
printf("%d\t",L->data[i]);
}
printf("\n");
}
//从任意位置插入
int list_insert(seqlist *L,int pos,datatype e)
{
//判断是否为空
if(list_full(L)==1 || pos<0 || pos>L->len)
{
printf("插入失败\n");
}
//腾空过程
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(seqlist *L,int pos)
{
//判断逻辑
if(list_empty(L)==1 || 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_revise(seqlist *L,int pos,datatype e)
{
//判断顺序表是否为空
if(list_empty(L)==1 || pos<0 || pos>=L->len)
{
printf("修改失败\n");
return 0;
}
//查找位置并修改值
L->data[pos]=e;
printf("修改成功\n");
return 1;
}
//按值查找
int list_search_value(seqlist *L,datatype e)
{
//判断函数是否为空
if(list_empty(L)==1)
{
printf("查找失败\n");
return -2;
}
//遍历一遍顺序表,看是否有这个值
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e)
{
return i;
}
}
return -1;//失败没有找到
}
//按值修改
int list_update_value(seqlist *L,datatype e,datatype k)
{
//判断是否为空
if(list_empty(L)==1)
{
printf("修改失败\n");
return -2;
}
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e)
{
L->data[i]=k;
}
}
printf("按值修改成功\n");
return -1;
}
//按位置查找
int list_search_pos(seqlist *L,int pos)
{
if(list_empty(L)==1 || pos<0 || pos>=L->len)
{
printf("查找错误\n");
return -2;
}
for(int i=0;i<L->len;i++)
{
if(i==pos)
{
return L->data[i];
}
}
}
//升序排序
int list_sort(seqlist *L)
{
if(list_empty(L)==1)
{
printf("排序失败\n");
return -2;
}
for(int i=1;i<L->len;i++)
{
for(int j=0;j<L->len-i;j++)
{
if(L->data[j]>L->data[j+1])
{
//使用异或对值换位置
L->data[j]=L->data[j]^L->data[j+1];
L->data[j+1]=L->data[j]^L->data[j+1];
L->data[j]=L->data[j]^L->data[j+1];
}
}
}
return -1;
}
//求最大值
int list_max(seqlist *L)
{
if(list_empty(L)==1)
{
printf("排序失败\n");
return -2;
}
static int max;
max=L->data[0];
for(int i=0;i<L->len;i++)
{
if(max<L->data[i])
{
max=L->data[i];
}
}
return max;
}
//去重
int list_delete_repeat(seqlist *L)
{
if(list_empty(L)==1)
{
printf("排序失败\n");
return -1;
}
int k=0;
for(int i=0;i<L->len;i++)
{
for(int j=i;j<L->len;j++)
{
if(L->data[j]==L->data[i] && j!=i)
{
for(k=j;k<L->len+1;k++)
{
L->data[k]=L->data[k+1];
L->len--;
}
}
}
}
return 1;
}
//销毁
void list_free(seqlist *L)
{
if(L != NULL)
{
free(L);
L=NULL;
printf("销毁成功\n");
}
}
main.c文件实现要求:
#include"seqlist.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
//调用创建函数创建一个顺序表
seqlist *p=list_creat();
if(NULL==p)
{
return -1;
}
//添加函数
list_add(p,3);
list_add(p,4);
list_add(p,5);
list_add(p,6);
//调用遍历函数
list_show(p);
//调用按位置插入函数
list_insert(p,1,8);
list_show(p);
//调用删除函数
list_delete(p,3);
list_show(p);
//调用按位置修改函数
list_revise(p,2,10);
list_show(p);
//调用按值查找函数
int pos=list_search_value(p,8);
if(pos>=0)
{
printf("8所在的位置是:%d\n",pos+1);
}
else
{
printf("查找失败\n");
}
//按值修改
list_update_value(p,6,5);
list_show(p);
printf("按位置顺序表下表为2查找的值是:%d\n",list_search_pos(p,2));
//升序排序
printf("升序排序为:");
list_sort(p);
list_show(p);
printf("最大值为:%d\n",list_max(p));
list_add(p,8);
list_add(p,5);
list_add(p,3);
list_show(p);
list_delete_repeat(p);
printf("去重后的结果为:");
list_show(p);
list_free(p);
p=NULL;
list_show(p);
return 0;
}
运行结果:
创建成功
添加成功
添加成功
添加成功
添加成功
3 4 5 6
插入成功
3 8 4 5 6
删除成功
3 8 4 6
修改成功
3 8 10 6
8所在的位置是:2
按值修改成功
3 8 10 5
按位置顺序表下表为2查找的值是:10
升序排序为:3 5 8 10
最大值为:10
添加成功
添加成功
添加成功
3 5 8 10 8 5 3
去重后的结果为:3 5 8 10
销毁成功
顺序表为空