您的位置:首页 > 理论基础 > 数据结构算法

数据结构线性表—静态顺序表的实现

2016-01-19 15:49 465 查看
本文主要实现静态顺序表基本功能:初始化、插入(头插、尾插、任意位置插入)、删除(头删、尾删、任意位置删除,删除指定元素、删除所有指定元素)、排序(冒泡排序)、逆序、查找(二分查找)

//静态顺序表结构
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: