数据结构之数组
一、学习一波数据结构
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。--百度百科
二、学习一波数据结构之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("数组未初始化……数组随机分配长度:\n"); printf("%d \n",arr.len); struct Arr * pArr = &arr; printf("数组初始化……数组长度:\n"); init_arr(pArr,6); // printf("%d \n",arr.len); printf("%d \n",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("动态内存分配失败!!\n"); 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("数组已满,追加失败!!\n"); return false; }else{ pArr->pBase[pArr->cnt] = val; pArr->cnt++; printf("数组追加成功!!\n"); return true; } } //******************show_arr()输出数组元素****************************// void show_arr(struct Arr * pArr) { if(is_empty(pArr)) printf("数组为空!!\n"); else{ for(int i=0;i<pArr->cnt;i++) printf("%d ",pArr->pBase[i]); printf("数组输出完毕。\n"); } } //******************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("数组元素插入成功!!\n"); 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("数组元素删除成功!!\n"); 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("数组元素倒置完成!!\n"); } //*******************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("数组元素排序完成!!\n"); }
编译,没有错误;运行结果: