一、数据结构
组织 存放数据的方式
精心选择的数据结构可以提升效率
数据结构 1、逻辑结构
一对多关系 父与子
一对一关系 排队中
多对多关系 两地的路线
2、存储结构
数据存放的位置关系
顺序存储数据 一个挨着一个的存储(数组)
链式存储方式
二、线性表
逻辑方面是线性关系 一对一线性 每一个元素有唯一的前驱和后继
顺序存储的线性表 就是顺序表
链式存储的线性表 就是链表
三、顺序表
主要实现方式---->数组/动态数组
顺序存储的线型表
数据结构--->为了管理数据
对数据进行操作--->增加 删除 查找 修改
附:
静态数组(定义的大小固定)
数组已满 就不能存放数据
动态数组
数组满 --->分配新的内存(申请更大的空间存储数据)
实现 用malloc申请内存
测试代码笔记如下:
1 #include<stdio.h> 2 struct LIST //定义结构体 3 { 4 int arr[20]; //存放数据的数组 5 int size; //数组中最多能够存多少元素 6 int len; //数组中已经存了多少元素 7 }; 8 9 //初始化函数 10 void main(struct LIST*p) 11 { 12 //刚开始表中没有数据 13 p->len = 0; 14 p->size = 20; //最多可以存的数据 15 } 16 17 //增加数据 18 void insert(struct LIST*p,int data) 19 { 20 //直接插入末尾 21 if (p->len < p->size) //说明顺序表没有满 22 { 23 p->arr[p->len] = data; //根据数组的下标判断 len知道的是最后一个元素的下一个位置 24 p->len++; 25 //两行等价于p->arr[p->len++]=data; 26 } 27 } 28 29 //插入到中间 插入到前面 30 void instert_middle(struct LIST*p, int data, int index) //index是下标 插入到下标所在位置 31 { 32 if (p->len < p->size) //说明顺序表没有满 33 { 34 if (index >= 0 && index < p->len) 35 { 36 //可以先插入到这个位置 37 //先腾出一个位置 38 for (int i = p->len; i>index; --i) 39 { 40 p->arr[i] = p->arr[i - 1]; //元素往后移动 41 } 42 p->arr[index] = data; //插入到这个位置 43 p->len++; //插入了一个元素 所以让它加1 44 } 45 else 46 { 47 p->arr[p->len++] = data; //否则插入尾部 48 } 49 } 50 } 51 52 //查找 一个一个找 53 int search(struct LIST*p, int data) 54 { 55 for (int i = 0; i < p->len; ++i) 56 { 57 if (data == p->arr[i]) 58 { 59 return i; //找到了return下标 60 } 61 } 62 return -1; //不存在这个位置 63 } 64 65 //修改数据 66 void change(struct LIST*p,int data,int newData) 67 { 68 //根据学生的名字查找 69 for (int i = 0; i < p->len; ++i) 70 { 71 if (data == p->arr[i]); //找到了就修改 72 { 73 p->arr[i] = newData; //学生名字 字符数组 比较用什么 strcmp string.h 74 break; //如果有多个相同数据都要修改 去掉break 75 } 76 } 77 } 78 79 //删除数据 删除就是覆盖 循环 80 void dele(struct LIST*p, int data) 81 { 82 for (int i = 0; i < p -> len; ++i) 83 { 84 if (data == p->arr[i]) //找到位置 开始删除 85 { 86 for (int j = i; j < p->len-1; ++j) //从前往后 87 { 88 p->arr[j] = p->arr[j + 1]; 89 } 90 p->len--; 91 break; 92 } 93 } 94 } 95 96 int main() 97 { 98 #if 0 99 int x, y, z; 100 int k; 101 printf("%p,%p,%p,%p", &x, &y, &z, &k); 102 #endif 103 104 #if 1 105 /* 106 示例: 107 存放同学的信息 学号+姓名 108 一个班级100个同学 +插班生 +转班生 109 150--70 110 字符数组 字符串 111 char arr[100]="hello world";//数组大小 数组有效元素11个字符 112 \0 前面是有效数据 后面是无效数据 这个只限于字符数组 113 顺序表中 1.有多少个数据 2.可以放多少个数据 114 int brr[100]={1,2,34}; 115 //有3个数据 最多可以放100个数据 116 117 默认不考虑数据重复问题 118 */ 119 struct LIST list; //定义一个顺序表 120 init(&list); //调用函数初始化 121 insert(&list, 2); 122 instert_middle(&list, 3, 4); //插入的数据是3 插到下标为4的位置 123 #endif 124 getchar(); 125 return 0; 126 }
2019-03-30 09:17:07
原文地址:https://www.cnblogs.com/Yuuki-/p/10625299.html
时间: 2024-10-18 05:14:04