数据结构Day2--顺序表的相关操作

头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXSIZE 7//线性表长度
typedef int datatype;
//定义顺序表:数据结构,顺序表长度
typedef struct
{
    //数据元素
    datatype data[MAXSIZE];
    //顺序表长度
    int len;

}seqlist;

//函数声明
seqlist *create();
int full_seqlist(seqlist *list);
int insert_rear(seqlist *list,datatype e);
void output_seqist(seqlist *list);
int delete_rear(seqlist *list);
int search_sub(seqlist *list,int sub);
int update_seqlist(seqlist *list ,int sub,int datatype);
int insert_sub(seqlist *list ,int sub,datatype e);

int delete_sub(seqlist *list,int sub);
int search_data(seqlist *list, datatype e);
int sort_seqlist(seqlist *list);
int removal_seqlist(seqlist *list);
int delete_seqlist(seqlist *list,datatype e);

seqlist *free_space(seqlist *seq);


#endif
 

自定义文件

#include"head.h"
/*
 * function:    在堆区申请顺序表
 * @param [ in] 申请一个顺序表的空间
 * @param [out] 
 * @return      成功返回地址,失败返回NULL
 */
seqlist *create()
{
    seqlist *list = (seqlist *)malloc(sizeof(seqlist));
    if(list == NULL)
        return NULL;
    list->len = 0;   //把顺序表清空
    return list;
}

/*
 * function:    判断数据表满的函数
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int full_seqlist(seqlist *list)
{
    return list->len == MAXSIZE ? -1 : 0;
}
/*
 * function:    判断数据表是否为空
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int empty_seqlist(seqlist *list)
{
    return list->len == 0 ? -1 : 0;
}

/*
 * function:    在尾部插入
 * @param [ in] 顺序表 插入的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int insert_rear(seqlist *list,datatype e)
{
    if(full_seqlist(list))
    {
        printf("顺序表已满\n");
        return -1;
    }
    list->data[list->len] = e;
    list->len++;
    return 0;
}

/*
 * function:    循环输出
 * @param [ in] 顺序表
 * @param [out] 
 * @return      无返回值
 */
void output_seqist(seqlist *list)
{
    puts("");
    for(int i = 0; i < list->len; i++)
    {
        printf("%d\t",list->data[i]);
    }
    puts("");
}

/*
 * function:    删除尾部元素
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int delete_rear(seqlist *list)
{
    if(empty_seqlist(list))
    {
        printf("顺序表为空\n");
        return -1;
    }
    list->len--;
    return 0;
}
/*
 * function:    按下标查找
 * @param [ in] 顺序表  查找的下标
 * @param [out] 
 * @return     成功返回0,失败返回0 
 */
int search_sub(seqlist *list,int sub)
{
    //1.判断是否为空,下标是否合法
    if(empty_seqlist(list) || sub <0 || sub >= list->len)
    {
        printf("顺序表查找失败\n");
        return -1;
    }
    //查找输出
    printf("查找的元素是%d\n",list->data[sub]);
    return 0;
}
/*
 * function:    修改顺序表某一下标的值
 * @param [ in] 顺序表  下标  要修改的值
 * @param [out] 
 * @return      成功返回0失败返回-1
 */
int update_seqlist(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;
}
/*
 * function:    插入顺序表按下标插入
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int insert_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];
    }
    list->data[sub] = e;
    list->len++;
}
/*
 * function:    按下标删除
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int delete_sub(seqlist *list,int sub)
{
    if(empty_seqlist(list) || sub <0 || sub >=list->len)
    {
        printf("删除失败\n");
        return -1;
    }
    for(int i = sub +1; i < list->len; i++)
    {
        list->data[i-1] = list->data[i];
    }
    list->len--;
}
/*
 * function:    按元素查找
 * @param [ in] 
 * @param [out] 
 * @return      成功返回下标,失败返回-1
 */
int search_data(seqlist *list, datatype e)
{
    int sub = 0;
    if(empty_seqlist(list))
    {
        printf("查找失败\n");
        return -1;
    }
    for(sub = 0; sub < list->len; sub++)
    {
        if(list->data[sub] == e)
        {
            return sub;
        }
    }
    return -1;
}

/*
 * function:    按元素删除
 * @param [ in] 顺序表 删除的值key
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int delete_seqlist(seqlist *list,datatype e)
{
    int flag = search_data(list,e);
    if(flag == -1)
    {
        printf("未找到您要删除的值\n");
        return -1;
    }
    return delete_sub(list,flag);
}
/*
 * function:   顺序表排序
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0,失败返回-1
 */
int sort_seqlist(seqlist *list)
{
    if(empty_seqlist(list) ||list->len < 2)
    {
        printf("不需要排序,顺序表长度小于2\n");
        return -1;
    }
    int temp;
    for(int i = 1; i < list->len; i++)//躺数
    {
        int count = 0;
        for(int j = 0; j <list->len -i; j++)
        {
            if(list->data[j] > list->data[j+1])
            {
                temp = list->data[j];
                list->data[j] = list->data[j+1];
                list->data[j+1] = temp;
                count++;
            }
        }
        if(count == 0)
            break;
    }
    return 0;
}
/*
 * function:    顺序表去重
 * @param [ in] 顺序表
 * @param [out] 
 * @return      成功返回0失败返回1
 */
int removal_seqlist(seqlist *list)
{

    if(empty_seqlist(list) ||list->len < 2)
    {
        printf("不需要排序\n");
        return -1;
    }
    datatype key;
    key = list->data[0];//
    for(int i = 0; i <list->len; i++)
    {
        //if()
        
    }
}


seqlist *free_space(seqlist *seq)
{
    if(seq == NULL)
        return NULL;
    free(seq);
    seq = NULL;
    return seq;
}
 

 

主函数文件

#include"head.h"
int main (int argc, const char *argv[])
{
    seqlist *list = create();
    //循环在尾部插入
    int n;
    datatype e;
    printf("请输入数据元素的个数:");
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        printf("请输入您要插入的值:");
        scanf("%d",&e);
        insert_rear(list,e);
    }
    //输出
    output_seqist(list);

    //尾部删除
    //delete_rear(list);
    //delete_rear(list);
    //输出
    //output_seqist(list);
    
    
    //查找按小标
    int sub;
    printf("请输入您要查找的下标:");
    scanf("%d",&sub);
    search_sub(list,sub);

    //修改
    printf("请输入您要修改的下标:");
    scanf("%d",&sub);
    printf("请输入您要修改的值:");
    scanf("%d",&e);
    update_seqlist(list,sub,e);
    //输出
    output_seqist(list);

    //插入
    printf("请输入您要插入的下标:");
    scanf("%d",&sub);
    printf("请输入您要插入的值:");
    scanf("%d",&e);
    insert_sub(list,sub,e);
    //输出
    output_seqist(list);

    
    //按下标删除
    printf("请输入您要删除的下标:");
    scanf("%d",&sub);
    delete_sub(list,sub);
    //输出
    output_seqist(list);


    //按元素查询
    printf("请输入要查询的元素:");
    scanf("%d",&e);
    printf("元素的下标为:%d\n",search_data(list,e));

    //排序
    sort_seqlist(list);
    printf("排序后的顺序表元素为:\n");
    output_seqist(list);

    //按元素删除
    datatype key;
    printf("请输入您要删除的值:\n");
    scanf("%d",&key);
    delete_seqlist(list,key);
    output_seqist(list);
    
    //释放
    list = free_space(list);
    return 0;
}    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值