C++实现基于静态数组的顺序表

本文实例为大家分享了C++实现基于静态数组的顺序表,供大家参考,具体内容如下

实现的基本操作有:

1. 初始化
2. 尾插
3. 尾删
4. 头插
5. 头删
6.查找任意元素
7. 读任意位置元素
8. 修改任意位置元素
9. 查找指定元素值的下标
10. 在任意位置插入元素
11.删除指定位置的元素
12.删除任意元素
13.打印数据

头文件seqlist.h:

#pragma once 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define maxsize 1000//链表最多元素个数

typedef int seqType;
typedef struct seqlist
{
  seqType arr[maxsize];//数据域,存放数据
  size_t size;//size_t是无符号长整型,是一种类型,size在数组中表示元素个数
}seqlist ;

void PrintSeqList(seqlist *seq); //打印数据
void print_seqlist(char *s); //打印标题
void seqlistInit(seqlist *seq); //链表初始化

void seqlistPushBack(seqlist *seq, seqType value); //尾插元素,value是插入元素的值
void seqlistPopBack(seqlist *seq); //尾删元素,value是插入元素的值

void seqlistPushHead(seqlist*seq, seqType value); //头插元素
void seqlistPopHead(seqlist*seq); //头删元素

seqType seqlistFind(seqlist *seq, seqType data); //查找任意元素
seqType seqlistRead_pos(seqlist*seq, size_t pos); //读取任意位置的元素
size_t seqlistFind_pos(seqlist*seq, seqType value); //查找指定元素的下标

seqType seqlistModify(seqlist*seq, size_t pos, seqType data); //修改任意位置的元素
void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data); //在任意位置插入元素

void seqlistErase_pos(seqlist *seq, size_t pos); //删除任意位置的元素
void seqlistRemove(seqlist *seq, seqType data); //删除元素

实现文件seqlist.c

#include"seqlist.h"
void PrintSeqList(seqlist *seq)//打印数据
{
  size_t i = 0;
  if (seq->size == 0)
  {
    printf("线性表为空,打印结束\n");
    return;
  }
  for (i = 0; i < seq->size; i++)
  {
    printf("下标为%d的元素是:%d\n",i, seq->arr[i]);
  }
  printf("\n");
}

void print_seqlist(char *s)//打印标题
{
  int i = 0;
  printf("%s\n",s);
  printf("\n");
}

void seqlistInit(seqlist *seq)//链表初始化
{
  assert(seq);
  seq->size = 0;//有效元素赋值为0;
}

void seqlistPushBack(seqlist *seq, seqType value)//尾插元素,value是插入元素的值
{
  assert(seq);//判断指针是否为空
  if (seq->size == maxsize)
  {
    printf("元素已满,无法插入\n");
    return;
  }
  else
  seq->arr[seq->size++] = value;
}

void seqlistPopBack(seqlist *seq)//尾删元素,value是插入元素的值
{
  assert(seq);//判断指针是否为空
  if (seq->size ==0)
  {
    printf("内容已为空,无法删除\n");
    return;
  }
  else
    seq->size--;
}

void seqlistPushHead(seqlist *seq, seqType value)//头插元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == maxsize)
  {
    printf("元素已满,无法插入\n");
    return;
  }
  else
  {
    int i = seq->size - 1;
    for (; i >= 0; i--)
    {
      seq->arr[i + 1] = seq->arr[i];
    }
    seq->arr[0]=value;
    seq->size++;
  }
}

void seqlistPopHead(seqlist *seq)//头删元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容已为空,无法删除\n");
    return;
  }
  else
  {
    size_t i =1;
    for (; i < seq->size; i++)
    {
      seq->arr[i - 1] = seq->arr[i];
    }
    seq->size--;
  }
}

seqType seqlistFind(seqlist *seq, seqType data)//查找任意元素
{
  size_t i = 0;
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("线性表为空\n");
    return -1;
  }
  for (i = 0; i < seq->size - 1; i++)
  {
    if (seq->arr[i] == data)
    {
      return seq->arr[i];
    }
  }
  return -1;
}

seqType seqlistRead_pos(seqlist *seq, size_t pos)//读取任意位置的元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容为空,无法读取内容\n");
    return -1;
  }
  else if (pos> seq->size)
  {
    printf("读取位置错误\n");
  }
  else
      return seq->arr[pos];
}

size_t seqlistFind_pos(seqlist *seq, seqType value)//查找指定元素的下标
{
  assert(seq);//判断指针是否为空
  size_t i= 0;
  for (; i < seq->size; i++)
    {
      if (seq->arr[i] == value)
        return i;
    }
  return -1;
}

seqType seqlistModify(seqlist *seq, size_t pos, seqType data)//修改任意位置元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容为空,无法修改内容\n");
    return -1;
  }
  for (; pos < seq->size; pos++)
  {
    seq->arr[pos] = data;
    return seq->arr[pos];
  }
}

void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data)//在任意位置插入元素
{
  assert(seq);
  if (seq->size == maxsize)
  {
    printf("内容已满,无法继续插入内容\n");
    return;
  }
  else if (pos>seq->size)
  {
    printf("非法位置,不允许插入\n");
    return;
  }
  else
  {
    size_t m= seq->size ;
    for (m = seq->size; m > pos; m--)
    {
      seq->arr[m] = seq->arr[m-1];
    }
    seq->arr[pos] = data;
    seq->size++;
  }
}

void seqlistErase_pos(seqlist *seq, size_t pos)//删除任意位置的元素
{
  assert(seq);
  if (seq == NULL)
  {
    printf("内容已为空!\n");
    return;
  }
  else if (pos > seq->size)
  {
    printf("该位置无法删除!\n");
    return;
  }
  else
  {
    size_t i ;
    for (i = pos; i < seq->size-1; i++)
    {
      seq->arr[i] = seq->arr[i+1];
    }seq->size--;
  }
}

void seqlistRemove(seqlist *seq, seqType data)//删除元素
{
  assert(seq);//判断指针是否为空
  size_t i = 0;
  i = seqlistFind_pos(seq,data);
  if (i >= 0)
  {
    while (i <seq->size)
    {
      seq->arr[i] = seq->arr[i + 1];
      i++;
    }
    seq->size--;
    return;
  }
  else
  {
    printf("没有找到该元素");
    return;
  }
}

在进行插入、删除等操作中,若对元素的位置移动不清楚的借助画图能更好地理解。

测试函数test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"

void Test_PushBack()//测试顺序表尾插元素
{
  print_seqlist("*****尾插3个元素至顺序表*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
}

void Test_PopBack()//测试顺序表尾删元素
{
  print_seqlist("*****尾删顺序表中的1个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistPopBack(&seq);
  PrintSeqList(&seq);

}

void Test_PushHead()//头插元素
{
  print_seqlist("*****头插顺序表中的3个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushHead(&seq, 2);
  seqlistPushHead(&seq, 4);
  seqlistPushHead(&seq, 6);
  PrintSeqList(&seq);

}

void Test_PopHead()//头删元素
{
  print_seqlist("*****头删顺序表中的1个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushHead(&seq, 2);
  seqlistPushHead(&seq, 4);
  seqlistPushHead(&seq, 6);
  PrintSeqList(&seq);
  seqlistPopHead(&seq);
  PrintSeqList(&seq);

}

void Test_Find()//查找任意元素
{
  print_seqlist("*****查找顺序表中的任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  int temp = 0;
  temp = seqlistFind(&seq,2);
  printf("查找到的元素是%d\n", temp);
  printf("\n");
}

void Test_Read_pos()//读取任意位置元素
{
  print_seqlist("*****查找顺序表中的任意位置的元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  int temp = 0;
  temp=seqlistRead_pos(&seq, 1);
  printf("下标为1的元素是%d\n", temp);
  printf("下标为4的元素是:");
  seqlistRead_pos(&seq, 4);
  printf("\n");
}

void Test_seqlistFind_pos()//测试查找指定元素的下标
{
  print_seqlist("*****查找顺序表中指定元素的下标*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  seqlistPushBack(&seq, 7);
  PrintSeqList(&seq);
  size_t pos = seqlistFind_pos(&seq, 4);
  size_t pos1 = seqlistFind_pos(&seq, 9);
  printf("元素4的下标为:%d\n", pos);
  printf("元素9的下标为:%d,元素不存在\n", pos1);
  printf("\n");
}

void Test_seqlistModify()//修改任意位置元素
{
  print_seqlist("*****修改顺序表中任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  seqlistPushBack(&seq, 7);
  PrintSeqList(&seq);
  int temp = seqlistModify(&seq, 1, 3);
  int temp1 = seqlistModify(&seq, 2, 8);
  PrintSeqList(&seq);
  printf("修改下标为1的元素为:%d\n", temp);
  printf("修改下标为2的元素为:%d\n", temp1);

}

void Test_seqlistInsert()//在任意位置插入元素
{
  print_seqlist("*****在顺序表中任意位置插入元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistInsert_pos(&seq, 2, 3);
  PrintSeqList(&seq);
  seqlistInsert_pos(&seq, 8, 9);
}

void Test_seqlistErase_pos()//删除任意位置元素
{
  print_seqlist("*****在顺序表中删除任意位置元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistErase_pos(&seq, 1);
  seqlistErase_pos(&seq, 4);
  PrintSeqList(&seq);
}

void Test_Remove()//删除任意元素
{
  print_seqlist("*****在顺序表中删除任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistRemove(&seq, 4);
  PrintSeqList(&seq);
}

int main()
{
  Test_PushBack();
  Test_PopBack();
  Test_PushHead();
  Test_PopHead();
  Test_Find();
  Test_Read_pos();
  Test_seqlistFind_pos();
  Test_seqlistModify();
  Test_seqlistInsert();
  Test_seqlistErase_pos();
  Test_Remove();
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 如何在C++中建立一个顺序表

    准备数据 复制代码 代码如下: #define MAXLEN 100 //定义顺序表的最大长度struct DATA{ char key[10]; //结点的关键字  char name[20]; int age;};struct SLType //定义顺序表结构 { DATA ListData[MAXLEN+1];//保存顺序表的结构数组 int ListLen;   //顺序表已存结点的数量 }; 定义了顺序表的最大长度MAXLEN.顺序表数据元素的类型DATA以及顺序表的数据结构SLTyp

  • C++实现动态顺序表(vector)

    vector是连续存储结构,支持随机的高效的随机和在尾部进行插入.删除操作,其它位置的插入.删除操作相对来说效率较低. vector相当于一个数组,但它的数组空间大小需要写一程序来实现. 它的内存分配原理大概可分为下面几步: 1)首先分配一块内存空间进行存储: 2)当所需存储的数据超过分配的空间时,再重新分配一块空间: 3)将旧元素复制到新空间: 4)释放旧空间. 实现代码如下: vector.h #pragma once #include<stdio.h> #include<asser

  • C++顺序表的实例代码

    本文实例为大家分享了C++实现顺序表的具体代码,供大家参考,具体内容如下 #include <iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList() :_a(NULL) , _size(0) , _capacity(0) {} SeqList(const SeqList& s) :_a(new DataType[s._size]) , _size(s._size) ,

  • C++实现动态顺序表

    本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下 Vector.h #pragma once #include <stdio.h> #include <iostream> #include <assert.h> #include <string.h> using namespace std; typedef int DataType; class Vector { public: Vector() :_first(NULL) ,

  • C++顺序表的基本操作(使用模版类)

    本文实例为大家分享了C++顺序表的基本操作,供大家参考,具体内容如下 一.遇到问题: 原因:类的函数定义不能放在SeqList.cpp中,必须放在Seqlist.h(类的函数声明和定义放在同一个文件下)中,否则 会出现以下问题. 二.实现程序: 1.SeqList.h #ifndef SeqList_h #define SeqList_h #include <iostream> using namespace std; const int defaultSize = 100; template

  • C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include<iostream> using namespace std; #define MAXSIZE 15 typedef int DataType; typedef struct { DataType data[MAXSIZE]; //通常用一位数组来描述顺序表的数据存储 int SeqLength; /*线性表长度*/ } SeqList; SeqList *Init

  • 利用C++简单实现顺序表和单链表的示例代码

    本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 一.顺序表示例代码: #include <assert.h> #include <iostream> using namespace std; typedef int Datatype; class SeqList { public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) { } SeqList(const

  • C++实现顺序表的方法

    废话不多说了,直接给大家上关键代码了. #pragma once #include <assert.h> template<class T> class SeqList { public: SeqList() :_a(NULL) ,_size(1) ,_capacity(1) {} SeqList(T* a, size_t size) :_a(new T[size]) ,_size(size) ,_capacity(size) { for (size_t i = 0; i <

  • C++实现基于静态数组的顺序表

    本文实例为大家分享了C++实现基于静态数组的顺序表,供大家参考,具体内容如下 实现的基本操作有: 1. 初始化 2. 尾插 3. 尾删 4. 头插 5. 头删 6.查找任意元素 7. 读任意位置元素 8. 修改任意位置元素 9. 查找指定元素值的下标 10. 在任意位置插入元素 11.删除指定位置的元素 12.删除任意元素 13.打印数据 头文件seqlist.h: #pragma once #include<stdio.h> #include<stdlib.h> #include

  • JAVA基于静态数组实现栈的基本原理与用法详解

    本文实例讲述了JAVA基于静态数组实现栈.分享给大家供大家参考,具体如下: 1.栈的定义 栈是一种"先进后出"的一种线性数据结构,有压栈出栈两种操作方式.如下图: 2.栈的分类 栈主要分为两类: 静态栈 动态栈 [静态栈] 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶元素. [动态栈] 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶节点. 此节我们在我们之前封装的动态数组的基础上(引用封装好的动态数组),实现基本的栈操作. 3.栈实现 1.先定义一

  • C语言 数据结构之数组模拟实现顺序表流程详解

    目录 线性表和顺序表 线性表 顺序表 静态顺序表 动态顺序表 代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,这是我们广泛使用的数据结构. 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 常见的线性表:顺序表.链表.栈.队列.字符串- 顺序表 顺序表是用一段物理地址连

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

  • C#实现顺序表(线性表)完整实例

    本文实例讲述了C#实现顺序表(线性表)的方法.分享给大家供大家参考,具体如下: 基本思想是使用数组作为盛放元素的容器,数组一开始的大小要实现确定,并使用一个Pointer指向顺序表中最后的元素.顺序表中的元素是数组中元素的子集.顺序表在内存中是连续的,优势是查找,弱势是插入元素和删除元素. 为避免装箱拆箱,这里使用泛型,代替object.使用object的例子可以参照本站这篇文章:http://www.jb51.net/article/87603.htm,这个链接中的例子实现的是队列,并没 有使

  • C语言实现动态顺序表的实现代码

    C语言实现动态顺序表的实现代码 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 静态实现:结构体内部只需两个成员,其中一个为固定大小(MAX)的数组,用来存放我们的数据.数组大小我们可以通过在头文件中改变MAX的值来改变. 动态实现:在内存中开辟一块空间,可以随我们数据数量的增多来扩容. 来看看动态的顺序表实现: 1.seqli

  • 什么是Python中的顺序表

    1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间Maxsize,用elem记录基地址,用length记录实际的元素个数,即顺序表的长度 上图1表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元

  • C语言实现动态顺序表详解

    目录 什么是顺序表? 1. 定义顺序表结构体: 2. 初始化顺序表: 3. 销毁顺序表: 4. 打印顺序表: 5. 判断容量+扩容: 6. 头插数据: 7. 尾插数据: 8. 指定下标位置插入数据: 9. 删除数据: 10. 尾删数据: 11. 指定下标位置删除数据: 12. 查找数据: 13. 修改数据: 14. 源代码: 1. SeqList.h: 2. SeqList.cpp: 3. test.cpp: 15. 测试: 总结 什么是顺序表? 顺序表是在计算机内存中以数组的形式保存的线性表,

  • C语言编程简单却重要的数据结构顺序表全面讲解

    目录 前言 一.线性表定义 二.顺序表实现 1概念及结构 2静态顺序表 2.1实现顺序表接口,第一步要对顺序表进行初始化 2.2对顺序表的增删查改的接口函数(以尾插为例) 3动态顺序表 3.1动态顺序表初始化 3.2动态顺序表-尾插 3.3动态顺序表-头插 3.4动态顺序表-尾删 3.5动态顺序表-头删 3.6动态顺序表-任意位置插入数据 3.7动态顺序表-任意位置删除数据 结束 前言 本文主要介绍顺序表的定义和常见静态顺序表的用法. 一.线性表定义 线性表(line list)是n个具有相同特

  • C语言动态顺序表实例代码

    目录 顺序表概念: 一.准备工作 二.顺序表的基本操作  1.顺序表的初始化函数 2.尾插函数(在尾部插入数据) 3.头插函数(在数组头部插入数据)  4.尾删函数 5.头删函数 6.在第pos的位置插入数据 7.删除第pos个位置的数据 8.修改第pos个位置的数据 9.查找函数. 10.销毁函数 11.打印函数 三.总代码: 顺序表概念:         顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构.一般情况下用数组存储.在数组上完成数据的增删查改. 代码解析: 一.准备工

随机推荐