顺序表
首先,我们来定义一个顺序表结构,其中包含两个部分:
- 顺序表申请的存储容量
- 当前使用顺序表的长度
按照以上两点,我们定义顺序表结构如下:
#define MAX_SIZE 100 /* 定义顺序表的大小 */
typedef struct List{
int date[MAX_SIZE]; /* 申请存储容量 */
unsigned int length; /* 当前使用顺序表的长度 */
}List;
顺序表的常用操作接口如下:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_SIZE 100 /* 定义顺序表的大小 */
typedef struct List {
int date[MAX_SIZE]; /* 申请存储容量 */
unsigned int length; /* 当前使用顺序表的长度 */
}List;
#define LI_IS_NULL(li) \
{ \
if ((li == NULL)) { \
printf("%s:li is null or index is large!\n",__FUNCTION__); \
return -1; \
} \
}
#define LI_IS_FULL(li) \
{ \
if (listIsFull(li)) { \
printf("%s:list is full\n", __FUNCTION__); \
return -1; \
} \
}
#define LI_IS_EMPTY(li) \
{ \
if (listIsEmpty(li)) { \
printf("%s:list is empty\n", __FUNCTION__); \
return -1; \
} \
}
#define INDEX_IS_LARGE(index,li) \
{ \
if (index > (li->length - 1)) { \
printf("%s:index is large!\n",__FUNCTION__); \
return -1; \
} \
}
/* 初始化一个顺序表 */
int initList(List *li)
{
LI_IS_NULL(li);
memset(li->date, 0, MAX_SIZE);
li->length = 0;
return 0;
}
/* 判断是否是空顺序表 */
bool listIsEmpty(List *li)
{
if (li == NULL) {
printf("%s:li is null!\n",__FUNCTION__);
return false;
}
return (li->length == 0)?true:false;
}
/* 判断是否是满顺序表 */
bool listIsFull(List *li)
{
if (li == NULL) {
printf("%s:li is null!\n",__FUNCTION__);
return false;
}
return (li->length == MAX_SIZE)?true:false;
}
/* 获取顺序表的存储大小 */
int getListSize(List *li)
{
if (li == NULL) {
printf("%s:li is null!\n",__FUNCTION__);
return -1;
}
return (sizeof(li->date)/sizeof(li->date[0]));
}
/* 获取顺序表的已使用大小 */
int getListLength(List *li)
{
if (li == NULL) {
printf("%s:li is null!\n",__FUNCTION__);
return -1;
}
return li->length;
}
/* 顺序表中指定位置插入元素 */
int insertList(List *li, unsigned int index, int date)
{
LI_IS_NULL(li);
LI_IS_FULL(li);
INDEX_IS_LARGE(index, li);
int i = li->length;
for (i;i > index;i--) {
li->date[i] = li->date[i-1];
}
li->date[i] = date;
li->length++;
return 0;
}
/* 顺序表中头部插入元素 */
int insertListFromHead(List *li, int date)
{
LI_IS_NULL(li);
LI_IS_FULL(li);
int i = li->length;
for (i;i > 0;i--) {
li->date[i] = li->date[i-1];
}
li->date[i] = date;
li->length++;
return 0;
}
/* 顺序表中尾部插入元素 */
int insertListFromTail(List *li, int date)
{
LI_IS_NULL(li);
LI_IS_FULL(li);
li->date[li->length] = date;
li->length++;
return 0;
}
/* 顺序表中删除指定元素 */
int delListFromDate(List *li,int date)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i = 0;
int flag = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == date) {
for (int j = i;j < li->length;j++) {
li->date[j] = li->date[j+1];
}
li->length--;
flag++;
}
}
if (flag == 0) {
printf("no find date %d\n", date);
}
return 0;
}
/* 顺序表中删除指定元素(删除N个) */
int delListFromDateN(List *li,int date, unsigned int n)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i = 0;
int count = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == date) {
for (int j = i;j < li->length;j++) {
li->date[j] = li->date[j+1];
}
li->length--;
count++;
}
if (count == n) {
printf("delete done!\n");
return 0;
}
}
printf("only find %d\n", count);
return 0;
}
/* 顺序表中删除指定位置元素 */
int delListFromIndex(List *li, unsigned int index)
{
LI_IS_NULL(li);
INDEX_IS_LARGE(index, li);
LI_IS_EMPTY(li);
int i = 0;
for (i = index;i < li->length - 1;i++) {
li->date[i] = li->date[i+1];
}
li->length--;
return 0;
}
/* 顺序表中头部删除元素 */
int delListFromHead(List *li)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i = 0;
for (i = 0;i < li->length - 1;i++) {
li->date[i] = li->date[i+1];
}
li->length--;
return 0;
}
/* 顺序表中尾部删除元素 */
int delListFromTail(List *li)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
li->length--;
return 0;
}
/* 顺序表中修改指定元素 */
int modifyList(List *li,int oldDate, int newDate)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i = 0;
int flag = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == oldDate) {
li->date[i] = newDate;
flag++;
}
}
if (flag == 0) {
printf("modify filed,no find %d\n", oldDate);
}
return 0;
}
/* 顺序表中修改指定位置元素 */
int modifyListForIndex(List *li, unsigned int index, int newDate)
{
LI_IS_NULL(li);
INDEX_IS_LARGE(index, li);
LI_IS_EMPTY(li);
li->date[index] = newDate;
return 0;
}
/* 顺序表中查找指定元素首次出现的位置 */
int findDateInListFrist(List *li, int date)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == date) {
return i;
}
}
printf("not find !\n");
return -1;
}
/* 顺序表中查找指定元素所有出现的位置 */
int findDateInListAll(List *li, int date, unsigned int *locations)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
if (locations == NULL) {
printf("%s:locations is null\n", __FUNCTION__);
}
int i;
int j = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == date) {
locations[j] = i;
j++;
}
}
if (j == 0) {
printf("not find !\n");
}
return 0;
}
/* 顺序表中查找指定元素出现的次数 */
unsigned int findDateInListSum(List *li, int date)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i;
int count = 0;
for (i = 0;i < li->length;i++) {
if (li->date[i] == date) {
count++;
}
}
if (count == 0) {
printf("not find !\n");
return -1;
}
return count;
}
/* 顺序表中遍历元素 */
int showList(List *li)
{
LI_IS_NULL(li);
LI_IS_EMPTY(li);
int i;
for (i = 0;i < li->length;i++) {
printf("date[%d] = %d ", i, li->date[i]);
}
printf("\n");
return 0;
}
int main()
{
List li;
int locations[MAX_SIZE] = {0};
printf("初始化:\n");
initList(&li);
printf("判断是否是满顺序表");
if(listIsFull(&li)) {
printf("li is full!\n");
} else {
printf("li is not full!\n");
}
printf("判断是否是空顺序表");
if(listIsEmpty(&li)) {
printf("li is empty!\n");
} else {
printf("li is not empty!\n");
}
printf("使用头插法插入1,2,3\n");
insertListFromHead(&li,1);
insertListFromHead(&li,2);
insertListFromHead(&li,3);
showList(&li);
printf("顺序表容量:%d\n", getListSize(&li));
printf("顺序表已使用大小:%d\n", getListLength(&li));
printf("使用尾插法插入4,5,6\n");
insertListFromTail(&li,4);
insertListFromTail(&li,5);
insertListFromTail(&li,6);
printf("使用尾插法插入3,4,5\n");
insertListFromTail(&li,3);
insertListFromTail(&li,4);
insertListFromTail(&li,5);
showList(&li);
printf("在下标为2的位置插入数据6\n");
insertList(&li, 2, 6);
showList(&li);
printf("删除表中的3\n");
delListFromDate(&li, 3);
showList(&li);
printf("删除表中的7\n");
delListFromDate(&li, 7);
showList(&li);
printf("删除表中的两个2\n");
delListFromDateN(&li, 2, 2);
showList(&li);
printf("删除表中的下标为3的数据\n");
delListFromIndex(&li, 3);
showList(&li);
printf("删除表头一个数据\n");
delListFromHead(&li);
showList(&li);
printf("删除表尾一个数据\n");
delListFromTail(&li);
showList(&li);
printf("修改表中的2为8\n");
modifyList(&li, 2, 8);
showList(&li);
printf("修改表中下标1的数据为9\n");
modifyListForIndex(&li, 1, 9);
showList(&li);
printf("查找数据4首次出现的位置\n");
printf("首次出现的下标为:%d", findDateInListFrist(&li, 4));
printf("查找数据4出现的次数\n");
int count = findDateInListSum(&li, 4);
printf("首次出现的下标为:%d", count);
printf("查找数据4出现的所有位置\n");
findDateInListAll(&li, 4, locations);
for(int i = 0;i < count;i++) {
printf("locations[%d] = %d\n", i, locations[i]);
}
return 0;
}
持续更新,关注公众号