顺序表基本实现(非扩容方法)

顺序表

首先,我们来定义一个顺序表结构,其中包含两个部分:

  1. 顺序表申请的存储容量
  2. 当前使用顺序表的长度
    按照以上两点,我们定义顺序表结构如下:
#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;
}

持续更新,关注公众号
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ghost_199503

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值