静态顺序表的基本操作

#pragma once
#define MAX_SIZE 10
typedef unsigned int size_t;
typedef int DataType;
#include<stdio.h>
#include<assert.h>
#include<memory.h>
#include <stdlib.h>
#define MAX 100

typedef struct SeqList
{
DataType arr[MAX];
int sz; // 顺序表中有效元素的个数
}SeqList, *pSeqList;

//typedef struct SeqList SeqList;

///
// .h
// 初始化顺序表
void InitSeq(pSeqList pSeq)//初始化顺序表
{
assert(pSeq);
memset(pSeq->arr, 0, sizeof(DataType)*MAX);
pSeq->sz = 0;
}
// 尾插
void PushBack(pSeqList pSeq, DataType x)//尾插
{
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("顺序表已满\n");
exit(EXIT_FAILURE);
}
pSeq->arr[pSeq->sz] = x;
++pSeq->sz;
}

// 尾删
void PopBack(pSeqList pSeq)//尾删
{
assert(pSeq);
if (pSeq->sz == 0)
{
printf("顺序表没有元素;不可删除\n");
exit(EXIT_FAILURE);
}
--pSeq->sz;
}

// 头插
void PushFront(pSeqList pSeq, DataType x)//头插
{
int i = 0;
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("顺序表已满\n");
exit(EXIT_FAILURE);

}

for (i = pSeq->sz; i>0; --i)
{
pSeq->arr[i] = pSeq->arr[i - 1];
}
pSeq->arr[0] = x;
++pSeq->sz;
}

// 头删
void PopFront(pSeqList pSeq)//头删
{
int i = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("顺序表没有元素;不可删除\n");
exit(EXIT_FAILURE);

}
for (i = 0; i<pSeq->sz - 1; ++i)
{
pSeq->arr[i] = pSeq->arr[i + 1];
}
--pSeq->sz;
}

// 任意位置中插入值为data的元素
void Insert(pSeqList pSeq, int pos, DataType x)//在顺序表某位置插入某个特定元素
{
int i = 0;
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("顺序表已满\n");
exit(EXIT_FAILURE);
}
if (pos >= MAX)
{
printf("插入位置不合适\n");
exit(EXIT_FAILURE);
}

for (i = pSeq->sz; i>pos; --i)
{
pSeq->arr[i] = pSeq->arr[i - 1];
}
pSeq->arr[pos] = x;
++pSeq->sz;
}

// 删除任意位置中的元素
void SeqListErase(pSeqList pSeq, int pos)
{
int i = 0;
assert(pSeq);
if (Empty(pSeq))
{
printf("顺序表为空\n");
return;
}
if (pos < 0 || pos >= pSeq->sz)
{
printf("%d 位置非法\n");
return;
}
for (i = pos; i < pSeq->sz - 1; i++)
{
pSeq->arr[i] = pSeq->arr[i + 1];
}
pSeq->sz--;
}

// 在顺序表中查找值为data的元素,返回该元素在顺序表中的下标
//int SeqListFind(pSeqList ps, DataType data);
int SeqListFind(pSeqList pSeq, int value)
{
assert(pSeq);
size_t i = 0;
for (i = 0; i < pSeq->sz; i++)
{
if (pSeq->arr[i] == value)
{
return i;//返回数组下标
}
}
return -1;
}

// 删除顺序表中值为data的元素
void Remove(pSeqList pSeq, DataType data)
{
int i = 0;
int j = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("顺序表为空;不可删除\n");
exit(EXIT_FAILURE);
}
for (i = 0; i < (pSeq->sz); ++i)
{
if (pSeq->arr[i] == data)
{
for (j = i; j<pSeq->sz - 1; ++j)
{
pSeq->arr[j] = pSeq->arr[j + 1];
}
--pSeq->sz;
break;
}
}
return;
}

// 删除顺序表中所有值为data的元素
void RemoveAll(pSeqList pSeq, DataType x)
{
int i = 0;
int j = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("顺序表没有元素;不可删除\n");
exit(EXIT_FAILURE);
}
for (i = 0; i<pSeq->sz; ++i)
{
if (pSeq->arr[i] == x)
{
for (j = i; j<pSeq->sz - 1; ++j)
{
pSeq->arr[j] = pSeq->arr[j + 1];
}
--pSeq->sz;//记得--元素个数;要不然上增循环会越界;
/*删除元素以后(后面覆盖前面),记得将下标回到前一位置;
再次进入循环,i会走到刚才的位置;现在是新的元素;这样可以
避免漏检查元素,可以有效删除出相连相同的元素;*/
i = i - 1;
}
}
return;
}

// 判断顺序表是否为空
int SeqListEmpty(SeqList* seqlist)//返回该顺序表是否为空,为空返回1,否则返回0
{
if (seqlist == NULL) {
return;
}
if (seqlist->sz == 0) {
return 1;
}
else
return 0;


}

// 获取顺序表中元素的个数
size_t SeqListSize(SeqList* seqlist)//返回该顺序表的个数
{


if (seqlist == NULL) {
return;
}
return seqlist->sz;


}

/
// 辅助操作
// 打印顺序表中的元素
void Print(SeqList *seq)
{
assert(seq);
size_t i = 0;
for (i = 0; i < seq->sz; i++)
{
printf("%d->", seq->arr[i]);
}
}


// 用冒泡排序对顺序表中的元素进行排序
void SeqListBubbleSort(SeqList* seqlist)//冒泡排序
{


if (seqlist == NULL) {
return;
}
if (seqlist->sz == 1) {
return;
}
int i = 0;
for (i = 0; i<seqlist->sz - 1; i++) {
int j = 0;
for (j = 0; j<seqlist->sz - 1 - i; j++) {
if (seqlist->arr[j]>seqlist->arr[j + 1]) {
DataType tmp = seqlist->arr[j];
seqlist->arr[j] = seqlist->arr[j + 1];
seqlist->arr[j + 1] = tmp;
}
}
}
}

// 用选择排序对顺序表中的元素进行排序
void SelectSort(int* arr, int sz);
void SelectSort(SeqList *seq)
{
assert(seq);
size_t i = 0;
size_t j = 0;
for (i = 0; i < seq->sz; i++)
{
size_t min = i;
for (j = i + 1; j < seq->sz; j++)//找到每次最小值
{
if (seq->arr[min] > seq->arr[j])
{
min = j;
}
}

if (i != min)
{
/*DataType t = seq->data[min];
seq->data[min] = seq->data[i];
seq->data[i] = t;*/
seq->arr[min] ^= seq->arr[i];
seq->arr[i] ^= seq->arr[min];
seq->arr[min] ^= seq->arr[i];

}
}
}

// 选择排序优化---一次找出最大最小元素所在的位置
void SelectSort_OP(int* arr, int sz);

转载于:https://www.cnblogs.com/lx1997/p/8641755.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka分区与分组原理_kafka 基本原理和概念

Kafka系统的角色Broker &#xff1a;一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topictopic&#xff1a; 可以理解为一个MQ消息队列的名字Partition&#xff1a;为了实现扩展性&#xff0c;一个非常大的topic可以分布到多个 broker(即服…

python里类的概念

Python编程中类的概念可以比作是某种类型集合的描述&#xff0c;如“人类”可以被看作一个类&#xff0c;然后用人类这个类定义出每个具体的人——你、我、他等作为其对象。类还拥有属性和功能&#xff0c;属性即类本身的一些特性&#xff0c;如人类有名字、身高和体重等属性&a…

cadence导入dxf文件_Allegro中如何导入DXF文件

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x1. 执行菜单FileImportDXF…出现下面窗体&#xff1a;2. 选择DXF文件3. 选择单位4. Layer conversion file&#xff1a;会自动产生&#xff0c;或选择设置好的文件5. 点击Edit/…

20172329 2017-2018-2 《程序设计与数据结构》实验一报告

20172329 2017-2018-2 《程序设计与数据结构》实验一报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 王文彬 学号&#xff1a;20172329 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年3月21日 必修/选修&#xff1a; 必修 1.实…

all方法 手写promise_试题-手写实现一个 promise.all - 拿OFFER

Promise.all的实现和原理Promise.all 功能&#xff1a;Promise.all(iterable)返回一个新的Promise实例,此实例在iterable参数内素有的Promise都fulfilled或者参数中不包含Promise时&#xff0c;状态变成fulfilled。如果参数中Promise有一个失败rejected &#xff0c;此实例回调…

排序之选择排序:简单选择+堆排序

一、简单选择排序 1、思想&#xff1a;每遍历一次都记住了当前最小&#xff08;大&#xff09;元素的位置&#xff0c;最后仅需一次交换操作即可将其放到合适的位置。与冒泡排序相比&#xff0c;移动数据次数少&#xff0c;节省时间 &#xff0c;性能优于冒泡排序。 2、时间复杂…

ubantu 添加防火墙策略_Ubuntu 14.04 配置iptables防火墙

Ubuntu默认安装是没有开启任何防火墙的&#xff0c;为了服务器的安全&#xff0c;建议大家安装启用防火墙设置&#xff0c;这里推荐使用iptables防火墙.如果MySQL启本地使用,可以不用打开3306端口.# whereis iptables #查看系统是否安装防火墙可以看到:iptables: /sbin/iptable…

VS集成Qt开发入门(简易时间显示)

VS集成Qt开发入门&#xff08;简易时间显示&#xff09;软件开发入门开发环境简单时间显示&#xff08;LcdNumber&#xff09;ui界面设计&#xff08;clock.ui&#xff09;工程文件&#xff08;clock.h&#xff0c;clock.cpp&#xff09;头文件clock.h&#xff1a;源文件clock.…

ps 毛发 边缘_不会抠图怎么办?PS画笔绘制毛发技巧,抠图流程解析

前两期我们讲了一些简单的抠像方法。第一次我们知道了如何在抠像的同时保留人物投影。第二次我们知道了如何利用背景橡皮擦工具进行抠像。以上是一些稍微简单一些的抠图方法&#xff0c;人人都可以轻松办到。今天讲如何利用PS画笔绘制毛发。今天的知识稍微需要点耐心。如何把下…

Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

Tornado 自定义session&#xff0c;与一致性哈希 &#xff0c;基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash import ringcreate_session_id sasd # 随机生成的 session 函数class SessionGen(object):container {}def __init__(self,ha…

基于结构体的二进制文件读写

基于结构体的二进制文件读写项目介绍工程创建结构体的创建写二进制文件结果读二进制文件结果参考文献项目介绍 本次设计是为了提高读写二进制文件的效率&#xff0c;以约定的结构体形式进行读写操作&#xff0c;避免了一个字节一个字节的多次写入读取操作&#xff0c;并且能以…

排序算法-希尔排序

上一篇讲解了简单插入排序算法&#xff0c;以及在其基础上优化的二分插入排序算法&#xff0c;但是每次插入需要按间隔为 1 移动有序区的元素&#xff0c;效率不高&#xff0c;下面我们来介绍一种新的插入排序算法-希尔排序。 算法简介 希尔排序&#xff08;Shell Sort&#xf…

封包时发现的关于QIODevice类write函数的坑

关于QIODevice类write函数的坑问题概述问题部分代码问题解决结论问题概述 这两天在做TCP通信的封包解包协议操作时&#xff0c;不经意间被write函数坑了好久。通过内存复制进行数据封包&#xff0c;在写入socket的时候总是写入一个字节&#xff0c;不能全部写入数据&#xff0…

java c++ python哪个好_程序员学java好还是python语言好 c++又如何

技术程序员学Java、C、Python... 分析对比&#xff0c;到底学什么语言吃香&#xff0c;哪种语言最靠谱&#xff0c;如何学好这些语言呢&#xff1f;几天前&#xff0c;我们在知识上看到这样一个问题&#xff1a;“java&#xff0c;C&#xff0c;Python&#xff0c;走&#xff0…

Qt多文件传输功能实现及方法概述

Qt多文件传输功能实现前言代码实现概述客户端代码实现服务端代码效果展示结论前言 本次设计主要是为了功能上的实现&#xff0c;因此对于ui界面的设计都是怎么简单怎么来的&#xff0c;主要的功能就是实现多个文件的发送与接收&#xff0c;即客户端发送&#xff0c;服务端接收…

jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式.1、架构图2、服务器列表3、搭…

从java到C++入门

C基础知识前言基础前言 当初为了赶一波互联网热潮自学了java&#xff0c;如今因为需要就从java转向C开发&#xff0c;于是就有了java到C入门&#xff0c;每次的学习我都会记录一下C的学习历程。 基础 C对于内存的控制管理比java要有更多要求&#xff0c;因此C对于变量的创建…

wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法

今天WordPress主题站简单介绍一下WordPress系统中用户信息获取方式&#xff0c;今天就讲讲使用接口方式获取WordPress用户信息的方法。接口文件如下&#xff1a;if (POST ! $_SERVER[REQUEST_METHOD]) {header(Allow: POST);header(HTTP/1.1 405 Method Not Allowed);header(Co…

结构体内存拷贝的两种方法

结构体内存拷贝的两种方法前言内容总结前言 最近看一些代码&#xff0c;发现内存拷贝的两种方式&#xff0c;下面我就来介绍一下两种方式。 内容 首先定义一个结构体processorHead.h&#xff1a; #pragma pack(1)typedef struct {short b;int c;long long d; }DATA;#pragma…

大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量两篇

大学物理实验教案长度和质量的测量两篇篇一&#xff1a;大学物理实验教案4--长度测量大学物理实验教案实验目的&#xff1a;1&#xff0e;掌握游标卡尺、螺旋测微计和移测显微镜的测量原理和使用方法。 2&#xff0e;根据仪器的精度和有效数字的定义&#xff0c;正确记录原始数…