首页 > 其他分享 >C语言顺序表(类似数组结构)

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

时间:2024-10-30 10:24:02浏览次数:1  
标签:head 顺序 return int param C语言 数组 table element

//
// 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");
}

 

标签:head,顺序,return,int,param,C语言,数组,table,element
From: https://www.cnblogs.com/longfeiPHP/p/18515235

相关文章

  • C语言链表
    ////CreatedbyAdministratoron2024/10/29.//#ifndefLINK_H#defineLINK_H/***链表的结构体*/typedefstructLink{intelement;structLink*next;}link;#endif//LINK_H////链表//CreatedbyAdministratoron2024/10/28.//#pragmao......
  • C语言链表反转的四种方法
    ////CreatedbyAdministratoron2024/10/29.//#ifndefLINK_H#defineLINK_H/***链表的结构体*/typedefstructLink{intelement;structLink*next;}link;#endif//LINK_H////四种链表反转算法//CreatedbyAdministratoron2024/10/29.......
  • L1-015 c语言跟奥巴马一起画方块
    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长N(3≤N≤2......
  • 2个月搞定计算机二级C语言——真题(6)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题62.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>unsignedlongfun(unsignedlongn){unsignedlongx=0;intt;while(n){t=n%10;/**********fou......
  • 更新 state 中的数组
    同对象一样,当你想要更新存储于state中的数组时,你需要创建一个新的数组(或者创建一份已有数组的拷贝值),并使用新数组设置state。在没有mutation的前提下更新数组每次要更新一个数组时,你需要把一个新的数组传入state的setting方法中。为此,你可以通过使用像filter()和map......
  • javascript 数组 filter
    javascript数组filter在JavaScript中,filter方法被用于创建一个新数组,该数组包含通过提供的函数实现的测试的所有元素。解法1:基本使用方法letnumbers=[4,9,16,25,29];letnewNumbers=numbers.filter(num=>num>10);console.log(newNumbers);//......
  • 【C语言】预处理(预编译)详解(下)(C语言最终篇)
    文章目录一、#和##1.#运算符2.##运算符二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理......
  • C语言之长整型有符号数与短整型有符号数转换
            最近考证的新星,问了一个问题:inta=1234565789;为什么在输出%hd时的值为-1379?其实这个很简单,只不过对于可能初入“编程坑”以及经验不是很丰富的朋友来说,感觉知道这么个道理,但就是解释不上来,无法做出实际的推论。作者想说的是,这个知识点亦涉及多方面,比较广泛,......
  • 初学c语言(第一天)
     其实我也不太算是初学,但是也算是初学,这样说有点矛盾哈,让我来解释一下: 首先我是一个今年刚刚毕业的大学生,大学学的专业是电子信息工程,这个专业涉及过c语言,但是我大学期间只顾的潇洒了,没怎么认真学习,只有当大四下学期的时候我们离校需要出去找工作实习时,我才发现我什么都不......
  • JS-数组、函数、类与对象
    JS进阶数组数组可以存放任意类型的元素letarr=['小胖',12,true,28.9];console.log(arr,arr.length);增arr[4]='newValue';改arr[4]='changedValue';删不会改变数组的长度,使用undefined赋值deletearr[4];查console.log(arr[4]);//undefined多......