本文主要实现静态顺序表基本功能:初始化、插入(头插、尾插、任意位置插入)、删除(头删、尾删、任意位置删除,删除指定元素、删除所有指定元素)、排序(冒泡排序)、逆序、查找(二分查找)
//静态顺序表结构
#define MAX 100 //顺序表能存储的最大数目的元素个数
typedef int DataType;
typedef struct SeqList
{
DataType list[MAX]; //顺序表
int size; //存储数量
}SeqList,*pSeqList;
主要功能接口如下:
void InitSeqList(pSeqList pseq);//初始化顺序表
void PrintSeqList(SeqList seq);//打印顺序表内容
void PushBack(pSeqList pseq, DataType x);//尾部插入元素
void PopBack(pSeqList pseq);//尾部删除元素
void PushFront(pSeqList pseq, DataType x);//头插
void PopFront(pSeqList pseq);//头删
void Insert(pSeqList pseq,int pos,DataType x);//插入元素
void Remove(pSeqList pseq, DataType x);//删除指定元素
void RemoveAll(pSeqList pseq, DataType x);//删除顺序表中所有的指定元素
int Find(SeqList Seq, int pos, DataType x);//按位置开始查找元素
void ReverseList(pSeqList Seq);//顺序表逆序
void SortSeqList(pSeqList pseq);//顺序表排序
int BinarySearch(pSeqList pseq,DataType x);//二分查找
函数的实现:
void InitSeqList(pSeqList pseq)
{
memset(pseq->list, 0, sizeof(pseq->list));
pseq->size = 0;
}
void PrintSeqList(SeqList seq)
{
int i = 0;
for (i = 0; i < seq.size; i++)
{
printf("%d ", seq.list[i]);
}
}
void PushBack(pSeqList pseq, DataType x)
{
if (pseq->size == MAX)
{
printf("顺序表已满\n");
}
else
{
pseq->list[pseq->size] = x;
pseq->size++;
}
}
void PopBack(pSeqList pseq)
{
if (pseq->size == 0)
{
printf("顺序表为空\n");
}
else
{
pseq->size--;
}
}
void PushFront(pSeqList pseq, DataType x)
{
int i = 0;
if (pseq->size == MAX)
{
printf("顺序表已满\n");
}
else
{
for (i = pseq->size; i > 0; i--)
{
pseq->list[i] = pseq->list[i - 1];
}
pseq->list[0] = x;
pseq->size++;
}
}
void PopFront(pSeqList pseq)
{
int i = 0;
if (pseq->size == 0)
{
printf("顺序表为空\n");
}
else
{
for (i = 0; i < pseq->size; i++)
{
pseq->list[i] = pseq->list[i + 1];
}
pseq->size--;
}
}
void Insert(pSeqList pseq, int pos, DataType x)
{
int i = 0;
if (pseq->size == MAX)
{
printf("顺序表已满\n");
}
else
{
for (i = pseq->size; i > pos; i--)
{
pseq->list[i] = pseq->list[i - 1];
}
pseq->list[pos] = x;
pseq->size++;
}
}
int Find(SeqList Seq,int pos, DataType x)
{
int i = 0;
for (i = pos; i < Seq.size; i++)
{
if (Seq.list[i] == x)
{
return i;
}
}
return -1;
}
void Remove(pSeqList pseq, DataType x)
{
int i = 0;
int pos = Find(*pseq,0, x);
if (pos!=-1)
{
for (i = pos; i < pseq->size; i++)
{
pseq->list[i] = pseq->list[i + 1];
}
pseq->size--;
}
else
printf("not exit\n");
}
void RemoveAll(pSeqList pseq, DataType x)
{
int pos = 0;
int i = 0;
pos = Find(*pseq, pos, x);
if (pos == -1)
{
printf("not exit\n");
return;
}
while (pos!=-1)
{
for (i = pos; i < pseq->size; i++)
{
pseq->list[i] = pseq->list[i + 1];
}
pseq->size--;
pos = Find(*pseq, pos, x);
}
}
void ReverseList(pSeqList pSeq)
{
int start = 0;
int end = pSeq->size - 1;
int tmp = 0;
while (start < end)
{
tmp = pSeq->list[start];
pSeq->list[start] = pSeq->list[end];
pSeq->list[end] = tmp;
start++;
end--;
}
}
void SortSeqList(pSeqList pseq)
{
int i = 0;
int j = 0;
int tmp = 0;
int flag = 0;
for (i = 0; i < pseq->size; i++)
{
flag = 0;
for (j = 0; j < pseq->size-i-1; j++)
{
if (pseq->list[j] > pseq->list[j+1])
{
tmp = pseq->list[j];
pseq->list[j] = pseq->list[j+1];
pseq->list[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
}
int BinarySearch(pSeqList pseq, DataType x)
{
int left = 0;
int right = pseq->size - 1;
while (left <= right)
{
int mid = left - ((left - right) >>1);
if (pseq->list[mid] > x)
{
right = mid-1;
}
else if (pseq->list[mid] < x)
{
left = mid + 1;
}
else
return mid;
}
return -1;
}