顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

 1.顺序表的结构体声明

#define MAX_SIZE 5       //定义数组的大小
typedef int DataType;
typedef struct SeqList
{
DataType array[MAX_SIZE];
size_t size;
}SeqList;

2.顺序表的初始化

void InitSeqList(SeqList* pSeq)         //址传递要用到指针
{
assert(pSeq);
memset(pSeq->array, , sizeof(DataType)*MAX_SIZE); //初始化数组
pSeq->size = ;
}

3.顺序表 尾插、尾删、打印

//1.检查参数
//2.边界条件的检查
//3.完成功能函数 //尾插
void PushBack(SeqList* pSeq, DataType x)
{
assert(pSeq); //检查参数
if (pSeq->size >= MAX_SIZE) //边界条件检查
{
printf("SeqList is Full !");
printf("\n");
return;
}
pSeq->array[pSeq->size++] = x;
}
//尾删
void PopBack(SeqList* pSeq)
{
assert(pSeq); //检查参数
if (pSeq->size <=) //边界条件检查
{
printf("SeqList is empty !");
printf("\n");
return;
}
//pSeq->array[--pSeq->size] = 0;
--pSeq->size;
}
//打印
void PrintSeqList(SeqList* pSeq)
{
assert(pSeq); //检查参数
int i = ;
for (; i < pSeq->size; i++)
{
printf("%d ", pSeq->array[i]);
}
printf("\n");
}

4.头插

void PushFront(SeqList* pSeq, DataType x)
{
assert(pSeq); //检查参数
int begin = pSeq->size - ;
if (pSeq->size >= MAX_SIZE) //边界条件检查
{
printf("SeqList is Full !");
printf("\n");
return;
}
//把已经存好的数据依次向后挪动一位后,在顺序表的首位置插入x
for (; begin >= ; --begin)
{
pSeq->array[begin + ] = pSeq->array[begin];
}
pSeq->array[] = x;
++pSeq->size;
}

5.头删

void PopFront(SeqList* pSeq)
{
assert(pSeq); //检查参数
int begin = ;
if (pSeq->size <= ) //检查边界条件,顺序表可能为空
{
printf("SeqList is empty !\n");
}
//把顺序表的数据依次向前挪一位
for (; begin <pSeq->size-; begin++)
{
pSeq->array[begin] = pSeq->array[begin + ];
}
--pSeq->size;
}

6.固定位置插入数据和删除数据

//固定位置插入数据
void Insert(SeqList* pSeq, size_t pos, DataType x)
{
assert(pSeq); //检查参数
assert(pos<=pSeq->size); //检查位置的有效性
int begin = pSeq->size - ;
if (pSeq->size >= MAX_SIZE) //检查边界条件,如果顺序表已满则无法插入
{
printf("SeqList is Full !");
printf("\n");
return;
}
//把从pos开始后面的数据依次向后挪,再在pos位置处添加数据x
for (; begin >=(int) pos; begin--) //begin和pos的数据类型要相同再比较
{
pSeq->array[begin+] = pSeq->array[begin];
}
pSeq->array[pos] = x;
++pSeq->size; //添加数据后size自增一
}
//固定位置删除数据
void Erase(SeqList* pSeq, size_t pos)
{
assert(pSeq); //检查参数的有效性
assert(pos < pSeq->size); //检查位置的有效性
int begin = pos;
if (pSeq->size <= ) //检查边界条件
{
printf("SeqList is empty !");
printf("\n");
return;
}
//把pos后的数据依次向前挪一位
for (; begin <= pSeq->size - ; begin++)
{
pSeq->array[begin] = pSeq->array[begin + ];
}
--pSeq->size;
}

7.查找数据、找到数据并删除它

//查找
int Find(SeqList* pSeq, size_t pos, DataType x)
{
assert(pSeq); //检查参数
int i= pos;
for (;i < pSeq->size; i++)
{
if (pSeq->array[i] == x)
return i;
}
return -;
}
//查找并删除
int Remove(SeqList* pSeq, DataType x)
{
assert(pSeq); //检查参数
int pos = Find(pSeq, ,x); //先找到x并返回它的位置,如果找到就删了它
if (pos != -)
{
Erase(pSeq, pos);
}
return pos;
}

8.删除顺序表中所有相同的x

//删除所有x
void RemoveAll(SeqList* pSeq, DataType x)
{
//从第一个数开始找,找到就删除,删了后再从下一个位置接着找
assert(pSeq); //检查参数
int pos = Find(pSeq, , x);
while (pos !=-)
{
Erase(pSeq, pos);
pos = Find(pSeq,pos, x);
}
}

优化(遍历一遍就把所有的x删除,并把后面的数据向前挪动相应个的位置)

void removeall(SeqList* pSeq, DataType x)
{
assert(pSeq);
int i = ;
int count = ;
for (; i < pSeq->size; i++)
{
if (pSeq->array[i] == x)
{
count++;
}
else
{
pSeq->array[i-count] = pSeq->array[i];
}
}
pSeq->size -= count; //删完挪完后size要删多少就减多少
}

9.顺序表的二分查找

int BinarySearch(SeqList* pSeq, DataType x)
{
assert(pSeq);
int left = ;
//int right = pSeq->size - 1; // [ ] 注意边界
int right = pSeq->size; // [ )
//while (left <= right)
while (left<right)
{
int mid = left - (left - right) / ; //防止溢出
if (pSeq->array[mid] == x)
{
return mid;
}
else if (pSeq->array[mid]>x)
{
right = mid - ;
//right = mid;
}
else if (pSeq->array[mid]<x)
{
left = mid + ;
}
}
return -;
}

10.冒泡排序

void BubbleSort(SeqList* pSeq)
{
assert(pSeq); //检查参数
int i, j;
int ret = ;
for (i = ; i < pSeq->size - ; i++)
{
int exchange=;
for (j = ; j < pSeq->size - i - ; j++)
{
if (pSeq->array[j]> pSeq->array[j + ])
{
ret = pSeq->array[j];
pSeq->array[j] = pSeq->array[j + ];
pSeq->array[j + ] = ret;
exchange=;
}
}
if(exchange==) //如果没有发生交换,说明次序已经排好
{
return ;
}
}
}

11.选择排序

//一次选出最大最小的数据分别放在序列的两端
void Swap(DataType* left,DataType*right)
{
DataType tmp = *left;
*left = *right;
*right = tmp;
}
void SeclectSort(SeqList* pSeq)
{
assert(pSeq);
int left = ;
int right = pSeq->size - ;
int ret ,min,max;
while (left<right)
{
min = left;
max = right;
for (int i = left; i<right; ++i)
{
if (pSeq->array[min]>pSeq->array[i])
{
Swap(&pSeq->array[min], &pSeq->array[i]);
}
if (pSeq->array[max]<pSeq->array[i])
{
Swap(&pSeq->array[max], &pSeq->array[i]);
}
}
++left;
--right;
}
}

简单的测试与主函数

void Test()
{
SeqList seq;
InitSeqList(&seq); PushBack(&seq, );
PushBack(&seq, );
PushBack(&seq, );
PushBack(&seq, );
PushBack(&seq, ); PrintSeqList(&seq); SeclectSort(&seq);
PrintSeqList(&seq);
}
int main()
{
Test();
system("pause");
return ;
}

顺序表的静态存储(C语言实现)的更多相关文章

  1. 顺序表的基本操作【c语言】【创建、插入、删除、输出】

    作为数据结构初学者,上课时对一些知识点掌握得不是很透彻,所以利用课余时间通过微博平台总结所学知识,加深对知识的见解,记录学习历程便于后需要时参考. #include<stdio.h> #i ...

  2. 顺序表及基本操作(C语言)

    #include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; # ...

  3. (续)顺序表之单循环链表(C语言实现)

    单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...

  4. C语言实现的顺序表

    顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...

  5. C++学习(二十九)(C语言部分)之 顺序表

    一.数据结构组织 存放数据的方式 精心选择的数据结构可以提升效率 数据结构 1.逻辑结构 一对多关系 父与子 一对一关系 排队中 多对多关系 两地的路线 2.存储结构 数据存放的位置关系 顺序存储数据 ...

  6. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  7. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  8. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  9. 数据结构中的顺序表和链表(Python语言)

    转载:https://blog.csdn.net/weixin_43187669/article/details/96426362 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体. ...

随机推荐

  1. Doker容器之间连接

    第一个应用容器 $ sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i kongxx/mysql_client /usr ...

  2. ASP.NET中的配置文件

    ASP.NET中的配置文件 原创 2014年10月13日 08:15:27 1199   在机房收费系统的时候曾经应用过配置文件,当时也就那么一用对配置文件了解的不是很透彻,下面就来总结一下有关配置文 ...

  3. 涛哥的Python工具箱之批量删除含指定字符串行

    我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反 ...

  4. docker教程之从一头雾水到不一头雾水(2)

    书接上文:docker教程之从一头雾水到不一头雾水(1) 运行镜像 先查看下本地有哪些镜像 [root@ichz ~]# docker images REPOSITORY TAG IMAGE ID C ...

  5. 利用SQL server 的复制功能分散用户访问服务器的负载

    先来了解一下一个基本的关于复制的概念. 什么是复制? 复制就是把数据的多个拷贝(复制品)分发到公司中的各个服务器中,通过复制为多台服务器提供相同的数据.这样用户就可以在不同服务器中访问同样的信息. 对 ...

  6. Sphinx(Coreseek)安装和使用指南

    1.安装 1.1安装mmseg ./bootstrap # 必须执行,不然安装会失败 ./configure --prefix=/usr/local/mmseg- #指定安装目录 make make ...

  7. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...

  8. CSS3 --添加阴影(盒子阴影、文本阴影的使用)

     CSS3 - 给div或者文字添加阴影(盒子阴影.文本阴影的使用)CSS3定义了两种阴影:盒子阴影和文本阴影.其中盒子阴影需要IE9及其更新版本,而文本阴影需要IE10及其更新版本.下面分别介绍两种 ...

  9. 读书笔记-HBase in Action-第三部分应用-(1)OpenTSDB

    OpenTSDB是基于HBase的开源监控系统,能够支持上万规模集群监控和上亿数据点採集. 当中TSDB代表Time Series Database,OpenTSDB在时间序列数据的存储和查询上都做了 ...

  10. [08山东省选]2298 石子合并 即POJ 1738 An old Stone Game

    2298 石子合并 2008年省队选拔赛山东  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在 ...