C++学习(二十九)(C语言部分)之 顺序表

一、数据结构
组织 存放数据的方式
精心选择的数据结构可以提升效率
数据结构 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   前面是有效数据 后面是无效数据  这个只限于字符数组
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