目录
顺序表
顾名思义,就是用一段连续的存储单元依次存储数据元素的线性结构 。
静态顺序表即顺序表的最大容量是确定的。
接下来我们要完成的基本操作是:
#define nums_MAX 10 //链表的最大容量
typedef double seqlistdata; //将double重命名为seqlistdata
typedef struct SeqList
{
seqlistdata a[nums_MAX]; //nums_MAX=10
int size; //容量(存入有效元素的个数)
}SL;
由于顺序表里存放的元素的类型是未知的,所以将double重命名为seqlistdata,若想在顺序表中存储其他类型的数据,只需将double修改为对应的类型即可。
初始化函数
数组初始化(全部初始化为0)+ 容量初始化(刚开始容量为0)
初始化函数
void SeqListInit(SL sl)
{
assert(sl);
//初始化整个数组
memset(sl->a,0, nums_MAX*sizeof(seqlistdata));
//初始化size
sl->size = 0;
}
打印
循环依次打印
void PrintSeqList(SL sl)
{
int i = 0;
assert(sl);
for (i = 0; i < sl->size; i++)
{
printf("%d ", sl->a[i]);
}
printf("\n");
}
尾部插入
注意判断是否可以插入
//尾插法
void PushBack(SL sl, seqlistdata a)
{
assert(sl);
//判断是否可以插入即判断容量是否小于MAX
if (sl->size >= nums_MAX)
{
printf("容量已满!\n");
return;
}
//将数据插入到第seq->sz的位置上
sl->a[sl->size] = a;
//容量++
sl->size++;
}
尾部删除
//尾部删除
void PopBack(SL sl)
{
assert(sl);
//判断是否可以删除
if (sl->size == 0)
{
printf("数组为空!");
}
//容量--
sl->size--;
}
头部插入
//头部插入
void PushFront(SL sl, seqlistdata a)
{
int i;
assert(sl);
//判断是否可以插入
if (sl->size >= nums_MAX)
{
printf("数组已满!\n");
}
//元素全部后移
for (i = sl->size - 1 ; i >= 0; i--)
{
sl->a[i + 1] = sl->a[i];
}
//插入
sl->a[0] = a;
//容量++
sl->size++;
头部删除
//头部删除
void PopFront(SL sl)
{
int i = 0;
assert(sl);
//判断是否可以删除
if (sl->size == 0)
{
printf("数组为空!\n");
}
//前移
for (i = 1; i < sl->size; i++)
{
sl->a[i - 1] = sl->a[i];
}
//容量--
sl->size--;
}
//查找指定元素
int find(SL sl, seqlistdata a)
{
int i = 0;
assert(sl);
for (i = 0; i < sl->size; i++)
{
if (sl->a[i] == a)
return i;
}
return -1;
}
//删除指定位置元素
void del(qSeqList seq, int pos)
{
int i = 0;
assert(sl);
//判断是否可以删除
if (sl->size == 0)
{
printf("数组为空!\n");
}
//指定位置之后的所有元素前移
for (i = pos + 1; i < sl->size; i++)
{
sl->a[i - 1] = sl->a[i];
}
//容量--
sl->size--;
}
由于指定位置插入和指定位置删除都是在查找指定元素成立的条件下测试的,即是在pos合法的情况下插入和删除,所以不需要判断位置(pos)的合法性,如果不是在查找指定元素成立的条件下进行指定位置插入和删除就需要判断pos的合法性。
删除指定元素
void Remove(SL sl seqlistdata a)
{
int i = 0;
assert(sl);
for (i = 0; i < sl->size; i++)
{
if (sl->a[i] == a)
{
break; //跳出循环,i即为指定元素的位置
}
}
if (i < sl->size) //若i有效
{
int j = 0;
{
sl->a[j - 1] = sl->a[j];
//指定元素之后的所有元素前移
}
//容量--
sl->size--;
}
}
删除所有的指定元素
void Removeall(SL sl, seqlistdata a)
{
int i = 0;
assert(sl);
for (i = 0; i < sl->size; i++)
{
if (sl->a[i] == a) // i即为删除对象的位置
{
int j = 0;
for (j = i + 1; j < sl->size; j++)
{
//指定元素之后的所有元素前移
sl->a[j - 1] = sl->a[j];
}
//容量--
sl->size--;
}
}
}
返回顺序表的大小
int sizeof(SL sl)
{
assert(sl);
return sl->size;
}
判断顺序表是否为空
int EmptyOr(SL sl)
{
assert(sl);
return sl->size == 0;//等式成立返回真(1)
}
选择排序
选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的最后位置,直到全部待排序的数据元素排完。
void Select(SL sl)
{
int maxpos = 0;//初始化最大值的下标
int i = 0;
int j = 0;
assert(sl);
for (i = 0; i < sl->size-1; i++)
{
maxpos = 0;
//寻找最大值
for (j = 1; j < sl->size-i ; j++)
{
if (sl->a[j] > sl->a[maxpos])
maxpos = j ;
}
//若最大值不是最后一个元素,则将最大值和最后一个元素交换
if (maxpos != j-1)
{
swap(sl->a + maxpos, sl->a +j-1);
}
}
}
.h文件(头文件)存放函数的声明以及全局变量
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define MAX 10 //链表的最大容量
typedef double seqlistdata; //将double重命名为seqlistdata
typedef struct SeqList
{
DataType data[MAX]; //MAX=10;
int sz; //容量(已经存入多少个有效元素)
}SL;
void SeqListInit(SL sl); //初始化函数
void PushBack(SL sl, sllistdata a); //尾插法
void PopBack(SL sl); //尾部删除
void PushFront(SL sl, seqlistdata a); //头插法
void PopFront(SL sl); //头部删除
int find(SL sl, seqlistdata a); //查找指定元素
void Insert(SL sl, int pos, seqlistdata a); //指定位置插入
void del(SL sl, int pos); //删除指定位置元素
void Removeall(SL sl, seqlistdata a); //删除全部指定元素
void Remove(SL sl, seqlistdata a); //删除指定元素
int sizeof(SL sl); //返回顺序表的大小
int EmptyOr(SL sl); //判断结构体是否为空
void Select(SL sl); //选择排序
void PrintSeqList(SL sl); //打印
测试文件(test.c)
#include"SeqList.h"
//尾部测试
testBack()
{
//定义一个结构体sl
SL sl;
//初始化结构体
SeqListInit(&sl);
//尾插法
PushBack(&sl, 1);
PushBack(&sl, 2);
PushBack(&sl, 3);
PushBack(&sl, 4);
PushBack(&sl, 5);
//打印
PrintSeqList(&sl);
//尾部删除
PopBack(&sl);
//打印
PrintSeqList(&sl);
}
//头部测试
testFront()
{
//定义一个结构体sl
SL sl;
//初始化结构体
SeqListInit(&sl);
//头部插入
PushFront(&sl, 4);
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//打印
PrintSeqList(&sl);
//头部删除
PopFront(&sl);
//打印
PrintSeqList(&sl);
}
//查找
void testFind()
{
//定义一个结构体sl
SL sl;
int pos = 0;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//查找指定元素
pos = find(&sl, 1);
if (pos == -1)
{
printf("找不到!\n");
return;
}
else
{
printf("下标为:%d\n", pos);
}
}
//指定位置插入
void testInsert()
{
//定义一个结构体sl
SL sl;
int pos = 0;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//查找指定元素
pos = find(&sl, 1);
if (pos == -1)
{
printf("找不到指定位置!\n");
}
else
{
//指定位置插入
Insert(&sl, pos, 5);
//打印
PrintSeqList(&sl);
}
}
//指定位置删除
void testdel()
{
//定义一个结构体sl
SL sl;
int pos = 0;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//查找指定元素
pos = Front(&sl, 3);
if (pos == -1)
{
printf("找不到指定位置!\n");
}
else
{
//指定位置删除
del(&sl, pos);
//打印
PrintSeqList(&sl);
}
}
//删除指定元素
void testRemove()
{
//定义一个结构体sl
SL sl;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 4);
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//打印
PrintSeqList(&sl);
}
//删除全部指定元素
void testRemoveall()
{
//定义一个结构体sl
SL sl;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 5);
PushFront(&sl, 4);
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
//打印
PrintSeqList(&sl);
}
//返回顺序表的大小
void testsize()
{
//定义一个结构体sl
SL sl;
int l = 0;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 4);
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
l = size(&sl);
printf("size=%d \n", l);
}
//判断顺序表是否为空
void testEmptyOr()
{
//定义一个结构体sl
SL sl;
int s = 0;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 4);
PushFront(&sl, 3);
PushFront(&sl, 2);
PushFront(&sl, 1);
s = EmptyOr(&sl);
if (s == 1)
{
printf("结构体为空!\n");
}
else
printf("结构体不为空!\n");
}
//选择排序
testSelect()
{
//定义一个结构体sl
SL sl;
//初始化结构体
SeqListInit(&sl);
//插入
PushFront(&sl, 1);
PushFront(&sl, 2);
PushFront(&sl, 3);
PushFront(&sl, 4);
//打印
PrintSeqList(&sl);
Selectsort(&sl);
//打印
PrintSeqList(&sl);
}
void test()
{
//testBack();
//testfind();
//查找指定元素
//testFind();
//指定位置插入
//testInsert();
//指定位置删除
//testdel();
//删除指定元素
//testRemove();
//删除全部指定元素
//testRemoveall();
//返回顺序表的大小
//testsizeof();
//判断顺序表是否为空
//testEmptyOr();
//选择排序
//testSelect();
}
int main()
{
test();
system("pause");
return 0;
}