分为三部分:
SeqList.h负责函数的声明
SeqList.c负责函数功能的实现
test.c负责总体实现
下列为源代码:
SeqList.h
#pragma once
typedef int DataType;
typedef struct SeqList
{
DataType *arr;
int size;//有效元素个数
int Capacity;//容量
}SeqList, *PSeqList;
void SeqListInit(PSeqList ps);
void SeqListDestroy(PSeqList ps);
void SeqListPushBack(PSeqList ps, DataType data);
void SeqListPopBack(PSeqList ps);
void PrintSeqList(PSeqList ps);
void SeqListPushFront(PSeqList ps, DataType data);
void SeqListPopFront(PSeqList ps);
void SeqListInsert(PSeqList ps, int pos, DataType data);
void SeqListErase(PSeqList ps, int pos);
int SeqListFind(PSeqList ps, DataType data);
int SeqListCapacity(PSeqList ps);
int SeqListSize(PSeqList ps);
int SeqListEmpty(PSeqList ps);
DataType SeqListFront(PSeqList ps);
DataType SeqlistBack(PSeqList ps);
void SeqListRemove(PSeqList ps, DataType data);
void SeqListRemoveAll(PSeqList ps, DataType data);
SeqList.c
#include "SeqList.h"
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <memory.h>
#include <stdlib.h>
void SeqListInit(PSeqList ps)
{
assert(ps);
ps->arr = (DataType*)malloc((sizeof(DataType)) * 10);
if (NULL == ps->arr)
{
assert(0);
return;
}
ps->Capacity = 10;
ps->size = 0;
}
void SeqListDestroy(PSeqList ps)
{
assert(ps);
if (ps->arr)
{
free(ps->arr);
ps->arr = NULL;
ps->Capacity = 0;
ps->size = 0;
}
}
void CheckCapacity(PSeqList ps)//检测容量
{
assert(ps);
if (ps->size == ps->Capacity)
{
int newCapacity = ps->Capacity * 2;
DataType *pTmp = (DataType*)malloc(sizeof(DataType)*newCapacity);
if (NULL == pTmp)
{
assert(0);
return;
}
memcpy(pTmp, ps->arr, ps->size*sizeof(DataType));
free(ps->arr);
ps->arr = pTmp;
ps->Capacity = newCapacity;
}
}
void SeqListPushBack(PSeqList ps, DataType data)//尾插
{
assert(ps);
//判断是否增容
CheckCapacity(ps);
ps->arr[ps->size] = data;
ps->size++;
}
void SeqListPopBack(PSeqList ps)//尾删
{
assert(ps);
ps->size--;
}
void PrintSeqList(PSeqList ps)//显示
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; ++i)
{
printf("%d ", ps->arr[i]);
}
printf("\n");
}
void SeqListPushFront(PSeqList ps, DataType data)//头插
{
assert(ps);
int i = 0;
//判断是否需要增容
CheckCapacity(ps);
for (i = ps->size - 1; i >= 0; --i)
{
ps->arr[i+1] = ps->arr[i];
}
ps->arr[0] = data;
ps->size++;
}
void SeqListPopFront(PSeqList ps)//头删
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size-1; ++i)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
int SeqListFind(PSeqList ps, DataType data)//查找
{
assert(ps);
for (int i = 0; i < ps->size; ++i)
{
if (ps->arr[i] == data)
return i;
}
return -1;
}
void SeqListInsert(PSeqList ps, int pos, DataType data)//任意位置插入
{
assert(ps);
int i = 0;
if (pos<0 || pos>ps->size)
{
printf("插入位置不合法!\n");
return;
}
CheckCapacity(ps);
for (i = ps->size - 1; i >= pos; --i)
{
ps->arr[i+1] = ps->arr[i];
}
ps->arr[pos] = data;
ps->size++;
}
void SeqListErase(PSeqList ps, int pos)//任意位置删除
{
assert(ps);
int i = 0;
if (pos<0 || pos>=ps->size)
{
printf("删除位置不合法!\n");
return;
}
for (i = pos; i < ps->size; ++i)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
int SeqListCapacity(PSeqList ps)
{
assert(ps);
return ps->Capacity;
}
int SeqListSize(PSeqList ps)
{
assert(ps);
return ps->size;
}
int SeqListEmpty(PSeqList ps)
{
assert(ps);
return 0 == ps->size;
}
DataType SeqListFront(PSeqList ps)
{
assert(ps);
return ps->arr[0];
}
DataType SeqlistBack(PSeqList ps)
{
assert(ps);
return ps->arr[ps->size - 1];
}
void SeqListRemove(PSeqList ps, DataType data)
{
assert(ps);
SeqListErase(ps, SeqListFind(ps, data));
}
void SeqListRemoveAll(PSeqList ps, DataType data)
{
assert(ps);
int count = 0;
for (int i = 0; i < ps->size; ++i)
{
if (ps->arr[i] == data)
{
count++;
}
else
{
ps->arr[i - count] = ps->arr[i];
}
}
ps->size -= count;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
#include <stdlib.h>
#include <stdio.h>
void menu()
{
printf("** 1.尾部插入 2.尾部删除 **\n");
printf("** 3.头部插入 4.头部删除 **\n");
printf("** 5.任意位置插入 6.任意位置删除 **\n");
printf("** 7.查找 8.返回容量 **\n");
printf("** 9.返回有效值 10.返回第一个值 **\n");
printf("** 11.返回最后一个值 12.移除一个为data的值 **\n");
printf("** 13.移除为data的所有值 14.显示 **\n");
printf("** 15.释放 16.置空 **\n");
}
void test()
{
SeqList s;
SeqListInit(&s);
int input = 0;
DataType data = 0;
int pos = 0;
int ret = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要插入的数:");
scanf("%d", &data);
SeqListPushBack(&s, data);
break;
case 2:
SeqListPopBack(&s);
break;
case 3:
printf("请输入要插入的数:");
scanf("%d", &data);
SeqListPushFront(&s, data);
break;
case 4:
SeqListPopFront(&s);
break;
case 5:
printf("请输入要插入的位置:");
scanf("%d", &pos);
printf("请输入要插入的数:");
scanf("%d", &data);
SeqListInsert(&s, pos, data);
break;
case 6:
printf("请输入要删除值的位置:");
scanf("%d", &pos);
SeqListErase(&s, pos);
break;
case 7:
printf("请输入要查找的数:");
scanf("%d", &data);
ret=SeqListFind(&s, data);
printf("查找的数的下标为:%d\n", ret);
break;
case 8:
SeqListCapacity(&s);
break;
case 9:
SeqListSize(&s);
break;
case 10:
SeqListFront(&s);
break;
case 11:
SeqlistBack(&s);
break;
case 12:
printf("请输入要移除的值:");
scanf("%d", &data);
SeqListRemove(&s, data);
break;
case 13:
printf("请输入要移除的值:");
scanf("%d", &data);
SeqListRemoveAll(&s, data);
break;
case 14:
PrintSeqList(&s);
break;
case 15:
SeqListDestroy(&s);
break;
case 16:
SeqListEmpty(&s);
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
附加(学习C++与Linux后):C++实现顺序表的操作源代码(github):
https://github.com/wangbiy/review/tree/master/SeqList