day3学习

该代码实现了顺序表的基本操作,包括创建、判断是否满/空、插入、删除、查找、修改、冒泡排序等功能。用户可以输入数据,进行各种操作并查看结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值