最近复习到C语言的顺序表,把它实现一遍。
给出顺序表的定义
#define MAX_SIZE 100
typedef int DataType;
typedef struct SeqList
{
DataType array[MAX_SIZE];
int size; // 记录有效元素的个数
}SeqList, *PSeqList;
void InitSeqList(PSeqList pSeqList);//线性表初始化
void PushBack(PSeqList pSeqList, DataType data);//在线性表后面插入
void PopBack(PSeqList pSeqList);//在线性表后面删除
void PushFront(PSeqList pSeqList, DataType data);//在线性表前面插入
void PopFront(PSeqList pSeqList);//在线性表前面删除
void Insert(PSeqList pSeqList, int pos, DataType data);//在线性表指定位置插入
void Erase(PSeqList pSeqList, int pos);//在线性表指定位置删除
int Find(PSeqList pSeqList, DataType data);//查找元素,返回下标
void Remove(PSeqList pSeqList, DataType data);//删除值为data的元素
void RemoveAll(PSeqList pSeqList, DataType data);//删除所有值为data的元素
int Empty(PSeqList pSeqList);//判别线性表是否空
void PrintSeqList(PSeqList pSeqList);//打印线性表
void test();//测试函数,只写了一部分
具体实现:
int main()
{
test();
getchar();
return 0;
}
void test()
{
SeqList seqList;
PSeqList p = &seqList;
InitSeqList(p);
PrintSeqList(p);
int is_empty = Empty(p);
printf("%d\n", is_empty);
PushBack(p, 1);
PushBack(p, 2);
PushBack(p, 3);
PrintSeqList(p);
PopBack(p);
PopBack(p);
PrintSeqList(p);
InitSeqList(p);
PushFront(p, 3);
PushFront(p, 2);
PushFront(p, 1);
PrintSeqList(p);
PopFront(p);
PopFront(p);
PrintSeqList(p);
InitSeqList(p);
printf("before insert:\n");
PushBack(p, 1);
PushBack(p, 2);
PushBack(p, 3);
PushBack(p, 4);
PushBack(p, 5);
PrintSeqList(p);
printf("after insert:\n");
Insert(p, 3, 33);
PrintSeqList(p);
printf("after erase:\n");
Erase(p, 4);
PrintSeqList(p);
PushFront(p, 33);
PushBack(p, 33);
PrintSeqList(p);
printf("after remove 2:\n");
Remove(p, 2);
PrintSeqList(p);
printf("after remove_all 33:\n");
RemoveAll(p, 33);
PrintSeqList(p);
}
void InitSeqList(PSeqList pSeqList)
{
pSeqList->size = 0;
for (int i = 0; i < MAX_SIZE; i++) {
pSeqList->array[i] = 0;
}
}
void PushBack(PSeqList pSeqList, DataType data)
{
if (pSeqList->size <= MAX_SIZE - 1)
pSeqList->array[pSeqList->size++]= data;
else {
printf("SeqList is full\n");
}
}
void PopBack(PSeqList pSeqList)
{
if (pSeqList->size >= 0)
pSeqList->array[pSeqList->size--] = 0;
else
printf("SeList is empty\n");
}
void PushFront(PSeqList pSeqList, DataType data)
{
if (pSeqList->size <= MAX_SIZE - 1) {
for (int i = pSeqList->size; i >= 1; i--) {
pSeqList->array[i] = pSeqList->array[i - 1];
}
pSeqList->array[0] = data;
pSeqList->size++;
}
else {
printf("SeqList is full\n");
}
}
void PopFront(PSeqList pSeqList)
{
if (pSeqList->size >= 0) {
pSeqList->size--;
for (int i = 0; i < pSeqList->size; i++) {
pSeqList->array[i] = pSeqList->array[i + 1];
}
}
else
printf("SeqList is empty\n");
}
void Insert(PSeqList pSeqList, int pos, DataType data)
{
if (pos >= 1 && pos <= pSeqList->size && pSeqList->size + 1 < MAX_SIZE) {
for (int i = pSeqList->size; i >= pos; i--) {
pSeqList->array[i] = pSeqList->array[i - 1];
}
pSeqList->array[pos - 1] = data;
pSeqList->size++;
}
else {
printf("The SeqList can't be inserted\n");
}
}
void Erase(PSeqList pSeqList, int pos)
{
if (pos >= 1 && pos <= pSeqList->size) {
for (int i = pos; i < pSeqList->size; i++) {
pSeqList->array[i - 1] = pSeqList->array[i];
}
pSeqList->array[--pSeqList->size] = 0;
}
else {
printf("The SeqList can't be erased\n");
}
}
int Find(PSeqList pSeqList, DataType data)
{
int i = 0;
while (i < pSeqList->size) {
if (pSeqList->array[i] == data)
return i + 1;
i++;
}
return 0;
}
void Remove(PSeqList pSeqList, DataType data)
{
int pos = Find(pSeqList, data);
Erase(pSeqList, pos);
}
void RemoveAll(PSeqList pSeqList, DataType data)
{
int i = 0;
int count = 0;
while (i < pSeqList->size) {
if (pSeqList->array[i] == data)
count++;
i++;
}
while (count--) {
int pos = Find(pSeqList, data);
Erase(pSeqList, pos);
}
}
int Empty(PSeqList pSeqList)
{
return pSeqList->size == 0;
}
void PrintSeqList(PSeqList pSeqList)
{
printf("Currently the elements in the SeqList:");
if (pSeqList->size == 0) {
printf("The SeqList is empty\n");
return;
}
for (int i = 0; i < pSeqList->size; i++) {
printf("%d ", pSeqList->array[i]);
}
printf("\n");
}