数据结构静态顺序表

2023-11-16

顺序表:用一段地址连续存储单元依次存储数据元素的线性结构

 

//seqlist.h
#pragma once//防止头文件重复包含
#define MAX_SIZE 10
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

 

实现基于静态数组的顺序表的以下基本操作: 
首先先定义一个结构体类型seqlist( arr【】,size(有效的元素个数)),

 

预定义一个数组的最大长度,将整型数据变量typedef为datatype,为了以后在插入删除别的类型时方便修改

  1. 初始化 void InitSeq(seqlist *s) 
    将数组的size置为0,不需要给每个元素进行赋值,
  2. 尾插 void SeqListPushBack(seqlist *s,int data) 
    首先要判断是否为空数组,并且是否有空余位置插入,将数组的size+1,把元素放入最后一个位置。
  3. 尾删void SeqListPophBack(seqlist *s) 
    只需将size-1即可,也得先判断是否为空数组
  4. 头插 void SeqListPushFront(seqlist *s, int data) 
    首先要判断是否为空数组,并且是否有空余位置插入。把数组整体向后移一位(先移动最后一个元素),将第0号元素空出来,把需要插入的元素放入即可,size++。
  5. 头删 void SeqListPopFront(seqlist *s) 
    判断是否为空数组,若不是,把后边的元素整体向前移(先移动第一个元素),size--。
  6. 查找任意位置元素 void SeqListFind(seqlist *s, int pos) 
    判断是否为空数组,直接输出给定位置的元素还得判断给的位置是否超出数组最大范围
  7. 修改任意位置元素void UpdateData(seqlist *s, int pos, int data) 
    判断是否为空数组还得判断给的位置是否超出数组最大范围, 先找到这个位置元素,将其值进行修改,
  8. 查找指定元素值的下标void SeqListFind(seqlist *s, int data) 
    判断是否为空数组还得判断给的位置是否超出数组最大范围,给定一个元素,遍历,判断是否与数组内的元素相等,若不相等,count++,
  9. 在任意位置插入元素void SeqListInsert(seqlist *s, int pos,int data) 
    首先要判断是否为空数组,并且是否有空余位置插入还得判断给的位置是否超出数组最大范围,将(下标+1)的元素依次向后移动,再将给定元素插入给定位置,size+1; 
    10.在任意位置删除元素 void SeqListDelete(seqlist *s,int  pos)
    要判断是否为空数组,将给定位置的下一个元素向前覆盖,依次到最后一个元素,size-1。

#include"seqlist.h"
typedef int DataType;
typedef struct SeqList
{
	int arr[MAX_SIZE];  // 最大元素个数
	int size;        //有效元素个数
}seqlist;


以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。

 

各种函数主体:

 

 

void InitSeq(seqlist *s)//初始化静态线性表
{
  assert(s);
  if(s == NULL)
  {
       return;
  }
   s->size = 0;
}
void SeqListPrint(seqlist *s)//打印整个数组
{
   size_t i = 0;
   assert(s); 
   for(;i < s->size;i++)    
   {
   printf("%d",s->arr[i]);
   }
   printf("\n");
}

void SeqListPopBack(seqlist *s)//尾删
{
   assert(s);
   if(s == NULL)
   {
   return;
   }
   s->size--;
}

void SeqListPushBack(seqlist *s,DataType data)//尾部插入
{
  assert(s);
  if(s == NULL)
  {
  return ;
  }
  if(s->size > MAX_SIZE)
  {
   return;
  }
   s->arr[s->size] = data;//size为有效元素个数,从0开始,相当于最后一个为空元素,所以可以直接赋值
   s->size++;             //指向size下一个空元素
}
 
void SeqListPushFront(seqlist *s,int data)//头插
{
	int i = 0;
	assert(s);
	if(s == NULL)
	{
	 return;
	}
	if(s->size>MAX_SIZE)
	{
	return;
	}
	++s->size;   
	for(i = s->size;i>0;i--)
	{
		s->arr[i] = s->arr[i - 1];
	}
	s->arr[0] = data;
}
void SeqListPopFront(seqlist *s)//头删
{   int i = 0;
    assert(s);
    if (s == NULL)
    {
        return;
    }
    for ( i = 1; i <= s->size; i++)
    {
        s->arr[i - 1] = s->arr[i];
    }
    s->size--;
}

int  SeqListFind(seqlist *s,int data)//查找指定元素
{
   int i = 0;
   assert(s);
   if(s == NULL)
   {
   return -1;
   }
   for(i=0;i<s->size;i++)
   {
	   if(s->arr[i] == data)
	   {
	   return i;
	   }
   }
   return -2;
}

void SeqListInsert(seqlist *s,int pos,int data)//任意(pos)位置插入
{
       int i = 0;
	   if((s == NULL)||!((pos <= s->size) && pos >= 0))
	   {
		   printf("数据越界");
	   return ;
	   }
	   if(10 == s->size )
	   {
	   printf("表以满");
	   }
	   s->size++;
	   for(i = s->size;i>pos;i--)
	   {
		   s->arr[i] = s->arr[i - 1];
	   }
	   s->arr[pos] = data;
}

void SeqListDelete(seqlist *s,int pos)//删除下标为pos的元素
{
   int i = 0;
   assert(s);
   if(s ==NULL)
   {
   return;
   }
   for(i = pos;i<s->size;i++)
   {
	   s->arr[i] = s->arr[i + 1];
   }
   s->size--;

}

void SeqListRemoveall(seqlist *s,int data)//删除所有data元素
{  
   int i = 0;
   int count = 0;
   assert(s);
   for(i=0;i<s->size;i++)
   {
	   if(s->arr[i] == data)
	   {
	   count++;
	   }
	   else
	   {
		   s->arr[i - count] = s->arr[i];//发现几个data向前移动几个
	   }
	   s->size -= count;
   }
}

int BinarySearch(seqlist *s,int data)
{
   int left = 0;
   int right = s->size;
   while(left<right)
   {
	   int mid = left + ((right - left) >> 1);
	   if(data == s->arr[data])
	   {
	   return mid;
	   }
	   else if(data>mid)
	   {
	   left = mid + 1;
	   }
	   else
	   {
	   right = mid ;
	   }
   }
   return 0;
}


测试部分:

 

void test()
{
   seqlist s;
   int tmp;
   InitSeq(&s);
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   SeqListPushBack(&s,3);
   SeqListPushBack(&s,4);
   printf("初始化,尾插后的数组: \n");
   SeqListPrint(&s);

   printf("/\n");
   SeqListPopBack(&s);
   printf("尾删后的数组:\n");
   SeqListPrint(&s);

   printf("/\n");
   SeqListPushFront(&s,0);
   printf("头插后的数组:\n");
   SeqListPrint(&s);

   printf("/\n");
   SeqListPopFront(&s);
   printf("头删后的数组: \n");
   SeqListPrint(&s);

   printf("\n");
   tmp = SeqListFind(&s,2);
   printf("arr[1]的元素位置为:%d\n",tmp);

   printf("\n");
   SeqListInsert(&s,0,9);
   printf("任意位置插入后的数组: \n");
   SeqListPrint(&s);

   printf("\n");
   SeqListDelete(&s,0);
   printf("删除位置为0元素的数组: \n");
   SeqListPrint(&s);

   printf("\n");
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   SeqListPushBack(&s,1);
   SeqListPushBack(&s,2);
   printf("删除前数前:");
   SeqListPrint(&s);
   SeqListRemoveall(&s,2);
   printf("删除所有data元素后:  \n");
   SeqListPrint(&s);
}

主函数:

 

int main()
{
   test();
   system("pause");
   return 0;
}


 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构静态顺序表 的相关文章

随机推荐

  • C#枚举 及其API C#学习杂记(九)

    C 中有两种基本类型 值类型 引用类型 本文要说的是值类型中的 枚举 1 枚举的意义 我们玩角色扮演游戏的时候 角色一般来说有多种 战士 法师 射手等 我们可以用 0 1 2来分别代表这三种角色类型 角色类型 类型编号 战士 0 法师 1
  • 如何使用Pip卸载软件包?

    Python Pip command provides search install update uninstall packages We can use pip command to uninstall packages easily
  • 收集到的 hls rtmp rtsp 视频流测试地址

    收集到的 hls rtmp rtsp 视频流测试地址 hls https video dev github io streams x36xhzz x36xhzz m3u8 http live hkstv hk lxdns com live
  • JS常用方法

    以下为web开发中常用到的js方法 收集并整理出来 简单的就不写出来了 1 2 lt HTML gt 3 lt HEAD gt 4 lt TITLE gt New Document 5 lt META N
  • 机器学习——线性模型之Softmax回归

    问 Softmax回归模型是一种典型处理多分类任务的非线性分类模型 答 错误 Softmax回归是线性分类模型 实际上是逻辑回归的拓展 它将逻辑回归的二分类推广到了多分类 用逻辑回归的方法解决多分类问题 线性模型 Softmax回归 Sof
  • Python常见面试题

    Python 30道高频面试题及详细解答 1 如何用一行代码生成 1 3 5 7 9 11 13 15 17 19 2 写一个等差数列 产生一个首项为8 公差为12 末项不大于100的列表 3 一行代码求1到1000内的整数和 4 字典按V
  • 工业智能网关在热交换站管理中的应用

    随着城镇化进程的推进 我国供暖行业的集中供暖需求不断增加 中央供暖热源一般是将热源供应站生产出来的高温蒸汽或温水通过一次热管输送到热交换站 热交换站则是通过热交换器的热交换循环进行热交换 然后再通过二次供应管向家家户户输送热量 热水通过室内
  • Selenium教程__获取元素文本、属性值、尺寸(8)

    本文将介绍如何使用Selenium来获取元素的文本内容 属性值和尺寸 并展示一些实际应用场景 学习本文内容将能够轻松地获取并利用元素的相关信息 从而更好地进行元素的验证 操作和断言 from selenium import webdrive
  • jmeter获取图片验证码-解密图片并识别

    说明 关于图片验证码的处理方式有三种方法 一是让开发屏蔽验证码 二是让开发后端指定一个万能验证码 三是使用OCR工具进行图片验证码的解密及识别 推荐使用前两种方法最省事 OCRServer工具识别图片验证码 由于没有对图片进行降噪 所以识别
  • 泰迪杯数据挖掘挑战赛C题 通用论坛正文提取

    参与第五届泰迪杯 侥幸获得二等奖 简单记录一下 一 问题的背景 在当今的大数据时代里 伴随着互联网和移动互联网的高速发展 人们产生的数据总量呈现急剧增长的趋势 当前大约每六个月互联网中产生的数据总量就会翻一番 互联网产生的海量数据中蕴含着大
  • 1. VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方案

    引起此错误一般是因为运行库路径设置错误 导致找不到头文件 afxres h 解决方案 1 运行VC 选择 工具 按钮 选择 选项 如图 VC6 0致命错误
  • LS1028使用原生RGMII软件修改方案

    LS1028的网络拓扑结构 forlinx的开发板目前只做了五路网口 原生的RGMII并没有配置出来 默认将相关引脚功能用作了音频信号 若将该引脚功能用作了RGMII 音频功能就不能使用了 本人主要介绍软件上的修改 对于硬件原理部分是有硬件
  • bat删除文本文件每行前几个字符

    echo off set fn a txt for f usebackq delims i in fn do echo i gt con set h i setlocal enabledelayedexpansion echo h 4 en
  • 【预测模型-RBF预测】基于RBF神经网络实现腐蚀失重数据预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • windows版docker安装运行nacos配置连接数据库

    1 docker安装nacos 下载镜像 docker pull nacos nacos server 下载加载完成之后查看本地镜像 看看拉到本地没有 docker images 启动镜像 docker run d p 8849 8848
  • Mybatis学习笔记--1:先跑起来再说

    MyBatis 本是apache的一个开源项目iBatis 2010年这个项目由apache software foundation 迁移到了google code 并且改名为MyBatis 是一个基于Java的持久层框架 无论是Mybat
  • [诗歌] 断章

    你站在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了别人的梦 转载至 http baike baidu com link url CryedmfRUvN f04J9seKNbNNojxFQ4FmvF2 P7scQmAQWGq
  • 微信小程序静态页面的实现

    项目地址 github 前段时间微信出了个小程序 我也学习了一下 自己实现了一个小程序 当然里面都是静态页面 并无数据的操作 要开发小程序就得用微信的开发工具了 它现在不限制用户是否有Appid都可以下载来使用了 先上这个小程序的效果图 图
  • 随机颜色(微信小程序)

    随机颜色 function getRandomColor let rgb for let i 0 i lt 3 i let color Math floor Math random 256 toString 16 color color l
  • 数据结构静态顺序表

    顺序表 用一段地址连续存储单元依次存储数据元素的线性结构 seqlist h pragma once 防止头文件重复包含 define MAX SIZE 10 include