C语言-顺序表


一、顺序表

线性表(顺序表,链表,栈,队列)用于存储逻辑关系为一对一的数据。存储的数据,如同向数组中存储数据一样,要求数据类型必须一致

将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表);

顺序表中的一些专业术语:
1、某一元素的左侧相邻元素称为直接前驱,位于此元素左侧的所有元素都统称为前驱元素
2、某一元素的右侧相邻元素称为直接后继,位于此元素右侧的所有元素都统称为后继元素

二、代码如下

函数介绍:

malloc:void *malloc(unsigned int size);
在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

realloc:void *realloc(void mem_address, unsigned int newsize);
指针名 =(数据类型
)realloc(要改变内存大小的指针名,新的大小)。
新的大小可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失)

free:void free(void *) ;
释放之前调用 calloc、malloc 或 realloc 所分配的内存空间


//
// Created by 醉人饮梦 on 2023/2/18.
//

#include <stdio.h>
#include <stdlib.h>
#define Size 5

// 对结构体重命名
typedef struct Table{
    int* head; //声明一个动态数组 head
    int length; //记录当前顺序表的长度
    int size; //记录顺序表分配的存储容量
}table;

// 初始化结构体
table initTable(){
    table t;
    // 分配一个新的存储空间并将地址返回,malloc返回一个通用指针(void *),没必要强转
    t.head = malloc(Size*sizeof(int));
    // 如果分配失败会返回一个空指针
    if(!t.head){
        printf("初始化失败");
        exit(0);
    }
    t.length = 0; // 空表的长度初始化为0
    t.size = Size; // 空表能存储多少个数据
    return t;
}

// 打印结构体
void displayTable(table t){
    int i;
    for(i=0;i<t.length;i++){
        printf("%d ",t.head[i]);
    }
    printf("\n");
}

//添加
table addTable(table t, int elem, int add)
{
    int i;
    //判断插入位置是否有问题
    if(add>t.length+1||add<1){
        printf("插入位置有问题");
        return t;
    }
    if(t.length==t.size){
        //重新分配内存一块内存
        t.head = realloc(t.head,(t.size+1)*sizeof(int));
        if(!t.head){
            printf("内存分配失败");
            return t;
        }
        t.size+=1;
    }
    //将从插入位置开始的元素逐个往后移
    for(i=t.length-1;i>=add-1;i--){
        t.head[i+1] = t.head[i];
    }
    //将元素放入插入位置
    t.head[add-1]=elem;
    t.length++;

    return t;
}

//删除
table delTable(table t, int add)
{
    int i;
    //判断删除位置是否有问题
    if(add>t.length||add<1){
        printf("被删除位置有误\n");
        return t;
    }
    //找到删除位置,逐个前移
    for(i=add;i<t.length;i++){
        t.head[i-1] = t.head[i];
    }
    t.length--;

    return t;
}

//查询
int selectTable(table t,int elem)
{
    int i;
    for(i=0;i<t.length;i++){
        if(t.head[i]==elem){
            return i+1;
        }
    }
    return -1;//查找失败返回 -1
}

//替换
table amendTable(table t, int elem, int newElem)
{
    int add = selectTable(t, elem);
    t.head[add-1] = newElem;
    return t;
}

int main()
{
    int i;
    table t = initTable();
    for(i=1;i<=Size;i++){
        // 这里的指针和数组是等价的
        t.head[i-1]=i;
        t.length++;
    }
    printf("顺序表中存储的元素分别是:\n");
    displayTable(t);
    printf("插入一个元素后为:\n");
    t = addTable(t,23,2);
    displayTable(t);
    printf("删除一个元素为:\n");
    t = delTable(t,3);
    displayTable(t);
    printf("查找 23 元素的位置:%d\n",selectTable(t, 23));
    printf("更改 4 为37后的数据: \n");
    t = amendTable(t, 4, 37);
    displayTable(t);

    // 释放内存
    free(t.head);
    // 内存释放以后,要将指针置空(NULL)
    t.head = NULL;

    return 0;
}


结语

个人记录学习所用,如用错误之处还请指出,谢谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值