首页 > 其他分享 >C语言数据结构实现-顺序表基本操作

C语言数据结构实现-顺序表基本操作

时间:2024-06-04 22:14:55浏览次数:26  
标签:head 顺序 int C语言 length table 基本操作 数据结构 size

顺序表,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。

不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如图 1 所示:
image
由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。

通过观察图 1 中数据的存储状态,我们可以发现,顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。
顺序表的初始化
使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:
顺序表申请的存储容量;
顺序表的长度,也就是表中存储数据元素的个数;
提示:正常状态下,顺序表申请的存储容量要大于顺序表的长度。
因此,我们需要自定义顺序表,C 语言实现代码如下:

typedef struct Table{
    int * head;//存放一块连续空间的内存地址
    int length;//目前已经存放数据长度
    int size;//空间大小
} table;

注意,head 是我们声明的一个未初始化的动态数组,不要只把它看做是普通的指针。

接下来开始学习顺序表的初始化,也就是初步建立一个顺序表。建立顺序表需要做如下工作:
给 head 动态数据申请足够大小的物理空间;
给 size 和 length 赋初值;

table initTable(){
    table t;
    t.head = (int *)malloc(LengthSize * sizeof(int));//申请内存
    t.size = LengthSize;
    return t;
}

完整代码如下

#include<stdio.h>
#include<stdlib.h>
#define LengthSize 5
//顺序表操作-其实就是数组操作-数据结果比较简单只是小小是实现下
typedef struct Table{
    int * head;
    int length;
    int size;
} table;
table initTable(){
    table t;
    t.head = (int *)malloc(LengthSize * sizeof(int));//申请内存
    t.size = LengthSize;
    return t;
}
int main(){
    table tt = initTable();
    tt.length=0;
    for(int i=0;i<LengthSize;i++){
        tt.head[i] = i+1;
        tt.length++;
    }
   //addTable(&tt,100,3);
    for(int j=0;j<tt.length;j++){
        printf("%d\n",tt.head[j]);
    }
    return 0;
}

顺序表对应的操作有添加数据、删除数据、查找数据、更改对应位置数据。所有功能代码如下

#include<stdio.h>
#include<stdlib.h>
#define LengthSize 5
//顺序表操作-其实就是数组操作-数据结果比较简单只是小小是实现下
typedef struct Table{
    int * head;
    int length;
    int size;
} table;
table initTable(){
    table t;
    t.head = (int *)malloc(LengthSize * sizeof(int));//申请内存
    t.size = LengthSize;
    return t;
}
//添加
table addTable(table * t , int elem,int addIndex){
    if(addIndex > t->length+1 || addIndex <1){
        printf("is errors");
        exit(0);
    }
    if(t->length == t->size){
        t->head=(int *)realloc(t->head,(t->size+1) * sizeof(int));
        t->size +=1;
        t->length++;
    }
    for(int i = t->length-1;i>=addIndex-1;i--){
        t->head[i+1] = t->head[i];
    }
    t->head[addIndex-1] = elem;
}
//删除
void delTable(table * t, int post){
    for(int i = post -1; i<t->length;i++){
        t->head[i] = t->head[i+1];
    }
    t->length--;
}
//查找
int searchTable(table * t, int elem){
    int pos=-1;
    for(int i = 0;i<t->length;i++){
        if(t->head[i] == elem){
            pos = i+1;
        }
    }
    return pos;    
}
//更改
void changeTable(table * t , int elem, int pos){
    t->head[pos-1]=elem;
}
int main(){
    table tt = initTable();
    tt.length=0;
    for(int i=0;i<LengthSize;i++){
        tt.head[i] = i+1;
        tt.length++;
    }
   //addTable(&tt,100,3);//添加
   //delTable(&tt,3);//删除
    //int s = searchTable(&tt,100);//查找
    //changeTable(&tt,90,3);//修改对应位置

    for(int j=0;j<tt.length;j++){
        printf("%d\n",tt.head[j]);
    }

    return 0;
}

标签:head,顺序,int,C语言,length,table,基本操作,数据结构,size
From: https://www.cnblogs.com/zh718594493/p/18231869

相关文章

  • 扫雷游戏(C语言)(超详细!新手小白入!)
    扫雷游戏详细过程一.前言二.游戏的分析和设计1.厘清整体思路2.棋盘的构建与思路3.初始化及打印棋盘4.布置雷5.排查雷三.扫雷游戏的扩展一.前言游戏介绍这是一款经典的扫雷游戏,玩家可以任意点击一个小方框,若不是雷,则会显示周边有几个雷,并把雷的个数显示出来,若是雷,......
  • 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programmin
    系列文章目录操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)----操作系统介绍与接口示例操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)----xv6初探与实验一(Lab:Xv6and......
  • _weak c语言在实际使用中有什么核心作用
    C语言中__weak关键字的核心作用在C语言中,__weak关键字通常用于声明弱符号,它允许在链接阶段出现多个同名函数的情况下,选择性地指定某个函数具有较低的优先级。如果在代码中使用了__weak修饰的函数,并且在链接时没有找到其他同名的强符号函数,那么编译器会自动链接到这个弱符号函......
  • MySql索引的数据结构
    mysql索引是什么?想象一下,你手上有一本数学教材,但是目录被别人给撕掉了,现在要你翻到三三角函数的那一页,该怎么办?没有了目录,就只有两种方法,要么一页一页翻,要么随机翻。如果数据表没有目录的话,那要查询满足条件的记录行,就需要进行全表扫描,现在的互联网应用,数据量都非常大,百万千......
  • C语言杂谈:从Hello world说起 #include| main| printf| return
    #include<stdio.h>intmain(){ printf("Hellowworld"); return0;}        打印出“Helloworld”的这个程序相信每个人都是见过的,这段代码非常的简单,没有调用函数,没有使用指针,没有各种杂七杂八的东西,但我相信,第一次看见这个代码的朋友一定会有很多疑问。 ......
  • 【华为OD】D卷真题200分:会议接待 C语言代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、python、Java、C、C++代码实现:【华为OD】D卷真题200分:会议接待JavaScript代码实现[思路+代码]-CSDN......
  • 数据结构学习笔记-简单选择排序
    简单选择排序的算法设计与分析问题描述:设计并分析简单选择排序【算法设计思想】迭代选择:算法通过循环遍历数组,进行size次迭代。最小值选择:在每次迭代(i)中,算法致力于找到未排序子数组(arr[i]到arr[size-1])内最小元素的索引。这个最小元素将被选出来进行交换。交......
  • 【玩转C语言】第一讲--->C语言概念
     ......
  • 12- Redis 中的 链表 数据结构
    Redis的List对象的底层实现之一就是链表。C语言本身没有链表这个数据结构,所以Redis自己设计了一个链表数据结构。1.链表节点结构设计先来看看【链表节点】结构的样子:typedefstructlistNode{  //前置节点  structlistNode*prev;  //后置节点 ......
  • 数据结构:树
    树,是一种数据结构,就像这样:这就是一棵二叉树,也就是最多有两个分支的树,这些圆圈就是树的节点,下面讲一下节点间的关系:1、最上面的那个节点叫根节点2、每一个节点的上面的连着的节点称作这个节点的父节点,根节点没有父节点。3、每一个节点连着的下面的节点称作这个节点的子节点......