用一段地址连续的存储单元依次存储数据元素的线性结构,地址空间一般是连续的,一般情况下采用数组,但数组有静态数组和动态数组, 所以顺序表分为:静态顺序表和动态顺序表 这篇文章是介绍静态顺序表的
顺序表结构:
#define MAX 10
typedef int DataType;//数据类型
typedef struct SeqList
{
DataType data[MAX];
int sz;//长度,也就是有效元素的个数
}SeqList, *pSeqList;
顺序表的优点和缺点:
1.因为存储空间连续因此可以节约空间。
2.在查找元素是支持随机查找,但是在插入和删除时要进行元素的移动,因此效率比较低。
函数声明:
int Empty(pSeqList pSeq);//判空
void InitSeqList(pSeqList pSeq);
void PushBack(pSeqList pSeq, DataType data);//尾插
void PopBack(pSeqList pSeq);//尾删
void PushFront(pSeqList pSeq, DataType data);//头插
void PopFront(pSeqList pSeq);//头删
int Find(pSeqList pSeq, DataType data);//查找
void PrintSeqList(pSeqList pSeq);//打印函数
void Insert(pSeqList pSeq, int pos, DataType data);//指定位置插入
void Erase(pSeqList pSeq, int pos);//删除指定位置元素
void Remove(pSeqList pSeq, DataType data);//删除指定元素
void RemoveAll(pSeqList pSeq, DataType data);//删除所有的指定元素
int Size(pSeqList pSeq);//返回顺序表的大小
void BubbleSort(pSeqList pSeq);//冒泡排序
int BinarySearch(pSeqList pSeq, DataType data);//二分查找
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType data);//二分查找递归写法
void SelectSort(pSeqList pSeq);//选择排序
相关函数的实现:
void InitSeqList(pSeqList pSeq)//初始化
{
assert(pSeq != NULL);
pSeq->sz = 0;
memset(pSeq->data, 0, sizeof(pSeq->data));
}
int Empty(pSeqList pSeq)//判空
{
assert(pSeq);
if (pSeq->sz == 0)
return 0;
else
return 1;
}
void PushBack(pSeqList pSeq, DataType d)//尾插入
{
assert(pSeq != NULL);
if (pSeq->sz == MAX)
{
printf("顺表表已满,不能插入\n");
return;
}
pSeq->data[pSeq->sz] = d;
pSeq->sz++;
}
void PopBack(pSeqList pSeq)//尾删
{
assert(pSeq);
if(Empty(pSeq));
//pSeq->data[pSeq->sz - 1] = NULL;
pSeq->sz--;
}
void PushFront(pSeqList pSeq, DataType data) //头插
{
int i = 0;
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("顺序表已满,不能插入");
}
for (i = pSeq->sz; i > 0; i--)
{
pSeq->data[i] = pSeq->data[i - 1];
}
pSeq->data[0] = data;
pSeq->sz++;
}
void PopFront(pSeqList pSeq)//头删
{
int i = 0;
assert(pSeq);
if (Empty(pSeq))
for (i = 0; i < pSeq->sz-1; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->sz--;
}
int Find(pSeqList pSeq, DataType data)//查找指定元素
{
assert(pSeq);
int i = 0;
for (i = 0; i < pSeq->sz; i++)
{
if (pSeq->data[i] == data)
break;
}
return i;
}
void Insert(pSeqList pSeq, int pos, DataType data)//指定位置插入
{
assert(pSeq);
if (pos > pSeq->sz)
{
printf("该位置不存在\n");
}
int i = 0;
for (i = pSeq->sz; i >= pos; i--)
pSeq->data[i] = pSeq->data[i - 1];
pSeq->data[pos] = data;
pSeq->sz++;
}
void Erase(pSeqList pSeq, int pos)//删除指定位置元素
{
assert(pSeq);
int i = 0;
if (Empty(pSeq))
for (i = pos; i < pSeq->sz-1; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->sz--;
}
void Remove(pSeqList pSeq, DataType data)//删除指定元素
{
int i = 0;
assert(pSeq);
if (Empty(pSeq));
{
for (i = 0; i < pSeq->sz; i++)
{
int pos = 0;
if (pSeq->data[i] == data)
break;
}
int pos = 0;
pos = i;
for (i = pos; i < pSeq->sz-1; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->sz--;
}
}
void RemoveAll(pSeqList pSeq, DataType data)//删除所有的指定元素
{
assert(pSeq);
int i = 0;
int j = 0;
if (Empty(pSeq))
{
for (i = 0; i < pSeq->sz; i++)
{//12145
if (pSeq->data[i] != data)
{
pSeq->data[j] = pSeq->data[i];
j++;
}
}
pSeq->sz = j;//12345
}
}
int Size(pSeqList pSeq)//返回顺序表的大小
{
assert(pSeq);
return pSeq->sz;
}
void BubbleSort(pSeqList pSeq)//冒泡排序
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 0; i < pSeq->sz-1; i++)
{
for (j = 0; j < pSeq->sz - i-1; j++)
{
if (pSeq->data[j]>pSeq->data[j + 1])//32145
{
tmp = pSeq->data[j];
pSeq->data[j] = pSeq->data[j + 1];
pSeq->data[j + 1] = tmp;
}
}
}
}
int BinarySearch(pSeqList pSeq, DataType data)//二分查找
{
int left = 0;
int right = pSeq->sz - 1;
int mid = 0;
while (left <=right)
{
mid = (left + (right - left)) / 2;
if (pSeq->data[mid]>data)//12345
right = mid-1;
else if (pSeq->data[mid] < data)
left = mid+1;
else if (pSeq->data[mid] == data)
return mid;
}
return -1;
}
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType data)
{
int mid = 0;
assert(NULL != pSeq);
while (left <= right)
{
mid = left + (right - left) / 2;
if (pSeq->data[mid] == data)
{
printf("找到了\n");
return mid;
}
else if (pSeq->data[mid] < data)
{
return BinarySearch_R(pSeq, mid + 1, right, data);
}
else if (pSeq->data[mid] > data)
{
return BinarySearch_R(pSeq, left, mid - 1, data);
}
}
return -1;
}
void SelectSort(pSeqList pSeq)//选择排序
{
int i = 0;
int j = 0;
int mindix = 0;
int k = 0;
for (i = 0; i < pSeq->sz - 1; i++)
{
mindix = i;
for (j = i + 1; j < pSeq->sz; j++)
{
if (pSeq->data[mindix] > pSeq->data[j])
{
mindix = j;
}
}
int temp = pSeq->data[mindix];//231465
for (k = mindix; k >i; k--)
{
pSeq->data[k] = pSeq->data[k - 1];
}
pSeq->data[i] = temp;
}
}