数据结构:详细的说明顺序表的各种操作

一.顺序表

1.1 概念

逻辑结构:线性结构

存储结构:

顺序存储(顺序表)--基础数组实现

缺点:

空间使用不够灵活,需要提前确定数组的大小

插入和删除元素比较麻烦,因为需要批量的移动元素

优点:

按照位置查找元素比较快,因为可以通过数组下标来访问元素

1.2 操作:

创建线性表 

插入数据元素(尾插、任意位置插入法) 

删除数据元素(尾山法、任意位置删除法) 

修改数据元素(根据位置、值修改) 

在顺序表中查找元素(按位置查找) 

顺序表的排序 --排序

清空顺序表 

释放顺序表 

 1.3代码实现

#ifndef _SEQ_LIST_H_
#define _SEQ_LIST_H_

#include <stdio.h>
#include <stdlib.h>

#define N 5

typedef struct _Student{
    int data;
}stu_t;

typedef struct _seq_list{
    stu_t s[N];
    int count;
}seq_list_t;

seq_list_t* create_seq_list();
int insert_seq_list_by_tail(seq_list_t* my_class, int in_data);
int print_seq_list(seq_list_t* my_class);
int insert_seq_list_by_pos(seq_list_t* my_class,int position,int in_data);
int delete_from_deq_list_by_pos(seq_list_t *my_class, int pos);
int sort_seq_list(seq_list_t *my_class, int flag);

#endif
#include "sql_list.h"

seq_list_t* create_seq_list()
{
    seq_list_t* temp = (seq_list_t*)malloc(sizeof(seq_list_t));

    if (NULL == temp){
        printf("内存分配失败\n");
        exit(-1);
    }

    temp->count = 0;

    return temp;
}

int insert_seq_list_by_tail(seq_list_t* my_class, int in_data)
{
    if(NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    if (my_class->count == N){
        printf("已经满了\n");
    }

    my_class->s[my_class->count].data = in_data;
    my_class->count++;

    return 0;
}

int print_seq_list(seq_list_t* my_class)
{
    if(NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    int i = 0;

    for (i = 0; i < my_class->count; i++){
        printf("%d ",my_class->s[i].data);
    }

    puts("");

    return 0;
}

int insert_seq_list_by_pos(seq_list_t* my_class,int position,int in_data)
{
    if(NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    if (my_class->count == N){
        printf("已经满了\n");
        return -1;
    }

    if (position <= 0 || position >my_class->count){
        printf("插入位置错误");
        return -1;
    }

    for (int i = my_class->count - 1; i >= position; i--){
        my_class->s[i + 1] = my_class->s[i];
    }

    my_class->s[position].data = in_data; 
    my_class->count++;

    return 0;
}

int delete_from_deq_list_by_pos(seq_list_t *my_class, int pos)
{
    if (NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    if (my_class->count == 0){
        printf("为空,不能删除\n");
        return -1;
    }

    if (pos < 0 || pos >= my_class->count){
        printf("插入位置错误");
        return -1;
    }

    for (int i = pos; i < my_class->count-1; i++){
        my_class->s[i] = my_class->s[i+1];
    }

    my_class->count--;

    return 0;
}

int clean_seq_list(seq_list_t *my_class)
{
    
    if (NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    my_class->count = 0;

    return 0;
}

int destroy_seq_list(seq_list_t **my_class)
{
     if(NULL == my_class || NULL == *my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }

    free(*my_class);
    *my_class = NULL;

    return 0;
}

int sort_seq_list(seq_list_t *my_class, int flag){
    if(NULL == my_class){
        printf("入参为 NULL, 请检查\n");
        return -1;
    }
    int i = 0;
    int j = 0;
    stu_t temp;
    if(0 == flag){//升序
        for(i = 0; i < my_class->count-1; i++){
            for(j = 0; j < my_class->count-1-i; j++){
                if(my_class->s[j].data > my_class->s[j+1].data){
                    temp = my_class->s[j];
                    my_class->s[j] = my_class->s[j+1];
                    my_class->s[j+1] = temp;
                }
            }
        }
    }else if(1 == flag){//降序
        for(i = 0; i < my_class->count-1; i++){
            for(j = 0; j < my_class->count-1-i; j++){
                if(my_class->s[j].data < my_class->s[j+1].data){
                    temp = my_class->s[j];
                    my_class->s[j] = my_class->s[j+1];
                    my_class->s[j+1] = temp;
                }
            }
        }
    }
    return 0;
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值