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

归纳:

线性

  连续存储【数组】

    优点:存取速度快(元素可以直接定位到)

    缺点:插入删除元素慢(因为要移动其他元素),空间通常有限制

  离散存储【链表】

    优点:空间没有限制,插入删除元素很快

    缺点:存取速度很慢(要一个一个遍历,一个一个找)

  线性结构的应用:

    1. 栈

    2. 队列

非线性

  树

  图

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define bool int
#define false 0
#define true 1

/*
连续存储数组的算法表示
这个程序,用数据结构实现了数组的初始化(开辟内存,确定数组长度)、追加、
在某一位置插入元素、删除元素、得到元素、判断是否为空、是否已满、
排序数组、遍历展示数组元素、倒序数组的功能。
*/

// 定义了一个数据类型,该数据类型的名字叫做struct Arr,该数据类型含有三个成员
struct Arr
{
    int *pBase; // 存储的是数组的首地址
    int len; // 数组所能容纳的最大元素的个数
    int cnt; // 当前数组的有效元素的个数
};

void init_arr(struct Arr *pArr, int length);
bool append_arr(struct Arr *pArr, int val); // 追加
bool insert_arr(struct Arr *pArr, int pos, int val); // pos的值从1开始
bool delete_arr(struct Arr *pArr, int pos, int *pVal);
//int get();
bool is_empty(struct Arr *pArr);
bool is_full(struct Arr *pArr);
void sort_arr(struct Arr *pArr);
void show_arr(struct Arr *pArr);
void inverse_arr(struct Arr *pArr);

int main(void)
{
    struct Arr arr;
    int val;

    init_arr(&arr, 6);
    if(append_arr(&arr, 7))
    {
        printf("追加成功!\n");
    }
    append_arr(&arr, -5);
    append_arr(&arr, 2);
    append_arr(&arr, 8);
    append_arr(&arr, 11);
    //insert_arr(&arr, 3, 384);
    /*
    if(delete_arr(&arr, 1, &val))
    {
        printf("删除成功!\n");
        printf("您删除的元素是:%d\n", val);
    }
    else
    {
        printf("删除失败!");
    }
    */
    //inverse_arr(&arr);
    sort_arr(&arr);
    show_arr(&arr);
    printf("数组的长度为:%d\n", arr.len);
    printf("数组里有效的元素个数为:%d\n", arr.cnt);

    return 0;
}

void init_arr(struct Arr *pArr, int length)
{
    //(*pArr).len = 99;
    //pArr->len = 99;
    pArr->pBase = (int *)malloc(sizeof(int)*length);
    if(pArr->pBase == NULL)
    {
        printf("动态内存分配失败!\n");
        exit(-1); // 终止整个程序,需要头文件stdlib.h
    }
    else
    {
        pArr->len = length;
        pArr->cnt = 0;
    }
    return; // 代表程序终止了
}

bool is_empty(struct Arr *pArr)
{
    if(pArr->cnt == 0)
        return true;
    else
        return false;
}

bool is_full(struct Arr *pArr)
{
    if(pArr->len == pArr->cnt)
        return true;
    else
        return false;
}

void show_arr(struct Arr *pArr)
{
    if(is_empty(pArr))
    {
        printf("数组为空!\n");
    }
    else
    {
        // 输出数组的有效内容
        int i;
        for(i = 0;i < pArr->cnt;i++)
        {
            printf("%d\n", pArr->pBase[i]);
        }
    }

}

bool append_arr(struct Arr *pArr, int val)
{
    if(is_full(pArr))
    {
        return false;
    }
    else
    {
        pArr->pBase[pArr->cnt] = val;
        (pArr->cnt)++;
        return true;
    }
}

bool insert_arr(struct Arr *pArr, int pos, int val)
{
    int i;

    // 保证程序的合理性,写出健壮性的代码:
    if(is_full(pArr))
        return false;

    if(pos < 1 || pos > (pArr->cnt + 1))
        return false;

    for(i = (pArr->cnt) - 1;i >= (pos - 1);i--)
    {
        //printf("%d\n", i);
        pArr->pBase[i + 1] = pArr->pBase[i];
    }
    pArr->pBase[pos - 1] = val;
    (pArr->cnt)++;
    return true;
}

bool delete_arr(struct Arr *pArr, int pos, int *pVal)
{
    int i;

    // 把不合法的排去
    if(is_empty(pArr))
        return false;
    if(pos < 1 || pos > pArr->cnt)
        return false;

    *pVal = pArr->pBase[pos - 1];

    for(i = pos; i < pArr->cnt; i++)
    {
        pArr->pBase[i - 1] = pArr->pBase[i];
    }

    (pArr->cnt)--;
    return true;

}

void inverse_arr(struct Arr *pArr)
{
    int i = 0;
    int j = (pArr->cnt)-1;
    int t;

    while (i < j)
    {
        t = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = t;
        i++;
        j--;
    }
    return;
}

// 冒泡排序
void sort_arr(struct Arr *pArr)
{
    int i, j;
    int t;

    for(i = 0;i < pArr->cnt;i++)
    {
        for(j = i + 1; j < pArr->cnt;j++)
        {
            if(pArr->pBase[i] > pArr->pBase[j])
            {
                t = pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = t;
            }
        }
    }
}
时间: 2024-12-20 18:18:17

数据结构线性存储之连续存储数组的实现的相关文章

数据结构-线性表-链式存储

由于顺序表的插入.删除操作需要移动大量的元素,影响了运行效率,由此引入了线性表的链式存储. 链式存储线性表时,不需要使用地址连续的存储单元,即它不要求逻辑上相邻的两个元素在物理位置上也相邻,它是通过“链”建立起数据元素之间的逻辑关系. 因此,对线性表的插入.删除不需要移动元素,而只需要修改指针. 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针.单链表结

大话数据结构——线性表-链式存储之删除整链表

#include<iostream> #include<time.h> #include <stdlib.h> using namespace std; #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 typedef int status;//返回的状态值 typedef int elemtype;//节点里数据的类型 //数据结构 typedef struct Node { elemtype da

大话数据结构——线性表-链式存储之头插法创建链表

1 #include<iostream> 2 3 #include<time.h> 4 #include <stdlib.h> 5 6 using namespace std; 7 8 #define OK 1 9 #define TRUE 1 10 #define FALSE 0 11 #define ERROR 0 12 13 typedef int status;//返回的状态值 14 typedef int elemtype;//节点里数据的类型 15 16 /

数据结构之线性表-链式存储之单链表(一)

本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述 1.1 单链表简介 线性表的最大的缺点就是插入和删除操作需要移动大量的元素,这是它在内存中的连续存储结构造成的.为了弥补这2个缺点,就出现了链表,即线性表的链式存储. 链表是由一系列的几点组成,这些节点不必在内存中相连.这就意味着元素可以存在内存未被占用的任意位置.如图 这个存储可以想象成元素在内存中成三维空间存储,他们之间可没有像数组那样的下标标

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构 - 线性表链式存储结构

链式存储 链式存储 :用一组任意的存储单元存储线性表中的数据元素.用这种方法存储的线性表简称线性链表. 存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的. 链表中结点的逻辑顺序和物理顺序不一定相同.(即不要求逻辑上相邻的元素在物理位置上也相邻) 为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针(pointer)或链(link),这两部分组成了数据元素ai的存储映像 链表是通过每个结点

数据结构之第二章线性表之链式存储

1~~特点:逻辑上相邻的元素,他的物理位置不一定相邻,其实几乎是不像邻的.表中的元素只能顺序访问,插入,删除等操作只需修改指针而不需要移动元素,存储空间利用率高,表的容量可以动态变化.适合个数变化大的情况. 2--链式存储`的存储结构 typedef struct Node{ int data; struct Node *next; }NODE,*PNODE; 3~~线性表的基本操作 (1)线性表的的  插表头  建立算法 ” 插表头“方式得到的线性链表,元素存储的顺序和输入顺序相反,这与栈的特

1、数据结构的基本逻辑结构、存储结构和运算

数据结构的基本逻辑结构.存储结构和运算 1.基本逻辑结构 集合结构.线性结构.树形结构和图状结构 2.基本存储结构 线性存储:需要一块连续的内存地址空间,相关元素一次存储 链接存储:不需要连续的地址空间,每个节点包含元素和链接两个部分,元素存储数据值,链接存储下一个节点的地址 3.基本运算 ·创建运算 ·清除运算 ·插入运算 ·搜索运算(根据值返回位置) ·更新运算 ·访问运算(根据位置返回值) ·遍历运算 1.数据结构的基本逻辑结构.存储结构和运算,布布扣,bubuko.com

数据结构--二叉树(定义与存储结构)

什么是二叉树 是具有n个节点的有限集合,由一个根节点和两棵互不相交二叉树组成.如图 从名字简单理解,就是具有2个树叉的树形结构,当然这不是绝对的,正如上图所示,我也可以只有一个树叉. 二叉树具有五种基本形态: (1)空二叉树 (2)只有一个根结点的二叉树 (3)只有左子树 (4)只有右子树 (5)既有左子树又有右子树 完全二叉树 这种二叉树,是二叉树中常用的专业术语,不是说一个完整的二叉树就是完全二叉树,这种二叉树叫满二叉树,如图 简单理解就像图片中,完全二叉树中每个节点的编号,都能映射到满二叉