DataStruct/数据结构---顺序表

顺序表是线性的,较为简单,一般用数组储存,设计出一个可以动态增加容量的顺序表。

静态表可能会导致表的容量太小以至于装不下大量的数据

首先

设置默认的列表大小、扩容大小和元素类型

#define SeqListDataType int
#define SEQLIST_DEFAULT_SIZE 10
#define SEQLIST_DEFAULT_INC_SIZE 5

定义SeqList结构体

typedef struct SeqList
{
	SeqListDataType* base;
	size_t capacity;
	size_t size;
}SeqList;

函数声明以及函数实现

//函数声明
//1初始化
void InitSeqList(SeqList* pst);
//2判满
bool IsFull(SeqList* pst);
//3判空
bool IsEmpty(SeqList* pst);
//4尾插
void SeqListPushBack(SeqList* pst, SeqListDataType data);
//5头插
void SeqListPushFront(SeqList* pst, SeqListDataType data);
//6尾删
void SeqListPopBack(SeqList* pst);
//7头删
void SeqListPopFront(SeqList* pst);
//8按位置插入
void SeqListInsertPos(SeqList* pst, int pos, SeqListDataType data);
//9按值插入
void SeqListInsertVal(SeqList* pst, SeqListDataType data);
//10按位置删除
void SeqListDelPos(SeqList* pst, int pos);
//11查找
int SeqListFind(SeqList* pst, SeqListDataType data);
//12按值删除
void SeqListDelVal(SeqList* pst, SeqListDataType data);
//13清空
void clear(SeqList* pst);
//14反转
void SeqListReverse(SeqList* pst);
//15排序
void Sort(SeqList* pst);
//16扩容
bool SeqListInc(SeqList* pst);
//函数定义
void InitSeqList(SeqList* pst)
{
	pst->base = (SeqListDataType*)malloc(SEQLIST_DEFAULT_SIZE * sizeof(SeqListDataType));
	assert(pst->base != NULL);
	pst->capacity = SEQLIST_DEFAULT_SIZE;
	pst->size = 0;
}

bool IsFull(SeqList* pst)
{
	return pst->size >= pst->capacity;
}

bool IsEmpty(SeqList* pst)
{
	return pst->size == 0;
}

void SeqListPushBack(SeqList* pst, SeqListDataType data)
{
	if (IsFull(pst)&&!SeqListInc(pst))
	{
		printf("顺序表已满,无法插入数据");
		return;
	}
	pst->base[pst->size++] = data;
}

void SeqListPushFront(SeqList* pst, SeqListDataType data)
{
	if (IsFull(pst)&&!SeqListInc(pst))
	{
		printf("顺序表已满,无法插入数据");
		return;
	}
	for (int i = pst->size; i > 0; i--)
	{
		pst->base[i] = pst->base[i - 1];
	}
	pst->base[0] = data;
	pst->size++;
}

void ShowSeqList(SeqList* pst)
{
	for (int i = 0; i < pst->size; i++) 
	{
		printf("%d ",pst->base[i]);
	}
	printf("\n");
}

void SeqListPopBack(SeqList* pst)
{
	if (IsEmpty(pst))
	{
		printf("顺序表已空,无法删除数据");
		return;
	}
	pst->size--;
}

void SeqListPopFront(SeqList* pst)
{
	if (IsEmpty(pst))
	{
		printf("顺序表已空,无法删除数据");
		return;
	}
	for (int i = 0; i<pst->size; i++)
	{
		pst->base[i] = pst->base[i + 1];
	}
	pst->size--;
}

void SeqListInsertPos(SeqList* pst, int pos, SeqListDataType data)
{
	if (pos<0 || pos>pst->size)
	{
		printf("输入位置不合法");
		return;
	}

	if (IsFull(pst) && !SeqListInc(pst))
	{
		printf("顺序表已满,无法插入数据");
		return;
	}

	for (int i = pst->size; i > pos; i--)
	{
		pst->base[i] = pst->base[i - 1];
	}
	pst->base[pos] = data;
	pst->size++;
}

void SeqListInsertVal(SeqList* pst, SeqListDataType data)
{
	if (IsFull(pst) && !SeqListInc(pst))
	{
		printf("顺序表已满,无法插入数据");
		return;
	}

	int pos = 0;
	while (data > pst->base[pos] && pos < pst->size)
	{
		pos++;
	}

	for (int i = pst->size; i > pos; i--)
	{
		pst->base[i] = pst->base[i - 1];
	}
	pst->base[pos] = data;
	pst->size++;

}

void SeqListDelPos(SeqList* pst, int pos)
{
	if (pos < 0 || pos > pst->size)
	{
		printf("删除的位置不合法,无法删除");
		return;
	}

	for (int i = pos; i <= pst->size; i++)
	{
		pst->base[i] = pst->base[i + 1];
	}
	pst->size--;
}

int SeqListFind(SeqList* pst, SeqListDataType data)
{
	for (int i = 0; i < pst->size; i++)
	{
		if (data == pst->base[i])
		{
			return i;
		}
	}
	printf("不存在查询元素");
}

void SeqListDelVal(SeqList* pst, SeqListDataType data)
{
	if (IsEmpty(pst))
	{
		printf("列表为空");
		return;
	}

	for (int i = 0; i < pst->size; i++)
	{
		if (data == pst->base[i])
		{
			while(i <= pst->size)
			{
				pst->base[i] = pst->base[i + 1];
				i++;
			}
			pst->size--;
			return;
		}
	}

	printf("无删除元素\n");
}

void clear(SeqList* pst)
{
	pst->size = 0;
}

void SeqListReverse(SeqList* pst)
{
	int left = 0;
	int right = pst->size - 1;
	while (left < right)
	{
		SeqListDataType tmp = pst->base[left];
		pst->base[left] = pst->base[right];
		pst->base[right] = tmp;
		left++;
		right--;
	}
}

void Sort(SeqList* pst)
{
	if (IsEmpty(pst))
	{
		printf("列表为空");
		return;
	}

	for (int i = 0; i < pst->size; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (pst->base[i] < pst->base[j])
			{
				SeqListDataType tmp = pst->base[i];
				pst->base[i] = pst->base[j];
				pst->base[j] = tmp;
			}
		}
	}
}

bool SeqListInc(SeqList* pst)
{
	SeqListDataType* new_base = (SeqListDataType*)realloc(pst->base, sizeof(SeqListDataType) * (pst->capacity+SEQLIST_DEFAULT_INC_SIZE));
	if (new_base == NULL)
	{
		printf("扩容失败\n");
		return;
	}
	printf("扩容成功\n");
	pst->base = new_base;
	pst->capacity = pst->capacity + SEQLIST_DEFAULT_INC_SIZE;
	return true;

}

主函数

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"

int main()
{
	SeqList mylist;
	InitSeqList(&mylist);
	SeqListDataType data;
	int pos;
	int select = 1;
	while (select)
	{
		printf("***************************\n");
		printf("1.PushBack     2.PushFront\n");
		printf("3.ShowList     0.Quit\n");
		printf("4.PopBack      5.PopFront\n");
		printf("6.InsPos       7.InsVal\n");
		printf("8.DelPos       9.Find\n");
		printf("10.DelVal      11.clear\n");
		printf("12.Reverse      13.Sort\n");
		printf("***************************\n");
		printf("请选择:<");
		scanf("%d", &select);

		if (select == 0)
		{
			break;
		}

		switch (select)
		{
		case 1:
			printf("请输入要插入的值(-1结束):> ");
			while (scanf("%d", &data),data!=-1)
			{
				SeqListPushBack(&mylist, data);
			}
			break;
		case 2:
			printf("请输入要插入的值(-1结束):> ");
			while (scanf("%d", &data), data != -1)
			{
				SeqListPushFront(&mylist, data);
			}
			break;
		case 3:
			ShowSeqList(&mylist);
			break;
		case 4:
			SeqListPopBack(&mylist);
		case 5:
			SeqListPopFront(&mylist);
		case 6:
			printf("请输入要插入的位置");
			scanf("%d", &pos);
			printf("请输入要输入的值");
			scanf("%d", &data);
			SeqListInsertPos(&mylist, pos, data);
		case 7:
			printf("请输入要插入的值");
			scanf("%d", &data);
			SeqListInsertVal(&mylist, data);
		case 8:
			printf("请输入删除的位置");
			scanf("%d", &pos);
			SeqListDelPos(&mylist, pos);
			break;
		case 9:
			printf("请输入要查询的值");
			scanf("%d", &data);
			printf("查询值所在位置为%d\n",SeqListFind(&mylist, data));
			break;
		case 10:
			printf("请输入要删除的值");
			scanf("%d", &data);
			SeqListDelVal(&mylist, data);
			break;
		case 11:
			clear(&mylist);
			printf("清空成功");
			break;
		case 12:
			SeqListReverse(&mylist);
			printf("翻转成功\n");
			break;
		case 13:
			Sort(&mylist);
			printf("排序完成\n");
			break;
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值