顺序表的静态存储(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 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体. ...
随机推荐
- Repeater绑定List泛型对象
后台: public void BindData() { List<WeiBo> DataList = new List<WeiBo>(); ...
- Devops成功的八大炫酷工具
原文链接:http://www.infoworld.com/article/3031009/devops/8-more-cool-tools-for-devops-success.html 为自动化和 ...
- linux安全组配置
万网的是这样子配置的:
- java网络编程(2)InetAddress 类及udp协议
InetAddress 类 JDK中为开发网络应用程序提供了java.net包,该包下的类和接口差点儿都是为网络编程服务的. InetAddress:用于描写叙述IP地址的对象 InetAddress ...
- Junit 内部解密之一: Test + TestCase + TestSuite
转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhq.html nterface: Test 整个测试的的基础接口 Method 1: abstract ...
- iOS tableView嵌套部分WebView效果实现
对于一些资讯类的app,比如网易新闻,今日头条这样的,他们的文章详情页大部分基本都是tableView中嵌套webView来实现的效果,其中顶部标题,关注按钮等这些可能是原生的,内容部分是webVie ...
- 隐藏VS2013的反馈、通知和登录按钮
Visual Studio 2013的右上角有反馈.通知.登录.快速启动等按钮,在VS2013中没有选项可以设置为隐藏. 打开注册表(开始 -> 运行 -> regedit),展开到以下路 ...
- [译]GLUT教程 - 整合代码8
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> The Code So Far VII ...
- linux无线网络配置_转
转自:http://www.cnblogs.com/dartagnan/archive/2010/12/05/2003521.html 一位资生linux 原文:http://www.hpl.hp ...
- Codeforces 38G Queue 伸展树
题目链接:点击打开链接 题意: 给定n个人来排队 每一个人有2个參数.身份优先级和脸皮厚度 == 来的那个人会排到队尾 假设这个人的优先级比他前面那个人的优先级大就会和前面那个人交换位置. 交换一次脸 ...