C语言数据结构(3)--顺序存储线性表

简介: 本文目录0. 系列文章索引1. 顺序存储线性表的概念2. 有哪些操作3. 代码实现

0. 系列文章索引

点此查看系列文章


1. 顺序存储线性表的概念

线性表简单的说就是有序的元素集合,像Java里面的List。


数组其实就是一个简单的线性表,但是更多的只能代表线性表的一种存储结构,如果是一个完善的线性表的话,还应该包括删除元素、查询元素、修改元素等操作。


线性表的存储结构最常见的有两大类,一个是用一维数组,一个使用链表,本篇演示一维数组实现的线性,即顺序存储线性表;链表实现的线性表可以称之链式存储线性表。


2. 有哪些操作

显示线性表元素个数

展示线性表的所有元素

获取指定位置元素

在指定位置插入元素

删除指定位置元素

清空线性表

大体上常用的也就这些操作了,下面我们来具体实现下。


3. 代码实现

/*
* 顺序存储线性表
* 作者:熊猫大大
* 时间:2019-09-22
*/
#include<stdio.h>
#define MAXSIZE 100 //最大元素个数
// 线性表的结构体
typedef struct {
  int data[MAXSIZE];
  int count;//当前元素个数
}SequenceList;
// 获取元素个数
int getCount(SequenceList *list)
{
  return list->count;
}
// 显示所有元素
void printList(SequenceList *list)
{
  int i;
  printf("\n所有元素:");
  for (i = 0; i < list->count; i++)
  {
    printf("%d", list->data[i]);
  }
}
// 获取指定位置元素,返回值放入result指向元素
int getData(SequenceList *list, int index, int *result)
{
  if (index<0 || index>list->count - 1)
  {
    return 0;//0表示失败
  }
  *result = list->data[index];
  return 1;//1表示成功
}
// 插入元素
int insertData(SequenceList *list, int index, int input)
{
  int i;
  if (list->count >= MAXSIZE) //满了
  {
    return 0;
  }
  if (index<0 || index>list->count) //不在合理范围
  {
    return 0;
  }
  if (index != list->count) //插入数据不在表尾
  {
    for (i = list->count; i >= index; i--)
    {
      list->data[i] = list->data[i - 1];
    }
  }
  list->data[index] = input;
  list->count++;
  return 1;
}
// 删除指定位置元素
int deleteData(SequenceList *list, int index)
{
  int i;
  if (index<0 || index>list->count - 1) //不在合理范围
  {
    return 0;
  }
  for (i = index; i < list->count - 1; i++)
  {
    list->data[i] = list->data[i + 1];
  }
  list->count--;
  return 1;
}
// 清空所有元素
int clearData(SequenceList *list)
{
  list->count = 0;
}
// 程序入口
int main()
{
  //初始化
  SequenceList sequenceList;
  SequenceList *list = &sequenceList;
  list->count = 0;
  //插入元素
  insertData(list, 0, 1);
  insertData(list, 1, 2);
  insertData(list, 2, 3);
  printList(list);
  //获取元素
  int result = -1;
  getData(list, 1, &result);
  printf("\ngetData:%d", result);
  //删除指定位置元素
  deleteData(list, 1);
  printList(list);
  //清空元素
  clearData(list);
  printList(list);
  printf("\n");
  return 1;
}
相关文章
|
8天前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
133 82
|
9天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
9天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
11天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
12天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
14 0
【数据结构】栈和队列的深度探索,从实现到应用详解
|
1月前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
16天前
|
Linux C++ Windows
栈对象返回的问题 RVO / NRVO
具名返回值优化((Name)Return Value Optimization,(N)RVO)是一种优化机制,在函数返回对象时,通过减少临时对象的构造、复制构造及析构调用次数来降低开销。在C++中,通过直接在返回位置构造对象并利用隐藏参数传递地址,可避免不必要的复制操作。然而,Windows和Linux上的RVO与NRVO实现有所不同,且接收栈对象的方式也会影响优化效果。