#ifndef __H1_H
#define __H1_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;//把int 起别名
#define MAXISZE 10//线性表长度 不变
typedef struct
{
datatype data[MAXISZE];
int len;
}seqlist;
seqlist *create();//1
int full_seqlist(seqlist *list);//2
void insert_rear(seqlist *list,datatype e);//3
int empty_seqlist(seqlist *list);//4
void output(seqlist *list);//5
int delete_rear(seqlist *list);//6
int search(seqlist *list,int sub);//7
int update(seqlist *list,int sub,datatype e);//8
int insert_by_sub(seqlist *list,int sub,datatype e);//9
int delete_by_sub(seqlist *list,int sub);//10
int search_by_key(seqlist *list,datatype key);//11
int delete_by_key(seqlist *list,datatype key);//12
int search_delete_by_key(seqlist *list,datatype key,datatype e);//13
int Maopao(seqlist *list);//14
int list_free(seqlist *list);//15
#endif
#include "h1.h"
//函数1 创建目标空间
seqlist *create()
{
seqlist *list=(seqlist *)malloc(sizeof(seqlist));
if(list==NULL)
return NULL;
list->len=0;//表示顺序表为空
return list;
}
//函数2 判断顺序表是否为满=========================
int full_seqlist(seqlist *list)
{
return list->len==MAXISZE?-1:0;
}
//函数3 增加顺序表=========================
void insert_rear(seqlist *list,datatype e)
{
if(full_seqlist(list))
{
return;//结束函数
printf("顺序表已满");
}
list->data[list->len]=e;
list->len++;
}
//函数4 判断顺序表是否为空================================
int empty_seqlist(seqlist *list)
{
return list->len==0?-1:0;//等于0为空 返回-1 否则返回0
}
//函数5 打印==============================================
void output(seqlist *list)
{
for(int i=0;i<list->len;i++)
{
printf("%d\t",list->data[i]);
}
putchar(10);
}
//函数6 删除顺序表尾部的一个元素=====================================
int delete_rear(seqlist *list)
{
if(empty_seqlist(list))//条件一利用函数4 判顺序表是否为空,有值进入条件句
{
printf("顺序标为空,删除失败\n");
return -1;
}
list->len--;// len 减去一位达到删除尾部的目的
return 0;
}
// 函数7 按下标查找函数=======================================================
int search(seqlist *list,int sub)
{
if(empty_seqlist(list) || sub<0 || sub>=list->len)//顺序表为空不行
{
printf("查找失败\n");
return -1;
}
printf("查找的元素是; %d\n",list->data[sub]);
return 0;
}
//函数8 按下标修改===================
int update(seqlist *list,int sub,datatype e)
{
if(empty_seqlist(list) || sub<0 || sub>=list->len)//顺序表为空不行(没有值可以修改)
{
printf("打印失败\n");
return -1;
}//按下标赋值
list->data[sub]=e;
return 0;
}
//函数9 按下标插入===================================================
int insert_by_sub(seqlist *list,int sub,datatype e)
{
if(full_seqlist(list) || sub<0 || sub>list->len)//顺序表满不行(没有地方可以插)
{
printf("插入失败\n");
return -1;
}
for(int i=list->len-1;i>=sub;i--)//从最后一位开始每个元素将值赋值给后一位,直到插入元素的前一位;
{
list->data[i+1]=list->data[i];
}
//在sub插入
list->data[sub]=e;//在空缺出来的位置也就是变量sub下标指向的位置 插入变量e的值
//顺序表长度自增
list->len++;
return 0;
}
// 函数10 按下标删除========================================================================
int delete_by_sub(seqlist *list,int sub)
{
if(empty_seqlist(list) || sub<0 || sub >=list->len)//顺序表空不行(没有值可以修改)
{
printf("删除失败\n");
return -1;
}
//循环前移
for(int i=sub ;i<list->len-1;i++)//从删除的位置开始每个元素将值赋值给前一位,直到末尾元素;
{
list->data[i]=list->data[i+1];
}
//顺序表长度自减
list->len--;
return 0;
}
//=======================================================================================================================
//函数11 按元素查找====================================
int search_by_key(seqlist *list,datatype key)
{
for(int i=0;i<list->len;i++)//遍历查找是否有相同元素 如果有 返回相同元素的下标
{
if(key==list->data[i])
{
return i;
}
}
return -1;
}
//函数12 按元素删除-根据元素找下标,根据下标位置删除======================
int delete_by_key(seqlist *list,datatype key)
{
int sub=search_by_key(list,key);//调用按元素查找函数11 判断该元素是否存在 存在 获取下标
if(sub==-1)
{
printf("删除的元素不存在\n");
return -1;
}
int flag=delete_by_sub(list,sub);//元素存在 则调用按下标删除函数12
if(flag==-1)
{
printf("按元素删除失败\n");
return -1;
}
return 0;
}
//函数13 按元素方式查找并修改-根据元素找到下标,根据下标位置删除元素,再插入新元素
int search_delete_by_key(seqlist *list,datatype key,datatype e)
{
int sub=delete_by_key(list,key);
if(sub==-1)
{
printf("目标值删除失败\n");
return -1;
}
int flag=insert_by_sub(list,sub,e);
if(flag=-1)
{
printf("目标值插入失败");
return -1;
}
return 0;
}
//函数14 冒泡排序
int Maopao(seqlist *list)
{
if(NULL==list || list->len<=1)
{
printf("排序失败\n");
return -1;
}
for(int i=0;i<list->len-1;i++)
{
for(int j=0;j<list->len-1-i;j++)
{
if(list->data[j]<list->data[i+1]){
datatype t=list->data[i+1];
list->data[i+1]=list->data[i];
list->data[i]=t;
}
}
}
return 0;
}
//函数15 顺序表空间释放
int list_free(seqlist *list)
{
if(NULL != list)
{
free(list); //释放空间
list = NULL;
printf("销毁成功\n");
return 0;
}
return -1;
}
# include "h1.h"
int main(int argc, const char *argv[])
{
//定义名为list的指针变量来接受创建目标空间函数的返回值
seqlist *list=create();
//定义个数变量n 输入值变量值 e ================================
int n;
datatype e;
printf("请输入输入的个数;");
scanf("%d",&n);
//循环获取输入值填充到顺序表中
for(int i=0;i<n;i++)
{
printf("请输入插入的值;");
scanf("%d",&e);
insert_rear(list,e);
}
output(list);//调用打印函数5
delete_rear(list);//调用删除函数6
printf("\n删除后的结果是\n");
output(list);
int sub;//定义名为 sub 的下标变量--并调用查找函数7
printf("\n请输入要查找的下标;");
scanf("%d",&sub);
search(list,sub);
//修改目标下标位置的值
printf("\n请输入要修改的下标位置;");
scanf("%d",&sub);
printf("\n请输入目标值;");
scanf("%d",&e);
int flag=update(list,sub,e);//调用 按下标修改函数8
if(flag==0)
output(list);
//顺序表下标位置插入新值
printf("\n请输入要插入的下标位置");
scanf("%d",&sub);
printf("\n请输入目标值");
scanf("%d",&e);
flag=insert_by_sub(list,sub,e);//调用 按下标插入函数9
if(flag==0)
output(list);
//删除顺序表下标位置的旧值
printf("请输入要删除的下标位置");
scanf("%d",&sub);
flag=delete_by_sub(list,sub);//调用 按下标删除函数10
if(flag==0)
output(list);
//按个体元素的方式在顺序表中查找
datatype key;//定义新的变量key
printf("\n请输入想要查找的值");
scanf("%d",&key);
flag=search_by_key(list,key);//调用 按元素查找函数11
if(flag==-1)
printf("想要查找的值不存在\n");
else
printf("查找的值存在,下标值=%d\n",flag);
//=================================================================================================
//按个体元素的方式在顺序表中查找并删除
printf("请输入想要删除的值");
scanf("%d",&key);
flag=delete_by_key(list,key);//调用 按元素删除函数12
if(flag==-1)
printf("目标值删除失败\n");
else
output(list);
//按个体元素的方式在顺序表中查找并修改
printf("请输入想要查找并的值;");
scanf("%d",&key);
printf("请输入想要修改的值");
scanf("%d",&e);
flag=search_delete_by_key(list,key,e);//调用 按元素查找并修改函数13
if(flag==-1)
printf("目标值修改失败");
else
output(list);
//顺序表进行排序
flag=Maopao(list);
if(flag==-1)
printf("排序失败");
else
output(list);
//顺序表空间释放
printf("进行空间销毁\n");
flag=list_free(list);
if(flag==-1)
printf("空间销毁失败");
return 0;
}