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 \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

C++学习(二十九)(C语言部分)之 顺序表的相关文章

Linux学习(二十九)iptables(三)nat表的应用

需求 A机器可以访问外网,B机器和A机器处于同一个内网,现在要让B机器通过A机器访问外网. 步骤 1.为虚拟机添加一块网卡. 如果没有区段名称的话,点击'LAN区段(S)...'按钮,新建一个. 2.ifconfig -a命令可以看到刚添加进来的尚未启用的网卡: [[email protected] ~]# ifconfig -a eth1 Link encap:Ethernet HWaddr 00:0C:29:AC:CC:56 inet addr:192.168.182.130 Bcast:1

学习二十九

七周三次课(3月21日)10.11 Linux网络相关10.12 firewalld和netfilter10.13 netfilter5表5链介绍10.14 iptables语法 扩展(selinux了解即可) selinux教程 http://os.51cto.com/art/201209/355490.htm 2.selinux pdf电子书 http://pan.baidu.com/s/1jGGdExK Linux网络相关firewalld和netfilternetfilter5表5链介绍

C++语言学习(十九)——C++类型识别

C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改.C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型.RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持.为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字. 2.type_info结构体 t

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

winform学习日志(二十九)----------根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用

一:根据标点符号分行,上图,代码很简单 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lines { public partial class Fr

Welcome to Swift (苹果官方Swift文档初译与注解二十九)---209~218页(第四章-- 流程控制)

Break break语句会立刻结束整个流程控制的执行.break语句可以在switch语句或者循环语句中帮助你提前结束循环或者switch的执行. Break in a Loop Statement  (循环语句中的break) 当在循环语句中使用break,会立刻结束循环的执行,并且跳转到循环体之后的第一行代码.循环不会再遍历执行了. Break in a Switch Statement (switch语句的break) 当在switch语句中使用break,break会立刻结速switc

angular学习笔记(十九)

本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directive的方法来创建指令: var someModule = angular.module('SomeModule',[]); someModule.directive('directiveName',function(){ return { link: f

攻城狮在路上(叁)Linux(二十九)--- 完整备份工具:dump以及restore

一.dump命令: 该命令既可以针对整个文件系统进行备份,也可以仅针对目录来备份.还可以指定不同的备份等级(-0~-9共10个等级). dump -W:列出在/etc/fstab中具有dump设置的分区是否备份过. 命令格式: dump [-Suvj] [-level] [-f 备份文件] 待备份数据 参数说明: -S:仅列出后面的待备份数据所需要的磁盘空间大小. -u:将这次dump的时间记录到/etc/dumpdates文件中. -v:将dump的文件过程显示出来. -j:加入bzip2的支

企业搜索引擎开发之连接器connector(二十九)

在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resume方法获取List<CheckpointAndChange> guaranteedChanges集合 下面跟踪到DiffingConnectorTraversalManager类的相关方法,在该类实现的方法中,调用了监控器管理对象snapshotRepositoryMonitorManager的相