首页 > 其他分享 >数据结构—线性表

数据结构—线性表

时间:2024-05-28 22:32:11浏览次数:18  
标签:arr return 线性表 int Dynamic Array 数据结构 size

线性表的定义:

        线性表是具有相同特性的数据元素的一个有限序列,类似于数组。

        线性表中的元素都有一个直接前驱和直接后继,除了第一个首元素和最后一个元素

线性表的实现:

        使用线性表模拟动态数组的实现:

                

//.h 文件
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H

//使用c语言实现
#include <stdio.h>
#include <stdlib.h>


//首先定义动态数组的结构体
typedef struct DYNAMICARRAY
{
    int* pAddr;    //存放数据的地址
    int size;      //表示当前数组存放的元素个数
    int capacity;  //当前数组所能容纳的元素的个数
}Dynamic_Array;


//以下是对上述结构体的操作函数


//初始化
Dynamic_Array* Init_Array();

//插入
void Pushback_Array(Dynamic_Array* arr,int value);


//根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr,int value);

//根据位置进行删除
void RemoveByPos_Array(Dynamic_Array* arr,int pos);

//根据值查找
int FindByValue_Array(Dynamic_Array* arr,int value);

//根据位置查找
int FindByPos_Array(Dynamic_Array* arr,int pos);

//打印
void Print_Array(Dynamic_Array* arr);

//清空数组
void Clear_Array(Dynamic_Array* arr);

//获取数组元素个数
void getSize_Array(Dynamic_Array* arr);

//获取容量
int getCapacity_Array(Dynamic_Array* arr);

//释放数组内存
void FreeSpace_Array(Dynamic_Array* arr);


#endif

//.c 文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DynamicArray.h"

//初始化
Dynamic_Array* Init_Array()
{
    //首先申请一块连续的内存
    Dynamic_Array* arr = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
    
    arr->size = 0;
    arr->capacity = 20;    //将数组的初始容量设置为20

    arr->pAddr = (int*)malloc(sizeof(int) * arr->capacity);

    return arr;
}

//插入
void Pushback_Array(Dynamic_Array* arr,int value)
{
    if(arr == NULL) return;

    //判断空间是否不足
    if(arr->size == arr->capacity)    //空间已满
    {
        //申请一块内存更大的新空间
        int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
        //将原来空间中的数据拷贝到新空间
        memcpy(newSpace,arr->pAddr,sizeof(int)*arr->capacity);
        //释放旧内存的空间
        free(arr->pAddr);

        //更新容量
        arr->capacity = arr->capacity*2;
        //将指针指向新的内存空间
        arr->pAddr = newSpace;  
    }    

    //现在进行元素插入
    arr->pAddr[arr->size] = value;
    //将元素个数增加1
    arr->size++;
}


//根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr,int value)
{
    if(arr == NULL) return;
    
    int flag = -1;
    for(int i = 0; i < arr->size; i++)
    {
        if(arr->pAddr[i] == vlaue)
        {
            flag = i;
            break;
        }
    }    

    for(int j = flag; j < arr->size; j++)
        arr->pAddr[j] = arr->pAddr[j+1];

    arr->size--; 

}

//根据位置进行删除
void RemoveByPos_Array(Dynamic_Array* arr,int pos)
{
    if(arr == NULL)    return;

    if(pos < 0 || pos > arr->size)    return;

    //删除元素
    for(int i = pos; i < arr->size; i++)
        arr->pAddr[i] = arr->pAddr[i+1];

    arr->size--;
}

//根据值查找
int Find_Array(Dynamic_Array* arr,int value)
{
    if(arr == NULL)    return 0;
    
    int pos = -1;
    for(int i = 0; i < arr->size; i++)
    {
        if(arr->pAddr[i] == value)
        {
            pos = i;
            break;
        }
    }

    return pos;
}


//打印
void Print_Array(Dynamic_Array* arr)
{
    if(arr == NULL)    return;

    for(int i = 0; i < arr->size; i++)
        printf("%d ",arr->pAddr[i]);
    printf("\n");
}

//清空数组
void Clear_Array(Dynamic_Array* arr)
{
    if(arr == NULL)    return;

    arr->size = 0;
}

//获取数组元素个数
int getSize_Array(Dynamic_Array* arr)
{
    if(arr == NULL)    return 0;
    
    return arr->size;
}

//获取容量
int getCapacity_Array(Dynamic_Array* arr)
{
    if(arr == NULL)    return 0;
    
    return arr->capacity;
}

//释放数组内存
void FreeSpace_Array(Dynamic_Array* arr)
{
    if(arr == NULL)    return;
    if(arr != NULL)    free(arr->pAddr);
    free(arr);
}


int main()
{
    //初始化动态数组
    Dynamic_Array* myArray = Init_Array();
    //插入元素
    for(int i = 0; i < 10; i++)
    {
        Push_Back_Array(myArray,i);
    }
    //打印
    Print_Array(myArray);

    //销毁
    FreeSpace_Array(myArray);

    return 0;
}

小知识点:

        free() 函数释放的是用 malloc() 申请在堆上的内存空间,而不是指针本身。

当我们使用 malloc() 函数动态分配内存时,会在堆(heap)上分配一块指定大小的内存,并返回其起始地址。当我们使用完这块内存时,需要使用 free() 函数将这块内存释放掉,以便我们后面再度使用这块内存。

标签:arr,return,线性表,int,Dynamic,Array,数据结构,size
From: https://blog.csdn.net/m0_63713177/article/details/139259713

相关文章

  • 数据结构初阶 栈
    一.栈的基本介绍1.基本概念栈是一种线性表是一种特殊的数据结构栈顶:进行数据插入和删除操作的一端另一端叫做栈底压栈:插入数据叫做压栈压栈的数据在栈顶出栈:栈的删除操作叫做出栈出栈操作也是在栈顶栈遵循一个原则叫做后进先出(比如说子弹的弹夹其实就是一种设......
  • 数据结构的直接插入排序(C语言版)
    一.直接插入排序的基本概念1.直接插入排序的基本思想将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,将其插入到已排序部分的合适位置,使得已排序部分保持有序。重复步骤2,直到整个数组有序。2.排序的工作原理假设前i-1个元素已经有序,现在要将......
  • 数据结构:队列
    目录队列的概念和结构队列的实现结构定义初始化判空入队列出队列返回队头元素返回队尾元素返回size销毁 队列的概念和结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操......
  • 数据结构--哈夫曼树
    一、实验目的1、掌握二叉树的逻辑结构、存储结构及基本操作;2、熟练掌握哈夫曼树在实际问题中的应用;3、针对计算机领域复杂工程问题,能够综合运用数据结构的基本理论和设计方法,设计出合理的算法。二、实验内容 “烽火连三月,家书抵万金”可见古人传递信息的不容易。古人用烽......
  • 【数据结构】链式二叉树(超详细)
    文章目录前言二叉树的链式结构二叉树的遍历方式二叉树的深度优先遍历前序遍历(先根遍历)中序遍历(中根遍历)后序遍历(后根遍历)二叉树的广度优先遍历层序遍历二叉树链式结构接口实现二叉树结点个数二叉树叶子结点个数二叉树的深度(高度)二叉树第k层结点个数二叉树查找x......
  • 设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1
    题目:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的排序方法是()A.先按k1进行直接插入排序,再按k2进行简单选择排序B.先按k2进行直接插入排序,再按k1进行......
  • day14--Lambda、方法引用、算法、正则表达式、数据结构
    day14–Lambda、方法引用、算法、正则表达式、数据结构一、Arrays类接下来我们学习的类叫做Arrays,其实Arrays并不是重点,但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays,再通过Arrays来学习Lamdba这样学习会更丝滑一些_.......
  • 【考研数据结构知识点详解及整理——C语言描述】第二章线性表的定义和基本操作
    25计算机考研,数据结构知识点整理(内容借鉴了王道408+数据结构教材),还会不断完善所整理的内容,后续的内容也会不断更新(可以关注),若有错误和不足欢迎各位朋友指出!目录 一.线性表的定义二.线性表的基本操作一.线性表的定义(1)线性表是具有相同数据类型的n(n>0)个数据元素的有......
  • 二叉树遍历算法与堆数据结构详解(C语言)
    目录树的概念及结构二叉树的概念及结构概念二叉树的性质满二叉树和完全二叉树满二叉树完全二叉树深度的计算二叉树顺序结构及实现顺序存储堆的概念数组建堆向下调整堆的实现完整代码Heap.hHeap.cTest.c堆的初始化(实现小堆为例)插入数据删除堆顶的数据 ......
  • 【高阶数据结构】红黑树
    1.红黑树的概念2.红黑树的性质只要满足前四点规则,就能保证最长路径<=最短路径*2。由红黑树的性质可以推出:1.最短路径全是黑色结点2.最长路径一定是一红一黑相间的。3.红黑树插入结点的规则首先我们每次插入结点时都需要插入红色结点。因为插入红色结点可能会违背......