线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

简介: 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

实现工具:dev

顺序表功能:

创建一个空的线性表;

在线性表中插入元素;

在线性表中删除元素;

在线性表中查找元素;

代码:(详解请看注释)

#include<stdio.h>
#include<stdlib.h>//动态分配需要的头文件
#define LIST_INIT_SIZE 100
#define LISTNCREAMENT 10
#define OK 1
#define FALSE 0
#define OVERFLOW 2//溢出 
typedef float ElemType;
typedef int Status;
//线性表动态分配内存的顺序存储结构 
typedef struct
{
  ElemType *elem;//存储的基地址 
  int length;//当前长度 
  int listsize;//当前分配的最大容量 
}SqList;
ElemType * p,* q,e;//注意,e要定义为全局变量 
ElemType * newbase;//若存储不够的话,新分配的基地址 
//创建线性表 (空表) 
Status InitList_Sq(SqList &L)
{
  L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//为顺序表分配一片连续的存储空间 
  L.length=0;//初始化当前长度 
  L.listsize=LIST_INIT_SIZE;//初始化当前最大容量 
  return OK; 
}
//线性表的插入
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
  if(i<1||i>L.length+1)//注意长度+1 
  {
    return FALSE;
  }
  if(L.length>L.listsize)//若长度超过了当前最大容量,则需要新开辟空间 
  {
    //realloc的使用 
    newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTNCREAMENT)*sizeof(ElemType));
    if(!newbase)//判断新空间是否开辟 
    {
      exit(OVERFLOW);
    }
    L.elem=newbase;//将结构体中的数据更新 
    L.listsize+=LISTNCREAMENT;
  }
  q=&(L.elem[i-1]);//p指向的是第i个元素 
  for(p=&L.elem[L.length-1];p>=q;--p)
  //插入时,需要从最后一个元素开始往后挪
  //p指向的是数据中的最后一个元素,其中第i个元素也要进行挪位 
  {
    *(p+1)=*p; 
  }
  *q=e;//将插入的元素e插入进去 
  ++L.length;//顺序表的长度加一  
  return OK;
 } 
//删除操作
ElemType ListDelete_Sq(SqList &L,int i, ElemType &e)
{
  if(i<1||i>L.length)//注意边界 
  {
    return FALSE;
  }
  p=&L.elem[i-1];//p是要删除的第i个元素 
  e=*p;//将删除的元素赋值给e 
  q=L.elem+L.length-1;//表尾元素的位置 
  for(++p;p<=q;++p)//将元素往前移动 
  {
    *(p-1)=*p;
  }
  --L.length;//长度减一 
  return e; 
 } 
//查找
int LocateElem_Sq(SqList L,ElemType e)
{
  int i;
  i=1;
  while(i<=L.length&&L.elem[i-1]!=e)
  {
    ++i;
  }
  if(i<L.length)
  {
    return i;
  }
  else return FALSE;
 } 
int main()
{
  Status i,j;
  SqList La;
  //创建空表 
  InitList_Sq(La);
  //将表赋值为1 2 3 4 5 
  for(i=1;i<=5;i++)
  {
    ListInsert_Sq(La,i,i);
  }
  //输出顺序表 
  for(i=0;i<5;i++)
  {
    printf("%f ",La.elem[i]);
  }
  printf("\n");
  //在顺序表的第二个位置插入11 
  ListInsert_Sq(La,2,11);
  //输出新表 
  for(i=0;i<La.length;i++)
  {
    printf("%f ",La.elem[i]);
  }
  printf("\n");
  //删除顺序表的第4个元素 
  ListDelete_Sq(La,4,e);
  for(i=0;i<La.length;i++)
  {
    printf("%f ",La.elem[i]);
  }
  printf("\n");
  //查找顺序表中元素11,并返回其位置 
  j=LocateElem_Sq(La,11);
  printf("%d ",j);
  return 0;
}

image.png

相关文章
|
24天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
24天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
26天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
26天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
26天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
5天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
5天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
06_用栈来求解汉诺塔问题
06_用栈来求解汉诺塔问题
05_用一个栈实现另一个栈的排序
05_用一个栈实现另一个栈的排序