线性存储结构--数组

#include<stdio.h>
#include<stdlib.h>
//定义了一个数据类型叫struct Arr  该数据类型包含 3个成员
struct Arr{   //12个字节
    int *pBase;//存储数组第一个元素的地址
    int len;//数组所能容纳的最大元素个数
    int cnt;//当前数组有效元素的个数
};
              //不用指针 用值得话 导致方法里存在局部变量 不能使主方法的改变  只能传地址
void Init_arr(struct Arr *p,int length){ //传参  哪个变量 长度
    p->pBase=(int *)malloc(sizeof(int)*length);//4*6=24个字节 表示p指向pBase这个成员变量(分配内存)  第一块第一个字节地址赋给pBase
    if(NULL==p->pBase){  //地址满了就会把NULL赋给pBase
        printf("动态内存分配失败");
        exit(-1);  //终止程序
    }
    else{
        p->len=length;   //赋值长度
        p->cnt=0; //还未赋值
    }
    return ;
}

bool is_empty(struct Arr *p){  //判断是否为空
    if(0==p->cnt){  //有效个数为空
        printf("有效个数为空!");
        return true;
    }
    else
        return false;
}

void show_arr(struct Arr *p){   //输出内容
    if(is_empty(p)){ //p已经存放arr的地址  //调用是否为空  为true执行下一条语句
        printf("数组为空!\n");
    }
    else{
        for(int i=0;i<p->cnt;i++)
        printf("%d\t",p->pBase[i]);
        printf("\n");
    }
}

bool is_full(struct Arr *p){  //判断是否满
    if(p->cnt==p->len){
    printf("已满!");
    return true;
}
    else
    return false;
}

bool append_arr(struct Arr *p,int x){  //添加数值
    //判断是否满
    if(is_full(p))
        return false;
    //不满时加值
    p->pBase[p->cnt]=x;  //p->pBase[0]=1;cnt=1
    (p->cnt)++;             //p->pBase[1]=2;cnt=2
    return true;         //p->pBase[2]=3;cnt=3   //cnt为元素个数
                         //p->pBase[p->cnt]=x;  cnt的值为新放元素下标
}                         //(p->cnt)++;  元素个数加一

bool insert_arr(struct Arr *p,int pos,int x){  //在位置pos前面插入(pos从1开始)   插入元素x  后面的元素后移
    int i;
    if(is_full(p))
        return false;
    if(pos<1||pos>p->cnt+1){
        printf("插入位置不合法!");
        return false;
    }
  for(i=p->cnt-1;i>=pos-1;i--){
      p->pBase[i+1]=p->pBase[i];  //后移
  }
  p->pBase[pos-1]=x;
  p->cnt++;
  return true;
}

int main(){
    int n,pos,x,L,t;
    struct Arr arr;   //struct Arr 相当于数据类型  只定义了  是垃圾数字  需要初始化
    printf("输入数组长度:");
    scanf("%d",&L);
    Init_arr(&arr,L);  //初始化  传地址 &arr=strcut Arr *p

    printf("你要输入几个值:");
    scanf("%d",&t);
    printf("请输入:");
    for(int i=0;i<t;i++){
    scanf("%d",&n);
    append_arr(&arr,n);
}
    printf("输出结果为:");
    show_arr(&arr);

    printf("请输入在什么位置:");
    scanf("%d",&pos);
    printf("插入:");
    scanf("%d",&x);
    insert_arr(&arr,pos,x);
    printf("插入后结果:");
    show_arr(&arr);
}



线性存储结构--数组

原文地址:https://www.cnblogs.com/lizhenye/p/10834751.html

时间: 2024-10-10 21:11:58

线性存储结构--数组的相关文章

栈的线性存储结构及其实现

栈的基本原理是先进后出.既可以用数组实现,也可以用链表实现.先用数组实现. 这是栈的结构定义 typedef struct { char stack[MaxSize]; int top; }Stack; 这里是一些基本操作 void InitStack(Stack *S); //初始化操作,建立一个空栈 int Push(Stack *S,char e); //压栈操作 void Pop(Stack *S,char *e); //出栈操作 void ClearStack(Stack *S); /

5-1-数组的顺序存储结构-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 数组的顺序存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i

数据结构线性存储之连续存储数组的实现

归纳: 线性 连续存储[数组] 优点:存取速度快(元素可以直接定位到) 缺点:插入删除元素慢(因为要移动其他元素),空间通常有限制 离散存储[链表] 优点:空间没有限制,插入删除元素很快 缺点:存取速度很慢(要一个一个遍历,一个一个找) 线性结构的应用: 1. 栈 2. 队列 非线性 树 图 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define bool int #define false

04.线性表(三)链式存储结构.单链表2

链式存储结构.单链表2 顺序存储结构的创建实质是一个数组的初始化,存储空间连续且其大小和类型已经固定:单链表存储空间不连续,是一种动态结构且它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成. 一.单链表的整表创建 创建单链表的过程就是一个动态生成链表的过程,即从"空表"的初始化起,依次建立各元素结点,并逐个插入链表. 1.算法思路 (1)声明一个结点p和计数器变量i; (2)初始化一空链表L (3)让链表L的头结点的指针指向NULL,即建立一个带头

05.线性表(四)链式存储结构.静态链表

链式存储结构.静态链表   一.静态链表 1.静态链表存储结构 单链表是通过指针实现的,但是我们也可以通过数组来代替指针描述单链表,即静态链表.如何实现静态链表?构造数组的元素由两个数据域组成:data和cur,即数组的每个下标都对应一个data和一个cur. 数据域data:用来存放数据元素,即要处理的数据: 游标cur:存放该元素的后继在数组中的下标,相当于单链表中的next指针: 为了方便插入数据,我们通常会把数组建立得大一些,以便有一些空闲空间而不致于出现溢出情况. 线性表的静态链表存储

线性表的链式存储结构——(2)

线性表的存储结构有两种:顺序存储和链式存储 顺序存储:读取数据的时间复杂度为O(1),其实就是数组,但是插入,删除的复杂度略大 链式存储:•用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置. 数据域:存储数据元素信息的域 指针域:把存储直接后继位置的域 指针或链:指针域中存储的信息 结点(Node):数据域和指针域组成数据元素称为存储映像 单链表:链表的每个结点中只包含一个指针域 •头指针 –头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点

【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关系 图形结构或网状结构:数据元素之间存在多个对多个的关系 对于数据不同的逻辑结构,计算机在物理磁盘上通常有两种屋里存储结构 顺序存储结构 链式存储结构 本篇博文主要讲的是线性结构,而线性结构主要是线性表,非线性结构主要是树和图. 线性表的基本特征: 总存在唯一的第一个数据元素 总存在唯一的最后一个数据元素 除

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑