静态顺序表的实现
seqlist.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef int DataType;
#define MAX 100
typedef struct Seqlist //定义顺序表结构
{
DataType Data[MAX];
int sz;
}Seqlist,*pSeqlist;
void init(pSeqlist ps); //初始化
void pushback(pSeqlist ps,DataType d); //尾插(在最后插入元素)
void print(const pSeqlist ps); //打印顺序表
void pushfront(pSeqlist ps, DataType d); //头插(在最前面插入元素)
void popfront(pSeqlist ps); //头删
int binarysearch(pSeqlist ps, DataType d); //二分查找
void reverse(pSeqlist ps); //逆序
void Remove(pSeqlist ps, DataType d); //删除
int find(pSeqlist ps, DataType d); //查找
void insert(pSeqlist ps, int pos, DataType d); //插入
void popback(pSeqlist ps); //尾删
void sort(pSeqlist ps); //排序
seqlist.c 函数实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"
void init(pSeqlist ps)
{
assert(ps);
ps->sz = 0;
memset(ps->Data, 0, sizeof(DataType));
}
void pushback(pSeqlist ps,DataType d)
{
if (ps->sz == MAX)
{
return;
}
ps->Data[ps->sz] = d;
ps->sz+=1;
}
void print(const pSeqlist ps)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
printf("%d ", ps->Data[i]);
}
printf("\n");
}
void popback(pSeqlist ps)
{
assert(ps);
if (ps->sz == 0)
{
return;
}
ps->sz--;
}
void pushfront(pSeqlist ps, DataType d)
{
int i = 0;
assert(ps);
if (ps->sz == MAX)
{
return;
}
for (i = ps->sz; i > 0; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[0] = d;
ps->sz++;
}
void popfront(pSeqlist ps)
{
assert(ps);
if (ps->sz == 0)
{
return;
}
int i = 0;
for (i = 0; i < ps->sz; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
void insert(pSeqlist ps, int pos, DataType d)
{
assert(ps);
if (ps->sz == MAX)
{
return;
}
int i = 0;
for (i = ps->sz; i > pos; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[pos] = d;
ps->sz++;
}
int find(pSeqlist ps,DataType d)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
if (ps->Data[i] == d)
{
return i;
}
}
return -1;
}
void Remove(pSeqlist ps, DataType d) //shanchu
{
assert(ps);
int i = 0;
int ret = find(ps, d);
if (ret != -1)
{
for (i = ret; i < ps->sz; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
}
void reverse(pSeqlist ps) //nixu
{
assert(ps);
int left = 0;
int right = ps->sz-1;
while (left < right)
{
DataType tmp = ps->Data[left];
ps->Data[left] = ps->Data[right];
ps->Data[right] = tmp;
left++;
right--;
}
}
int binarysearch(pSeqlist ps, DataType d)
{
assert(ps);
int left = 0;
int right = ps->sz - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (ps->Data[mid] > d)
{
right = mid - 1;
}
else if (ps->Data[mid] < d)
{
left = mid + 1;
}
else
{
return mid;
}
}
}
void sort(pSeqlist ps)
{
assert(ps);
int i = 0;
int j = 0;
for (i = 0; i < ps->sz-1; i++)
{
for (j = 0; j < ps->sz - 1 - i; j++)
{
if (ps->Data[j]>ps->Data[j + 1])
{
DataType tmp = ps->Data[j];
ps->Data[j] = ps->Data[j + 1];
ps->Data[j + 1] = tmp;
}
}
}
}
test.c 函数测试
#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"
int main()
{
Seqlist sq;
init(&sq);
pushback(&sq, 6);
pushback(&sq, 2);
pushback(&sq, 3);
pushback(&sq, 8);
pushback(&sq, 9);
printf("尾插:");
print(&sq);
popback(&sq);
popback(&sq);
printf("尾删:");
print(&sq);
pushfront(&sq, 1);
pushfront(&sq, 7);
printf("头插:");
print(&sq);
popfront(&sq);
printf("头删:");
print(&sq);
printf("删除元素3:");
Remove(&sq, 3);
print(&sq);
printf("在位置2插入元素5:");
insert(&sq, 2, 5);
print(&sq);
sort(&sq);
printf("排序顺序表:");
print(&sq);
int ret = binarysearch(&sq, 5);
printf("二分查找元素5,位置为%d\n", ret);
reverse(&sq);
printf("逆序顺序表:");
print(&sq);
system("pause");
return 0;
}
运行结果: