首页 > 其他分享 >数据结构之顺序表

数据结构之顺序表

时间:2023-07-15 17:57:12浏览次数:35  
标签:顺序 return int length printf 数据结构 data

顺序表

顺序表的定义

 

 

     线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列

     顺序表 ---用顺序存储的方式实现线性表。顺序存储---把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

     如何知道一个数据元素大小? sizeof(ElemType) ,ElemType 是顺序表中存放的数据元素类型。Eg: sizeof(int) = 4B,4字节

顺序表有两种实现方式 ---- 静态分配和动态分配。

     静态分配申请固定大小的内存空间,大小一旦确定就无法改变,存在比较严重的缺陷,在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

    动态分配是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。C语言动态申请和释放内存空间的函数是 malloc,free 函数。它们的头文件是 #include <stdlib.h>。malloc 函数的参数,指明要分配多大的连续内存空间。

    malloc的全称是memory allocation,malloc函数原型是 void * malloc(unsigned int size);void 中文翻译为无类型,void * 就是无类型指针,可以指向任何类型的地址。malloc函数返回开辟空间的首地址,只接收一个形参,malloc函数是为了在内存的动态存储区中分配一个长度为size的连续空间。

     接着看这句代码 : int *p = (int *)malloc(sizeof(int));  

    其中的解释是:int *p代表一个以int类型地址为内容的指针变量,(int *) 是让计算机知道怎么去划分开辟的空间,就是以几个字节为单元去划分,int占4个字节。如果实在理解不了的话,先记住就行。

    接下来就是如何用代码实现顺序表啦。

    大概思路:首先先去了解一个顺序表里有什么属性,还可以设置一个表的初始长度(也可以反映出动态分配的内存空间大小)。顺序表的属性有顺序表的最大容量,以及目前顺序表的实际长度(顺序表的数据个数),从这些属性出发,用代码定义一个顺序表(假装先告诉计算机,我在你内部有了一个顺序表)。然后我们还要真正地创建出一个顺序表(动态分配的方式),再对顺序表的属性进行初始化,刚开始的顺序表肯定为空表,即实际长度为0,最大容量等于表的初始长度。

   关于顺序表的增删改查操作,画图的话,很好理解,建议在网上找相关视频,自己再画图理解。代码刚开始先慢慢理解了,再模仿着,带着记忆,独立敲出来。

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #define InitSize 10  //表的初始长度
 4 typedef struct 
 5 {
 6     int *data;
 7     int MaxSize;//顺序表的最大容量
 8     int length; //顺序表的实际长度
 9 }SeqList;
10 void InitList(SeqList &L)//初始化函数的定义,引用做函数参数,可以简化指针修饰实参,就是在函数体内能直接改变实参的值
11 {
12     L.data = (int *)malloc(InitSize * sizeof(int));
13     L.length = 0;
14     L.MaxSize = InitSize;
15 }
16 bool InsertList(SeqList &L, int i, int e) //在L的位序 i 处插入元素e,用bool类型是为了给用户一个反馈
17 {
18     if(i < 1 || i > L.length+1) //判断插入的位置是否越界,length从0开始的,i是位序,位序比length大1,
19                                  //所以当i=length+1是临界值
20         return false;
21     if(L.length >= L.MaxSize) //判断顺序表是否已满
22         return false;
23     for(int j = L.length; j >= i; j--)//用for循环将第i个元素及之后的元素后移,这样才能把e放进去,自己画图能很好理解
24     {
25         L.data[j] = L.data[j-1]; //后移数据覆盖,等号是从右到左赋值
26     }
27     L.data[i-1] = e; //在位置i处放入e
28     L.length++; //更新当前长度
29     return true;
30 }
31 bool ShowList(SeqList &L) //显示出顺序表中的数据
32 {
33     if(L.length == 0)
34        return false;
35     for(int i = 0; i < L.length; i++)
36     {
37         printf("%d",L.data[i]);
38         printf(" ");
39     }
40     printf("\n");
41     return true;
42 }
43 bool DeleteList(SeqList &L, int i, int &e) //在L的位序 i 处删除元素e
44 {
45     if(i < 1 || i > L.length)//判断是否越界
46         return false;
47     e = L.data[i-1];//将被删除的元素赋值给e
48     for(int j = i; j < L.length; j++)//用for循环将第i个位置后的元素前移,自己画图理解
49     {
50         L.data[j-1] = L.data[j]; //前移数据覆盖
51     }
52     L.length--; //更新当前长度
53     return true;
54 }
55 int UpdateList(SeqList &L, int i, int num)//把位序为i的数修改为num
56 {
57     L.data[i-1] = num;
58     return L.data[i-1];
59 }
60 int GetList(SeqList &L, int i)//按位查找操作。获取表L中第 i 个位置的元素的值。
61 {
62     return L.data[i-1];//和访问普通数组的方法一样
63 }
64 int main()
65 {
66     SeqList L;//声明一个顺序表
67     InitList(L); //初始化函数的调用
68     InsertList(L,1,1);
69     InsertList(L,2,2);
70     InsertList(L,3,3);
71     InsertList(L,4,4);
72     InsertList(L,5,5);
73     printf("顺序表内的数据是:");
74     ShowList(L);
75     int e;
76     if(DeleteList(L,3,e)) //删除第3个位置上的数,并把这个数返回
77     {
78         printf("删除的数是:%d\n",e);
79     }
80     printf("顺序表内的数据是:");
81     ShowList(L);
82     printf("查找的数是:%d\n",GetList(L,1));//查找第1个位置上的数,并返回
83     printf("修改成功的数是:%d\n",UpdateList(L,1,0));//修改第1个位置上的数为0,并返回
84     printf("顺序表内的数据是:");
85     ShowList(L);    
86     
87     
88     return 0;
89 }

 

 

    

  增删改查操作成功后,结果显示:

   

 

   

 

 

 

 

   

 

标签:顺序,return,int,length,printf,数据结构,data
From: https://www.cnblogs.com/romantichuaner/p/17553952.html

相关文章

  • 数据结构 查找 红黑树查找
    1.红黑树的定义红黑树可以看作是对平衡二叉树的进一步改进。平衡二叉树的一个缺点在于插入和删除操作中为了维持平衡会消耗很大的执行代价,降低效率。红黑树的结构是在平衡二叉树的平衡标准上稍微放宽得到的。红黑树的定义:......
  • 数据结构练习笔记——输出单链表倒数第k个元素
    输出单链表倒数第k个元素【问题描述】已知带头结点的非空单链表中存放着若干整数,请找出该链表中倒数第k个元素。【输入形式】第一行:单链表中元素个数m,第二行:单链表中的m个整数,第三行:k值【输出形式】倒数第k个元素的值(不存在倒数第k个元素输出"no")【样例1】输入:5132450......
  • SQL语句执行顺序
    selectdistinct查询列表(要查的字段)from左边的表们s连接类型(left|inner)join右边的表们son连接条件where筛选条件groupby分组的列表(按什么字段分组)havinghaving_conditionorderby排序的字段limitlimitnumber;1f......
  • 数据结构 查找 树形查找
    1.二叉排序树二叉排序树可以提高查找、插入和删除的效率。(1)二叉排序树(BST)的定义定义比较简单,左子树所有结点<根节点<右子树所有结点同时左右子树也分别都是二叉排序树特点:对二叉排序树进行中序遍历,可以得到一个递增有序序列。(2)二叉排序树的插入BST的插入是为了其构造而使......
  • 数据结构(第八章)
    数据结构(第八章)排序一、插入排序1.1、直接插入排序直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。代码展示:#defineMaxSize100//定义一个顺序表结构typedefstruct{intdata[MaxSize+1];//定义一个排序数......
  • 数据结构之线性表
    线性表的定义和操作线性表的定义    线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为L=(a1,a2,...ai,ai+1,...an)几个概念:   相同是指每个数据元素所占空间一样大。   ai是线......
  • 严蔚敏 数据结构 配套教材 PDF
    目录严蔚敏数据结构配套教材PDF下载地址:严蔚敏数据结构配套教材PDF配套教材包括:严蔚敏《数据结构题集》(C语言版).pdf严蔚敏《数据结构》(C语言版)配套题库【名校考研真题+章节题库+模拟试题】严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解严蔚敏《数据结构》(C语言版......
  • Redis底层数据结构
    Redis是什么?Redis是一个键值数据库,以“快”著称Redis是为什么这么快?我们都知道Redis很快,它在接收到一个键值对数据后,能以微妙级别的速度找到数据并快速完成操作。数据库这么多,为啥Redis能有这么突出的表现呢?一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速......
  • 九、顺序消息
    顺序消息是ApacheRocketMQ提供的一种高级消息类型,支持消费者按照发送消息的先后顺序获取消息,从而实现业务场景中的顺序处理。相比其他类型消息,顺序消息在发送、存储和投递的处理过程中,更多强调多条消息间的先后顺序关系。应用场景在有序事件处理、撮合交易、数据实时增量同......
  • 数据结构练习笔记——单链表的创建
    单链表的创建【问题描述】从键盘终端输入若干整数,为其创建带头节点的单链表存储结构【样例输入】51223323345【样例输出】1223323345【样例说明】第一行的数为单链表中元素的个数,后面为各元素的值#include<iostream>usingnamespacestd;structLNode{......