欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-07 08:40:04
一、数据结构组织 存放数据的方式 精心选择的数据结构可以提升效率 数据结构 1、逻辑结构 一对多关系 父与子 一对一关系 排队中 多对多关系 两地的路线 2、存储结构 数据存放的位置关系 顺序存储数据 一个挨着一个的存储(数组) 链式存储方式 二、线性表逻辑方面是线性关系 一对一线性 每一个元素有唯 ......

一、数据结构
组织 存放数据的方式
精心选择的数据结构可以提升效率
数据结构 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