顺序表的静态存储(C语言实现)
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
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语言实现)的更多相关文章
- 顺序表的基本操作【c语言】【创建、插入、删除、输出】
作为数据结构初学者,上课时对一些知识点掌握得不是很透彻,所以利用课余时间通过微博平台总结所学知识,加深对知识的见解,记录学习历程便于后需要时参考. #include<stdio.h> #i ...
- 顺序表及基本操作(C语言)
#include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; # ...
- (续)顺序表之单循环链表(C语言实现)
单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...
- C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
- C++学习(二十九)(C语言部分)之 顺序表
一.数据结构组织 存放数据的方式 精心选择的数据结构可以提升效率 数据结构 1.逻辑结构 一对多关系 父与子 一对一关系 排队中 多对多关系 两地的路线 2.存储结构 数据存放的位置关系 顺序存储数据 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- C语言实现顺序表(顺序存储结构)
顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...
- 数据结构中的顺序表和链表(Python语言)
转载:https://blog.csdn.net/weixin_43187669/article/details/96426362 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体. ...
随机推荐
- 去掉input框后边的叉号
::-ms-clear, ::-ms-reveal { display: none; }在样式里加上这句话即可
- 深入探析 Rational AppScan Standard Edition 新特性之 Glass Box 扫描
众所周知,Web 应用安全测试通常有黑盒安全测试和白盒安全测试两种方法.这两种方法孰优孰劣一直众议纷纷.广为公认的是,这两种测试方法有着良好地互补性,两种测试方法的结合是未来安全测试技术的发展趋势.G ...
- macbook 下SDK Manager 的更新[即使Google被屏蔽了也无所谓]
废话少说,直接说操作步骤: 1. 改动/etc/hosts文件: 右键单击Finder,选择前往目录,输入/private/etc/,敲回车键.将文件/etc/hosts复制到桌面(由于权限受限.无法 ...
- java锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)
wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法 ...
- Junit使用教程(三)
四.实例总结 1. 参数化测试 有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个 ...
- 搭建redis集群遇到的坑
搭建redis集群遇到的坑 #!/bin/bash # 作者: tuhooo # 日期: 2017.4.23 20.15 # 用途: 通过ruby脚本启动redis伪集群 if [ $2 == &qu ...
- 题目3 : Fibonacci
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given a sequence {an}, how many non-empty sub-sequence of it ...
- Google Code Jam 2014 资格赛:Problem C. Minesweeper Master
Problem Minesweeper is a computer game that became popular in the 1980s, and is still included in so ...
- nginx做反向代理proxy_pass,proxy_redirect的使用
大 | 中 | 小 今天用nginx作为trac的反代,发现一个问题,就是登入登出跳转的时候是白页,看了下网页相应内容,发现相应的location是空的.查了一下发现是只单纯用了proxy_pas ...
- sublime使用技巧(2)-- 实用插件推荐【持续更新】
1.Auto semicolon 在括号内输入分号,会自动把光标移到行尾然后再输入分号. 2.DocBlockr 补全注析格式,例如在函数上面输入/** + Enter,就会自动补全函数的注析说明. ...