数据结构与算法 | 顺序表的静态分配

news/2024/5/20 6:45:00 标签: 顺序表

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

顺序表线性表的一种存储结构。

什么是线性表?

线性表是一种常用的数据结构。其数据元素之间在逻辑上具有“一对一”的关系。所谓的“一对一”,就是除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表)。类似的,在逻辑上具有“一对多”的关系的数据结构是:树。在逻辑上具有“多对多”的关系的数据结构是:图。

什么是顺序表

线性表在逻辑上是是“一对一”的关系,把这些具有“一对一”关系的数据存储到物理内存中有两种方式:一是,存储在连续的内存中,这就是顺序存储结构,即顺序表。二是,存储在不连续的内存中,这就是链式存储结构,即链表。请看下图:

顺序表与数组有何不同?

顺序表,最终是借助数组(静态数组或动态数组)来实现的,所以,顺序表,简单理解就是数组。如果要做区分的话,简单地认为顺序表是数据结构里的概念,数组是编程语言中的概念。

顺序表的基本操作(用静态数组实现)

1、顺序表的结构定义

2、创建一个顺序表:(5,2,0,13,14)

3、查找操作

4、替换旧元素old_elem为新元素new_elem

5、替换位置pos上的数据为elem

6、插入操作

7、删除操作

以上就是关于顺序表的一些介绍及线性表的一些操作,如:插入、删除、查找、替换等。可以发现,顺序表的插入与删除操作代价很高,插入或者删除元素都要移动很多元素。

欢迎关注小编,每天与小编一起打卡学习。每天进步一点点,加油!

程序运行结果:

完整代码:

/*----------------------------------------------------------------------------------------
  
  程序说明:顺序表
    微信公众号:嵌入式大杂烩

----------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>

/* 数组长度及顺序表的初始化长度 */
#define MAX_SIZE 10
#define LEN    5

/* 数据元素类型 */
typedef int SqType; 

/* 顺序表的结构定义 */
typedef struct Sqlist
{
  SqType elem[MAX_SIZE];  // 存放顺序表元素的数组
  int length;        // 顺序表的长度
}Sqlist;

//函数的声明
Sqlist create_list(void);                    // 初始化顺序表
void printf_list(Sqlist l);                    // 打印顺序表
int serch(Sqlist l, SqType elem);                 // 查找元素位置  
Sqlist replace_elem(Sqlist l, SqType old_elem, SqType new_elem);// 替换旧元素old_elem为新元素new_elem
Sqlist replace_pos(Sqlist l, int pos, SqType elem);        // 替换位置pos上的元素为elem
Sqlist insert(Sqlist l, int pos, SqType elem);          // 插入新元素
Sqlist delete(Sqlist l, int pos);                // 删除元素

int list[LEN] = {5, 2, 0, 13, 14};  // 用于初始化顺序表

/*******************************************************************************************************
** 函数: main,主函数
**------------------------------------------------------------------------------------------------------
** 参数: void
** 返回: 无
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
int main(void)
{
  Sqlist l;
  int pos = 0;
  int serch_elem = 13;
  
  /* 创建一个顺序表:(5, 2, 0, 13, 14) */
  l = create_list();  
  printf("创建的顺序表为:");
  printf_list(l);    // 打印输出顺序表
  
  /* 把旧元素0替换为新元素1 */
  l = replace_elem(l, 0, 1);
  printf("把0替换为1得到的新顺序表为:");
  printf_list(l);    
  
  /* 把第1个位置上的元素改为10 */
  l = replace_pos(l, 1, 10);
  printf("第一个位置改为10得到的新顺序表为:");
  printf_list(l);    
  
  /* 往第二个位置插入新元素99 */
  l = insert(l, 2, 99);
  printf("第二个位置插入99得到的新顺序表为:");
  printf_list(l);    
  
  /* 删除第二个位置上的元素 */
  l = delete(l, 2);
  printf("删除第二个位置元素得到的新顺序表为:");
  printf_list(l);    
  
  pos = serch(l, serch_elem); // 查找serch_elem在该顺序表l中的第几个位置
  printf("元素%d在顺序表的第%d个位置\n", serch_elem, pos);
  
  return 0;
}

/*******************************************************************************************************
** 函数: create_list,创建一个顺序表
**------------------------------------------------------------------------------------------------------
** 参数: void
** 返回: 创建成功的顺序表
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
Sqlist create_list(void)
{
  Sqlist l;
  
  for(int i = 0; i < LEN; i++)
  {
    l.elem[i] = list[i];
  }
  l.length = LEN; // 顺序表长度
  
  return l;  // 创建成功的顺序表
}

/*******************************************************************************************************
** 函数: serch,查找元素elem在顺序表l的第几个位置
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表   elem:要查找的元素
** 返回: pos:元素elem的位置  -1:查找失败
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
int serch(Sqlist l, SqType elem)
{
  int i;
  int pos = 0;
  for (i = 0; i < l.length; i++)
  {
    if (elem == l.elem[i])
    {
      pos = i + 1;
      return pos;
    }
  }
  
  return -1;  //查找失败
}

/*******************************************************************************************************
** 函数: replace_elem,把旧元素old_elem替换为新元素new_elem
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表  old_elem:旧元素  new_elem:新元素
** 返回: 替换完成后的新的顺序表l
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
Sqlist replace_elem(Sqlist l, SqType old_elem, SqType new_elem)
{
  int old_elem_pos;
  
  old_elem_pos = serch(l, old_elem);  // 首先查找旧元素所在的位置
  l.elem[old_elem_pos - 1] = new_elem;
  
  return l;   // 返回新生成的顺序表
}

/*******************************************************************************************************
** 函数: replace_pos,把第pos个位置上的元素替换为elem
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表  pos:位置  elem:元素
** 返回: 替换完成后的新的顺序表l
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
Sqlist replace_pos(Sqlist l, int pos, SqType elem)
{
  l.elem[pos - 1] = elem;
  
  return l; // 返回新生成的顺序表
}

/*******************************************************************************************************
** 函数: insert,把元素elem插入到顺序表l的第pos个位置
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表  pos:位置  elem:元素
** 返回: 插入元素后得到的新的顺序表l
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
Sqlist insert(Sqlist l, int pos, SqType elem)
{
  int i;
  /* 插入的位置不存在或则表长已经达到顺序表的最大允许值 */
  if (pos < 0 || pos > l.length || l.length >= MAX_SIZE)
  {
    printf("%s:插入错误!\n", __FUNCTION__);
    return l;
  }
  
  l.length += 1;  // 插入新元素,表长加一
  
  /* 从第pos个位置开始所有元素往后移一个元素长度 */
  for (i = l.length-1; i >= pos-1; i--)
  {
    l.elem[i+1] = l.elem[i];
  }
  
  l.elem[pos-1] = elem;  // 插入的新元素
  
  return l;  // 返回新生成的顺序表
}

/*******************************************************************************************************
** 函数: delete,把第pos个位置的元素删除
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表  pos:位置 
** 返回: 删除元素后得到的新的顺序表l
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
Sqlist delete(Sqlist l, int pos)
{
  int i;
  /* 要删除的位置不存在 */
  if (pos < 0 || pos > l.length)
  {
    printf("%s:删除错误!\n", __FUNCTION__);
    return l;
  }
  
  /* 从第pos个位置开始所有元素前移一个元素长度 */
  for (i = pos-1; i < l.length-1; i++)
  {
    l.elem[i] = l.elem[i+1];
  }
  l.length -= 1;  // 删除一个元素后表长减一
  
  return l;  // 返回新生成的顺序表
}

/*******************************************************************************************************
** 函数: printf_list,打印输出顺序表
**------------------------------------------------------------------------------------------------------
** 参数: l:顺序表  pos:位置 
** 返回: 删除元素后得到的新的顺序表l
** 日期: 2018.12.08 by LiZhengNian
********************************************************************************************************/
void printf_list(Sqlist l)
{
  int i;
  for(i = 0; i < l.length; i++)
  {
    printf("%d ",l.elem[i]);
  }
  printf("(表长为%d)", l.length);
  printf("\n\n");
}

 

 


http://www.niftyadmin.cn/n/504685.html

相关文章

机械设计制造及其自动化需要哪些计算机,【2人回答】我是学机械设计制造及其自动化的,请问笔记本电脑和台式电脑各需什么配置?-3D溜溜网...

回答&#xff1a;首先机械设计专业少不了有三维图纸设计实践&#xff0c;这是对电脑性能、尤其是显卡性能要求最高的部分&#xff0c;因此电脑的配置应该以满足三维设计的要求为准。相比之下&#xff0c;其他大部分专业对电脑反而都没有显卡性能的要求&#xff0c;因为显卡主要…

今天在中关村图书城看到自己的书了

今天去中关村图书城去看看有什么新书&#xff0c;我日&#xff0c;一看才知道自己多么需要学习&#xff0c;唉。书真太妈的多&#xff0c;也挺贵的&#xff0c;是本书都不会低于50大洋&#xff0c;真黑&#xff0c;买了三本书差不多到200大洋了&#xff0c;读书也是一种投资吧。…

如何更改计算机里卷标的顺序,Windows7磁盘卷标怎么改?

系统安装完成之后每个磁盘都会有卷标&#xff0c;这些卷标有可能是乱排列的&#xff0c;所以有些用户比较强迫&#xff0c;一定要卷标按照顺序排列下来&#xff0c;那么这时候就得改了。不过很多用户不懂Windows7磁盘卷标怎么改&#xff1f;为此小编赶紧整理了教程帮助大家&…

C语言 | 分享一个C语言知识点收集程序模板

1024G 嵌入式资源大放送&#xff01;包括但不限于C/C、单片机、Linux等。关注微信公众号【嵌入式大杂烩】&#xff0c;回复1024&#xff0c;即可免费获取&#xff01; 平时需要测试一些比较模糊的知识点&#xff0c;或则想要验证一些函数时&#xff0c;我们常常会建一个test.c文…

IPMSG--Ubuntu手记之软件

因为eva下没法传文件&#xff0c;只好想起用以前那个局域网传数据的好东东&#xff1a;ipmsg。 上网搜了一下&#xff0c;介绍很多&#xff0c;有都是下载源码&#xff0c;自己编译。试了一下&#xff0c;在运行./configure 。。。的时候报无法写文件的错误&#xff1a; error:…

C语言 | windows命令行编译(Cygwin)

1024G 嵌入式资源大放送&#xff01;包括但不限于C/C、单片机、Linux等。关注微信公众号【嵌入式大杂烩】&#xff0c;回复1024&#xff0c;即可免费获取&#xff01; 前言 若要使用Linux环境&#xff0c;可以把Linux操作系统装在真机上&#xff0c;也可以把Linux操作系统安装…

计算机的数制与运算PPT,第1章数制和编码.ppt

文档介绍&#xff1a;第1章 数制和编码本章主要介绍十进制、二进制、和十六进制数之间的转换方法数据在计算机中的表示与运算方法几种常见的字符编码形式11.1 进位计数制计算机中全部信息都采用二进制数&#xff0c;为了书写方便&#xff0c;经常采用十六进制或十进制。二进制&…

小时候想玩的游戏---任天堂n64

最近比较忙&#xff0c;开始研究游戏制作相关的技术&#xff0c;所以没有时间陪这个博客了&#xff0c;今天下载了N64 任天堂的游戏&#xff0c;实在太强大了 6m的东西就模拟出这个游戏出来&#xff0c;真的希望flash 会有这样成熟的技术就好&#xff0c;模拟出这种效果就好。弄…