zoukankan      html  css  js  c++  java
  • 数据结构之数组

    一、学习一波数据结构

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。--百度百科

    二、学习一波数据结构之C语言回顾

    1.指针--C语言的灵魂

    指针:
    重要性:C语言的灵魂
    定义:
    地址(内存单元的编号)
    指针:就是地址==指针
    指针变量是存放内存单元地址的变量
    指针的本质:是一个操作受限的非负整数(0->2^n-1)
    eg:int * p; //p 是个指针变量,int * 表示该p变量只能存储int类型的地址
    分类:
    1).基本类型的指针
    int * p;
    2).指针和数组的关系
    一维数组:eg:int a[5] = {1,2,3,4,5};
    其中,a代表数组名,是一个指针常量,代表第一个数组元素的地址;
    3).指针变量:所有的指针变量只占4个子节,用第一个字节的地址表示整个变量的地址。
    4).通过无返回值的函数更改变量的值,只能通过地址更改。

    2.结构体--自定义数据类型

    为什么出现结构体:表示一些复杂的数据
    什么是结构体:根据实际需要,自己定义的复合数据类型
    如何使用:struct Student st = {1000,"lisi",22};
    struct Student * pst = &st;
    1).st.sid = 99; 2).pst->sid = 99;
    注意事项:结构体变量不能加减乘除,但能相互赋值;
    普通结构体变量和结构体指针变量作为函数传参问题

    三、学习一波数据结构之数组的实现

    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    struct Arr{
        int * pBase; //数组首地址 
        int len;  //  数组长度 
        int cnt;  //  数组当前元素个数 
    }; 
    
    void init_arr(struct Arr * pArr,int length);
    bool is_empty(struct Arr * pArr);
    bool is_full(struct Arr * pArr); 
    void show_arr(struct Arr * pArr);
    bool append_arr(struct Arr * pArr,int val);
    bool insert_arr(struct Arr * pArr,int pos,int val);
    bool delete_arr(struct Arr * pArr,int pos,int * pVal);
    //int get();
    void inversion_arr(struct Arr * pArr);
    void sort_arr(struct Arr * pArr);
     
    
    int main(void)
    {
        
        struct Arr arr;
        
        int *pVal;
        int val; //接受被删除的数组元素 
        
        printf("数组未初始化……数组随机分配长度:
    ");
        printf("%d 
    ",arr.len);
        
        struct Arr * pArr = &arr;
        printf("数组初始化……数组长度:
    ");
        init_arr(pArr,6);
        
    //    printf("%d 
    ",arr.len);
        printf("%d 
    ",pArr->len);
        show_arr(pArr);
        append_arr(pArr,0);
        append_arr(pArr,1);
        append_arr(pArr,2);
    //    append_arr(pArr,4);
    //    append_arr(pArr,5);
    //    append_arr(pArr,6);
        append_arr(pArr,3);
        show_arr(pArr);
        
        insert_arr(pArr,2,11);
        insert_arr(pArr,5,35);
        show_arr(pArr);
        
        delete_arr(pArr,3,pVal);
        show_arr(pArr);
        
        inversion_arr(pArr);
        show_arr(pArr);
        
        sort_arr(pArr);
        show_arr(pArr);
        
        return 0;
    }
    //******************init_arr()初始化数组****************************//
    void init_arr(struct Arr * pArr,int length)
    {
        pArr->pBase = (int * )malloc(sizeof(int)*length);
        if(pArr->pBase == NULL)
        {
            printf("动态内存分配失败!!
    ");
            exit(-1);  //异常终止程序 
        }else{
            pArr->len = length;
            pArr->cnt = 0;
        }
    }
    //******************is_empty()判断数组是否为空****************************//
    bool is_empty(struct Arr * pArr)
    {
        if(pArr->cnt == 0)
            return true;
        else
            return false;
    }
    //******************is_full()判断数组是否为满****************************//
    bool is_full(struct Arr * pArr)
    {
        if(pArr->cnt == pArr->len)
            return true;
        else
            return false;
    }
    //******************append_arr()追加数组元素****************************//
    bool append_arr(struct Arr * pArr,int val)
    {
        if(is_full(pArr)){
            printf("数组已满,追加失败!!
    ");
            return false;
        }else{
            pArr->pBase[pArr->cnt] = val;
            pArr->cnt++;
            printf("数组追加成功!!
    ");
            return true;
        }
            
    }
    //******************show_arr()输出数组元素****************************//
    void show_arr(struct Arr * pArr)
    {
        if(is_empty(pArr))
            printf("数组为空!!
    ");
        else{
            for(int i=0;i<pArr->cnt;i++)
                printf("%d  ",pArr->pBase[i]);
            printf("数组输出完毕。
    ");
        }
    }
    //******************insert_arr()在pos位置处插入元素val****************************//
    bool insert_arr(struct Arr * pArr,int pos,int val)
    {
        //
        if( is_full(pArr) )
            return false;
        if(pos<1||pos>=pArr->cnt+1) 
            return false;
        for(int i=pArr->cnt-1;i>=pos-1;i--)
            pArr->pBase[i+1] = pArr->pBase[i];
        pArr->pBase[pos-1] = val;
        pArr->cnt++;
        printf("数组元素插入成功!!
    ");
        return true;
    }
    //******************delete_arr()删除pos位置处的数组元素****************************//
    bool delete_arr(struct Arr * pArr,int pos,int * pVal)
    {
        //
        if( is_empty(pArr) )
            return false;
        if(pos<1||pos>pArr->cnt) 
            return false;
        pVal = &pArr->pBase[pos-1];
        for(int i=pos;i<=pArr->cnt;i++)
            pArr->pBase[i-1] = pArr->pBase[i];
        pArr->cnt--;
        printf("数组元素删除成功!!
    ");
        return true;
        
    }
    //******************inversion_arr()将数组元素倒置****************************// 
    void inversion_arr(struct Arr * pArr)
    {
        int i=0;
        int j=pArr->cnt-1;
        int temp;
        while(i<j)
        {
            temp = pArr->pBase[j];
            pArr->pBase[j] = pArr->pBase[i];
            pArr->pBase[i] = temp;    
            i++;
            j--;
        }
        printf("数组元素倒置完成!!
    ");
    }
    //*******************sort_arr()数组元素排序***************************// 
    void sort_arr(struct Arr * pArr)
    {
        //采用冒泡排序
        int i,j,temp;
        for(i=0;i<pArr->cnt;i++)
            for(j=i+1;j<pArr->cnt;j++)
            {
                if(pArr->pBase[i] > pArr->pBase[j])
                {
                    temp = pArr->pBase[j];
                    pArr->pBase[j] = pArr->pBase[i];
                    pArr->pBase[i] = temp;
                }
            } 
        printf("数组元素排序完成!!
    ");
    }

    编译,没有错误;运行结果:

  • 相关阅读:
    调试常用命令
    android获取手机机型、厂商、deviceID基本信息
    融云即时通讯 添加地理位置信息的功能
    Linux centOS下搭建RTMP服务器的具体步骤
    数组与字符串 1.4
    数组与字符串 1.5
    数组与字符串 1.3
    数组与字符串 1.2
    数组与字符串 1.1
    笔记本自开wifi设置
  • 原文地址:https://www.cnblogs.com/ljd4you/p/9480717.html
Copyright © 2011-2022 走看看