main.c:
#include "head.h"
int main(int argc, const char *argv[])
{
int n,e;
//创建顺序表
seqlist *l = create();
printf("请输入你要插入的数据个数:");
scanf("%d",&n);
for(int i = 0;i<n;i++){
printf("请输入你要插入的数据:");
scanf("%d",&e);
//顺序表的尾插
insert_rear(e,l);
}
//输出
output(l);
//顺序表的尾删
delete_rear(l);
output(l);
//顺序表的判满
int len = full(l);
if(len==1)
printf("顺序表已满\n");
else if(len==0)
printf("顺序表未满\n");
len = empty(l);
if(len==1)
printf("顺序表为空\n");
else if(len==0)
printf("顺序表不为空\n");
//顺序表按下标插入
printf("请输入插入位置:");
scanf("%d",&n);
printf("请输入插入元素:");
scanf("%d",&e);
insert_sub(l,n,e);
output(l);
printf("请输入删除元素位置:");
scanf("%d",&n);
//顺序表按下标删除
delete_sub(l,n);
output(l);
//顺序表按下标修改
printf("请输入修改位置:");
scanf("%d",&n);
printf("请输入修改元素:");
scanf("%d",&e);
update_sub(l,n,e);
output(l);
//顺序表按下标查找
printf("请输入查找位置:");
scanf("%d",&n);
n = find_sub(l,n);
printf("该位置元素为:%d\n",n);
//顺序表按元素插入
printf("请输入查找元素:");
scanf("%d",&n);
printf("请输入插入元素:");
scanf("%d",&e);
insert_data(l,n,e);
output(l);
//顺序表按元素删除
printf("请输入删除元素:");
scanf("%d",&n);
delete_data(l,n);
//顺序表按元素修改
printf("请输入修改元素:");
scanf("%d",&n);
printf("请输入修改值:");
scanf("%d",&e);
update_data(l,n,e);
//冒泡升序
bubble(l);
output(l);
//顺序表去重
delete_re(l);
l = free_space(l);
l = NULL;
return 0;
}
test.c:
#include "head.h"
/*
* function: 顺序表堆空间的创建
* @param [ in]
* @param [out]
* @return 失败返回NULL,成功返回顺序表指针
*/
seqlist *create()
{
seqlist *list = (seqlist *)malloc(sizeof(struct Seq));
//判断是否创建成功
if(list==NULL)
return NULL;
//初始化顺序表
list->len = 0;
return list;
}
/*
* function: 顺序表的尾部插入
* @param [ in] 待插数据 顺序表
* @param [out]
* @return 无
*/
void insert_rear(datatype e,seqlist *l)
{
//判断创建成功或顺序表满
if(l->len==MAXSIZE||l==NULL){
printf("插入失败\n");
return ;
}
//插入
l->data[l->len] = e;
l->len++;
}
/*
* function: 顺序表的遍历
* @param [ in] 顺序表
* @param [out]
* @return 无
*/
void output(seqlist *l)
{
//判断创建成功或顺序表空
if(l==NULL||l->len==0){
puts("顺序表为空\n");
return ;
}
//循环遍历
for(int i = 0;i<l->len;i++){
printf("%d\t",l->data[i]);
}
puts(" ");
}
/*
* function: 顺序表的尾部删除
* @param [ in] 顺序表
* @param [out]
* @return 无
*/
void delete_rear(seqlist *l)
{
//判断创建成功或顺序表空
if(l==NULL||l->len==0){
printf("删除失败\n");
return ;
}
//删除
printf("被删除的元素是:%d\n",l->data[l->len]);
l->len--;
}
/*
* function: 顺序表的判满
* @param [ in] 顺序表
* @param [out]
* @return 满返回1,不满返回0
*/
int full(seqlist *l){
return l->len==MAXSIZE?1:0;
}
/*
* function: 顺序表的判空
* @param [ in] 顺序表
* @param [out]
* @return 空返回1,不空返回0
*/
int empty(seqlist *l){
return l->len==0?1:0;
}
/*
* function: 顺序表的按下标插入
* @param [ in] 顺序表 位置 插入元素
* @param [out]
* @return 无
*/
void insert_sub(seqlist *l,int sub,datatype e)
{
//判断创建成功或顺序表满
//判断下标是否合法
if(l==NULL||l->len==MAXSIZE||sub<0||sub>MAXSIZE){
printf("插入失败\n");
return ;
}
//插入
//循环后移
for(int i = l->len-1;i>=sub;i--){
l->data[i+1] = l->data[i];//后移
}
//插入
l->data[sub]=e;
l->len++;
}
/*
* function: 顺序表按下标删除
* @param [ in] 顺序表 删除位置
* @param [out]
* @return 无
*/
void delete_sub(seqlist *l,int sub)
{
//判断创建成功或顺序表空
//判断下标是否合法
if(l==NULL||l->len==0||sub<0||sub>MAXSIZE){
printf("删除失败\n");
return ;
}
//删除
//循环前移
for(int i = sub+1;i<l->len;i++){
l->data[i-1]=l->data[i];//前移
}
l->len--;
}
/*
* function: 顺序表按下标修改
* @param [ in] 顺序表 修改位置 修改元素
* @param [out]
* @return 无
*/
void update_sub(seqlist *l,int sub,datatype e)
{
//判断创建成功或顺序表空
//判断下标是否合法
if(l==NULL||l->len==0||sub<0||sub>l->len){
printf("修改失败\n");
return ;
}
//修改
l->data[sub]=e;
}
/*
* function: 按下标查找
* @param [ in] 顺序表 位置
* @param [out]
* @return 成功返回该下标对应的值,失败返回-1
*/
int find_sub(seqlist *l,int sub)
{
//判断创建成功或顺序表空
//判断下标是否合法
if(l==NULL||l->len==0||sub<0||sub>l->len){
printf("查找失败\n");
return -1;
}
return l->data[sub];
}
/*
* function: 按元素查找
* @param [ in] 顺序表 查找元素
* @param [out]
* @return 存在返回下标 不存在返回-1
*/
int find_data(seqlist *l,datatype key)
{
//判断创建成功或顺序表空
if(l==NULL||l->len==0)
return -1;
for(int i =0;i<l->len;i++){
if(l->data[i]==key)
return i;
}
return -1;
}
/*
* function: 顺序表按元素插入
* @param [ in] 顺序表 查找元素 插入元素
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_data(seqlist *l,datatype key,datatype e)
{
int sub=-1;
//根据key查下标
for(int i = 0;i<l->len;i++){
if(l->data[i]==key){
sub = i;
break;
}
}
if(sub==-1){
printf("查找失败\n");
return -1;
}
insert_sub(l,sub,e);
return 0;
}
/*
* function: 顺序表按元素删除
* @param [ in] 顺序表 元素值key
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_data(seqlist *l,datatype key)
{
int sub = find_data(l,key);
if(sub==-1)
return -1;
//根据下标删除
delete_sub(l,sub);
return 0;
}
/*
* function: 顺序表按元素修改
* @param [ in] 顺序表 查找值key 修改值e
* @param [out]
* @return 成功返回0,失败返回-1
*/
int update_data(seqlist *l,datatype key,datatype e)
{
int sub = find_data(l,key);
if(sub==-1)
return -1;
update_sub(l,sub,e);
return 0;
}
/*
* function: 冒泡升序
* @param [ in] 顺序表
* @param [out]
* @return 无
*/
void bubble(seqlist *l)
{
//判断创建成功或顺序表空
if(l==NULL||l->len==0)
return ;
for(int i = 1;i<l->len;i++){
int count = 0;
for(int j = 0;i<l->len-i;j++){
if(l->data[j]>l->data[j+1]){
datatype t = l->data[j];
l->data[j] = l->data[j+1];
l->data[j+1] = t;
count++;
}
}
if(count==0)
break;
}
}
void select_sort(seqlist *list)
{
//2 4 6 3 7 1
//1,判断顺序表创建是否成功
//2,判断顺序表是否空
if(list==NULL || list->len==0)
{
printf("排序失败\n");
}
//3,简单选择排序
for(int i=0;i<list->len-1;i++)//轮数
{
int min=i;//默认第一个下表是最值下表
for(int j=i+1;j<list->len;j++)
{
if(list->data[min] > list->data[j])
{
min=j;
}
}
if(min!=i)
{
datatype t=list->data[min];
list->data[min]=list->data[i];
list->data[i]=t;
}
}
}
void delete_re(seqlist *list)
{
for(int i=0;i<list->len-1;i++)
{
for(int j=i+1;j<list->len;j++)
{
if(list->data[i]==list->data[j])
{
delete_sub(list,j);
j--; //防止连续的且重复元素漏删
}
}
}
}
seqlist *free_space(seqlist *l)
{
//删掉所有元素
l->len=0;
free(l);
l = NULL;
return l;
}
head.h
#ifndef Head_H
#define Head_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef int datatype;
//顺序表结构体的定义
typedef struct Seq
{
//数据元素
datatype data[MAXSIZE];
//顺序表长度
int len;
}seqlist;
void output(seqlist *l);
void insert_rear(datatype e,seqlist *l);
seqlist *create();
void delete_rear(seqlist *l);
int full(seqlist *l);
int empty(seqlist *l);
void insert_sub(seqlist *l,int sub,datatype e);
void delete_sub(seqlist *l,int sub);
void update_sub(seqlist *l,int sub,datatype e);
int insert_data(seqlist *l,datatype key,datatype e);
int find_sub(seqlist *l,int sub);
int find_data(seqlist *l,datatype key);
int update_data(seqlist *l,datatype key,datatype e);
int delete_data(seqlist *l,datatype key);
void bubble(seqlist *l);
void select_sort(seqlist *list);
seqlist *free_space(seqlist *l);
void delete_re(seqlist *list);
#endif