数据结构入门-线性结构

把所有的节点用一根直线串起来

连续存储[数组]

什么叫做数组:元素类型相同,大小相等

重点看代码吧,需要注意的都在注释里,多敲几遍,当然了,有些功能还没有实现,以后再实现

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

// 定义了一个数据类型,这个数据类型的名字叫做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); // 这个指针用来接收删除的那个值
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 inversion_arr(struct Arr * pArr);

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

    // 这里要传入地址
    init_arr(&arr , 6);
    append_arr(&arr,2);
    append_arr(&arr,18);
    append_arr(&arr,55);
    append_arr(&arr,99);
    append_arr(&arr,6);
    inversion_arr(&arr);
    // insert_arr(&arr,1,100);
    // show_arr(&arr);
    // if(delete_arr(&arr, 6 , &val))
    //  printf("删除的元素为:%d\n", val);
    sort_arr(&arr);
    show_arr(&arr);

    return 0;
}

// 用于初始化,自己指定长度
void init_arr(struct Arr * pArr , int length)
{
    // 指针变量pArr指向结构体中的pBase成员
    pArr->pBase = (int *)malloc(sizeof(int) * length);
    if (NULL == pArr->pBase)
    {
        printf("动态内存分配失败\n");
        exit(-1);  // 终止整个程序
    }
    else
    {
        pArr->len = length;
        pArr->cnt = 0;
        printf("初始化成功\n");
    }
    return;

}

// 输出数组
void show_arr(struct Arr * pArr )
{
    if (is_empty(pArr))
    {
        printf("数组为空!\n");
    }
    else
    {
        int i;
        printf("数组中的元素为:\n");
        for (i = 0; i < pArr->cnt; i++)
        {
            // 这里需要注意,输出的时候是这样,根据元素地址来
            printf("%d\n", pArr->pBase[i]);
        }
    }
}

// 判断数组是否为空
bool is_empty(struct Arr * pArr )
{
    if (pArr->cnt == 0)
        return true;
    else
        return false;
}

// 判断数组是否满了
bool is_full(struct Arr * pArr )
{
    if (pArr->cnt == pArr->len)
        return true;
    else
        return false;
}

// 末尾添加元素
bool append_arr(struct Arr * pArr  , int val)
{

    if (is_full(pArr))
    {
        printf("数组已经满了\n");
        return false;
    }
    else
    {
        // 这里需要注意,把用户传入的值添加到当前对应的数组有效个数的后面,
        // 由于是数组,这里直接写cnt就可以了,完事之后有效个数加1
        pArr->pBase[pArr->cnt] = val;
        (pArr->cnt)++;
        printf("添加成功\n");
        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--)
    {
        // 把前面的值往后面移
        pArr->pBase[i+1] = pArr->pBase[i];
    }
    // 把指定元素插入到指定位置就可以了,然后个数加1
    pArr->pBase[pos-1] = val;
    pArr->cnt++;
    printf("插入成功\n");

    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--;
    printf("删除成功\n");
    return true;

}

// 进行倒置
void inversion_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 , 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;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/mengd/p/11828044.html

时间: 2024-10-31 08:58:12

数据结构入门-线性结构的相关文章

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

数据结构之线性结构

import java.util.*; class SLType{ public static void main(String args[]){ int i; SL sl = new SL(); DATA pdata; String key; System.out.println("the show of sequence list"); sl.SLlnit(sl); System.out.println("initialise sequence list is end&q

数据结构(1) -- 线性结构

1.顺序存储 //List.h #ifndef LIST_H_ #define LIST_H_ #define MAXSIZE 100 typedef struct _Poly { int a; int n; bool operator == (_Poly e) { if (a == e.a && n == e.n) return true; else return false; } }Poly; #define ElemType Poly typedef struct _Node { E

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

Java数据结构之线性表(2)

从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张,我们将会分别讲解这几种数据结构,主要也是通过Java代码的方式来讲解相应的数据结构. 今天要讲解的是:Java线性结构 Java数据结构之线性结构 说到线性结构的话,我们可以根据其实现方式分为两类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 对于1)和2)的讲解,请参考

Java数据结构之线性表

从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张,我们将会分别讲解这几种数据结构,主要也是通过Java代码的方式来讲解相应的数据结构. 今天要讲解的是:Java线性结构 Java数据结构之线性结构 说到线性结构的话,我们可以根据其实现方式分为三类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 1.顺序结构的线性表    

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个