C语言顺序表(类似数组结构)

//
// Created by Administrator on 2024/10/25.
// 顺序表结构
//

#ifndef ORDER_TABLE_H
#define ORDER_TABLE_H

/*声明顺序表的长度*/
#define Size 5

/**
 * 声明顺序表结构体
 */
typedef struct Table {
    int *head;
    int length;
    int size;
} table;

/**
 * 声明初始化顺序表函数
 * @return
 */
table initTable();

/**
 * 追加元素
 * @param t
 * @param element
 * @return
 */
table pushTable(table t, int element);

/**
 * 头部插入元素
 * @param t
 * @param element
 * @return
 */
table unshiftTable(table t, int element);

/**
 * 插入元素
 * @param t 顺序表
 * @param element 要插入的元素
 * @param position 插入的位置
 * @return
 */
table addTable(table t, int element, int position);

/**
 * 查找元素的位置
 * @param t
 * @param element
 * @return
 */
int findTable(table t, int element);

/**
 * 删除元素
 * @param t 顺序表
 * @param position 删除的位置
 * @return
 */
table deleteTable(table t, int position);

/**
 * 更新元素
 * @param t
 * @param element
 * @param position 起始位置为0
 * @return
 */
table updateTable(table t, int element, int position);

/**
 * 声明初始化顺序表输出函数
 * @param t
 */
void displayTable(table t);

#endif
//
// Created by Administrator on 2024/10/25.
//
#include <stdio.h>
#include <stdlib.h>
#include "OrderTable.h"

/*初始化顺序表*/
table initTable() {
    table t;
    t.head = (int *) malloc(Size * sizeof(int)); //构造一个空的顺序表,动态申请存储空间
    if (!t.head) //如果申请失败,作出提示并直接退出程序
    {
        printf("初始化失败");
        exit(0);
    }
    t.length = 0; //空表的长度初始化为0
    t.size = Size; //空表的初始存储空间为Size
    return t;
}

/**
 * push 元素
 */
table pushTable(table t, const int element) {
    /*无多余内存,要申请内存*/
    if (t.length == t.size) {
        t.head = (int *) realloc(t.head, (t.size + 1) * sizeof(int));
        if (!t.head) {
            printf("内存分配失败");
            exit(0);
        }
        t.size += 1;
    }
    t.head[t.length] = element;
    t.length++;
    return t;
}

/**
 * 头部插入元素
 * @param t
 * @param element
 * @return
 */
table unshiftTable(table t, const int element) {
    /*申请内存*/
    if (t.length == t.size) {
        t.head = (int *) realloc(t.head, (t.size + 1) * sizeof(int));
        if (!t.head) {
            printf("内存分配失败");
            exit(0);
        }
        t.size += 1;
    }
    /*所有元素右移*/
    for (int i = t.length - 1; i >= 0; i--) {
        t.head[i + 1] = t.head[i];
    }
    t.head[0] = element; /*插入第一个元素*/
    t.length++;
    return t;
}

/**
 * 任意位置插入元素
 * @param t 顺序表
 * @param element 要插入的元素
 * @param position 插入的位置 起始位置为0
 * @return
 */
table addTable(table t, const int element, const int position) {
    //判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
    if (position > t.length || position < 0) {
        printf("插入位置有问题\n");
        return t;
    }
    //做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
    if (t.length == t.size) {
        t.head = (int *) realloc(t.head, (t.size + 1) * sizeof(int));
        if (!t.head) {
            printf("存储分配失败\n");
            return t;
        }
        t.size += 1;
    }
    //插入操作,需要将从插入位置开始的后续元素,逐个后移
    for (int i = t.length - 1; i >= position; i--) {
        t.head[i + 1] = t.head[i];
    }
    //后移完成后,直接将所需插入元素,添加到顺序表的相应位置
    t.head[position] = element;
    //由于添加了元素,所以长度+1
    t.length++;
    return t;
}

/**
 * 查找元素的位置
 * @param t
 * @param element
 * @return
 */
int findTable(const table t, const int element) {
    for (int i = 0; i < t.length; i++) {
        if (t.head[i] == element) {
            return i + 1;
        }
    }
    return -1;
}

/**
 * 删除元素
 * @param t 顺序表
 * @param position 删除的位置
 * @return
 */
table deleteTable(table t, const int position) {
    if (position < 1 || position > t.length) {
        printf("删除的位置有误");
        return t;
    }
    for (int i = position; i <= t.length; i++) {
        t.head[i - 1] = t.head[i];
    }
    t.length--;
    return t;
}

/**
 * 更新元素
 * @param t
 * @param element
 * @param position 起始位置为0
 * @return
 */
table updateTable(const table t, const int element, const int position) {
    if (position < 0 || position > t.length) {
        printf("更新的位置有误");
        exit(0);
    }
    t.head[position] = element;
    return t;
}

/*输出顺序表*/
void displayTable(table t) {
    for (int i = 0; i < t.length; i++) {
        printf("%d ", t.head[i]);
    }
    printf("\n");
}

 

posted @ 2024-10-30 10:21  龍飛鳯舞  阅读(2)  评论(0编辑  收藏  举报