数据结构中的顺序表

              /  逻辑结构:线性结构  

顺序表/        

                \ 存储结构:顺序存储

操作

创建顺序表 √

向顺序表中插入元素(尾插) √

向顺序表中插入元素(任意位置插入) √

删除顺序表中的元素(尾删) √

删除顺序表中的元素(任意位置删除) √

修改顺序表中的元素(根据位置修改) √

查找顺序表中的元素(根据位置查找) √

顺序表的排序 √

顺序表的剔重 √

清空顺序表 √

销毁顺序表 √

遍历顺序表中所有元素--实际不需要,只是我们学习阶段看现象用的 √

seq_list.h

#ifndef __SEQ_LIST_H__
#define __SEQ_LIST_H__

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

#define N 10

//顺序表的结构体--数据对象
typedef struct _Seq_list{
    int s[N];   //数据元素的类型可以自己定义 我这里以int为例
                //如果数据元素有多个数据项 也可以自己再定义结构体来表示
    int count;  //用来记录表中已有的数据元素的个数
}list_t;

list_t *create_list_1();
int create_list_2(list_t **my_list);
int insert_list_by_tail(list_t *my_list, int data);
int print_list(list_t *my_list);
int insert_list_by_pos(list_t *my_list, int pos, int data);
int delete_list_by_tail(list_t *my_list);
int delete_list_by_pos(list_t *my_list, int pos);
int modify_list_by_pos(list_t *my_list, int pos, int new_data);
int search_list_by_pos(list_t *my_list, int pos, int *num);
int clean_list(list_t *my_list);
int destroy_list(list_t **my_list);
int sort_list(list_t *my_list);
int tichong(list_t *my_list);

#endif

seq_list.c

#include "seq_list.h"

//创建顺序表--通过返回值实现
list_t *create_list_1(){
    list_t *my_list = (list_t *)malloc(sizeof(list_t));
    if(NULL == my_list){
        printf("内存分配失败\n");
        return NULL;
    }
    //清空
    memset(my_list, 0, sizeof(list_t));
    return my_list;
}

//创建顺序表--使用地址传参来实现
int create_list_2(list_t **my_list){
    //入参的合理性检查
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    *my_list = (list_t *)malloc(sizeof(list_t));
    if(NULL == *my_list){
        printf("内存分配失败\n");
        return -1;
    }
    //清空
    memset(*my_list, 0, sizeof(list_t));
    return 0;
}

//向顺序表中插入元素(尾插)
int insert_list_by_tail(list_t *my_list, int data){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    if(N == my_list->count){
        printf("表已满 插入失败\n");
        return -1;
    }
    my_list->s[my_list->count] = data;
    my_list->count++;
    return 0;
}

//遍历顺序表中所有元素的函数
int print_list(list_t *my_list){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    int i = 0;
    for(i = 0; i < my_list->count; i++){
        printf("%d  ", my_list->s[i]);
    }
    printf("\n");
    return 0;
}

//向顺序表中插入元素(任意位置插入)
int insert_list_by_pos(list_t *my_list, int pos, int data){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    if(N == my_list->count){
        printf("表已满 插入失败\n");
        return -1;
    }
    //插入位置合理性检查
    if(pos < 0 || pos > my_list->count){
        printf("插入位置不合理 插入失败\n");
        return -1;
    }
    //执行插入操作
    //先把待插入位置后面的数据依次向后移动一步
    int i = 0;
    for(i = my_list->count-1; i >= pos; i--){
        my_list->s[i+1] = my_list->s[i];
    }
    //把新元素插入到pos位
    my_list->s[pos] = data;
    my_list->count++;
    return 0;
}

//删除顺序表中的元素(尾删)
int delete_list_by_tail(list_t *my_list){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    if(0 == my_list->count){
        printf("表已空 删除失败\n");
        return -1;
    }
    //尾删只需将count--即可
    my_list->count--;
    return 0;
}

//删除顺序表中的元素(任意位置删)
int delete_list_by_pos(list_t *my_list, int pos){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    if(0 == my_list->count){
        printf("表已空 删除失败\n");
        return -1;
    }
    //删除位置合理性检查
    if(pos < 0 || pos >= my_list->count){
        printf("删除位置不合理 删除失败\n");
        return -1;
    }
    //执行删除操作
    int i = 0;
    for(i = pos; i < my_list->count-1; i++){
        my_list->s[i] = my_list->s[i+1];
    }
    my_list->count--;
    return 0;
}

//修改顺序表中的元素(根据位置修改)
int modify_list_by_pos(list_t *my_list, int pos, int new_data){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    if(pos < 0 || pos >= my_list->count){
        printf("修改位置不合理 修改失败\n");
        return -1;
    }
    my_list->s[pos] = new_data;
    return 0;
}

//查找顺序表中的元素(根据位置查找)
int search_list_by_pos(list_t *my_list, int pos, int *num){
    if(NULL == my_list || NULL == num){
        printf("入参为NULL\n");
        return -1;
    }
    if(pos < 0 || pos >= my_list->count){
        printf("查找位置不合理 查找失败\n");
        return -1;
    }
    *num = my_list->s[pos];
    return 0;
}

//清空顺序表
int clean_list(list_t *my_list){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    my_list->count = 0;
    return 0;
}

//销毁
int destroy_list(list_t **my_list){
    if(NULL == my_list || NULL == *my_list){
        printf("入参为NULL\n");
        return -1;
    }
    free(*my_list);
    *my_list = NULL;
    return 0;
}

//顺序表排序--升序
int sort_list(list_t *my_list){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    int i = 0;
    int j = 0;
    int temp = 0;
    for(i = 0; i < my_list->count-1; i++){
        for(j = 0; j < my_list->count-1-i; j++){
            if(my_list->s[j] > my_list->s[j+1]){
                temp = my_list->s[j];
                my_list->s[j] = my_list->s[j+1];
                my_list->s[j+1] = temp;
            }
        }
    }
    printf("排序完成\n");
    return 0;
}

//顺序表剔重
int tichong(list_t *my_list){
    if(NULL == my_list){
        printf("入参为NULL\n");
        return -1;
    }
    int i = 0;
    int j = 0;
    int k = 0;
    for(i = 0; i < my_list->count-1; i++){
        for(j = i+1; j < my_list->count;){
            if(my_list->s[i] == my_list->s[j]){
                //说明找到重复的了
                for(k = j; k < my_list->count-1; k++){
                    my_list->s[k] = my_list->s[k+1];
                }
                my_list->count--;
            }else{
                j++;
            }
        }
    }
    printf("剔重完成\n");
    return 0;
}

main.c

#include "seq_list.h"

int main(int argc, const char *argv[])
{
    list_t *my_list = NULL;
    //my_list = create_list_1();
    create_list_2(&my_list);
    printf("my_list = %p\n", my_list);//非NULL

    //测试尾插
    insert_list_by_tail(my_list, 10);
    insert_list_by_tail(my_list, 20);
    insert_list_by_tail(my_list, 30);
    print_list(my_list);// 10 20 30

    //测试任意位置插入
    insert_list_by_pos(my_list, 4, 40);//不合理
    insert_list_by_pos(my_list, 3, 40);
    insert_list_by_pos(my_list, 1, 50);
    print_list(my_list);// 10 50 20 30 40

    //测试尾删
    delete_list_by_tail(my_list);
    delete_list_by_tail(my_list);
    print_list(my_list);// 10 50 20

    //测试任意位置删除
    delete_list_by_pos(my_list, 3);//不合理
    delete_list_by_pos(my_list, 1);
    print_list(my_list);// 10 20
    

    //测试修改
    modify_list_by_pos(my_list, 2, 100);//不合理
    modify_list_by_pos(my_list, 1, 100);
    print_list(my_list);// 10 100

    //测试查找
    int num = 0;
    search_list_by_pos(my_list, 0, &num);
    printf("num = %d\n", num);//10

    //测试排序
    insert_list_by_tail(my_list, 50);
    insert_list_by_tail(my_list, 70);
    insert_list_by_tail(my_list, 30);
    print_list(my_list);// 10 100 50 70 30
    sort_list(my_list);
    print_list(my_list);// 10 30 50 70 100

    //测试剔重
    insert_list_by_pos(my_list, 1, 10);
    insert_list_by_pos(my_list, 4, 10);
    insert_list_by_pos(my_list, 6, 30);
    insert_list_by_tail(my_list, 100);
    insert_list_by_tail(my_list, 100);
    print_list(my_list);// 10 10 30 50 10 70 30 100 100 100
    tichong(my_list);
    print_list(my_list);// 10 30 50 70 100

    //测试清空
    clean_list(my_list);
    print_list(my_list);// 没有元素了

    //测试销毁
    destroy_list(&my_list);
    printf("my_list = %p\n", my_list);//NULL

    return 0;
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值