Data Structures(一)顺序表

线性表:在数据元素的非空有限集合中,除第一个元素无直接前驱、最后一个元素无直接后继,集合中其余每个数据元素都有唯一直接前驱唯一直接后继。

线性表有顺序存储结构和链式存储结构两种存储方式。含有大量类型相同记录的线性表称为文件或数据对象。但是一个线性表中的数据元素必须属于同一个数据对象。因此线性表中相邻元素存在序偶关系。

线性表的特点:

1、同一性:同一数据类型

2、有穷性:有限数据元素

3、有序性:相邻元素存在序偶关系

本章重点:顺序表

n个相同类型的数据元素的有限序列,除第一个元素无直接前驱、最后一个元素无直接后继,集合中其余每个数据元素都有唯一直接前驱唯一直接后继,数据元素是一对一的关系。

#pragma once

//线性表的顺序存储结构------顺序表 
typedef size_t DataType;
#define MAXSIZE 20

typedef struct SeqList
{
	DataType arr[MAXSIZE];
	DataType size;
}SeqList;

void InitList(SeqList* list); //初始化
DataType Size(SeqList* list); //顺序表的大小
DataType FindData(SeqList* list, DataType pos); //查找第i个元素
void printList(SeqList* list);//输出顺序表
void insertBack(SeqList* list, DataType x); //尾插
void insertFront(SeqList* list, DataType x); //头插
void popBack(SeqList* list); //尾删
void popFront(SeqList* list); //头删
void del(SeqList* list, DataType pos); //删除
void insert(SeqList* list, DataType pos, DataType x); //插入
void Modify(SeqList* list, DataType pos, DataType x); //修改
void SeqListRemoveAll(SeqList *list, DataType x);//删除所有值为x的数据  要求时间复杂度为n 空间复杂度为1


void InitList(SeqList* list)
{
	memset(list->arr, 0, sizeof(DataType)*MAXSIZE);
	list->size = 0;
}

void printList(SeqList* list)
{
	assert(list);
	for (size_t i = 0; i < list->size; i++)
	{
		cout << list->arr[i] << " ";
	}
	cout << endl;
}

DataType Size(SeqList* list)
{
	return list->size;
}

DataType FindData(SeqList* list, DataType pos)
{
	assert(list);
	if (pos > list->size || pos < 0)
	{
		cout << "超出索引" << endl;
	}
	return list->arr[pos - 1];
}

void insertBack(SeqList* list, DataType x)
{
	if (list->size >= MAXSIZE)
	{
		cout << "数组已满" << endl;
		return;
	}
	else
	{
		list->arr[list->size] = x;
		list->size++;
	}
}

void insertFront(SeqList* list, DataType x)
{
	if (list->size >= MAXSIZE)
	{
		cout << "数组已满" << endl;
		return;
	}
	else
	{
		size_t end = list->size;
		while (end > 0)
		{
			end--;
			list->arr[end + 1] = list->arr[end];
		}
		list->arr[0] = x;
		list->size++;
	}
}

void popBack(SeqList* list)
{
	if (list->size == 0)
	{
		cout << "数组为空" << endl;
	}
	list->arr[list->size - 1] = 0;
	list->size--;
}

void popFront(SeqList* list)
{
	if (list->size == 0)
	{
		cout << "数组为空" << endl;
	}

	for (size_t i = 0; i < list->size; i++)
	{
		list->arr[i] = list->arr[i + 1];
	}
	list->size--;
}

void del(SeqList* list, DataType pos)
{
	if (list->size == 0)
	{
		cout << "数组为空" << endl;
	}
	else if (pos > list->size || pos < 0)
	{
		cout << "删除位置不合法" << endl;
	}
	else
	{
		for (size_t i = pos - 1; i < list->size; i++)
		{
			list->arr[i] = list->arr[i + 1];
		}
		list->size--;
	}
}
void insert(SeqList* list, DataType pos, DataType x)
{
	if (list->size >= MAXSIZE)
	{
		cout << "数组已满" << endl;
	}
	else if (pos > list->size + 1 || pos < 0)
	{
		cout << "插入位置不合法" << endl;
	}
	else
	{
		size_t end = list->size;
		while (end > pos - 1)
		{
			end--;
			list->arr[end + 1] = list->arr[end];
		}
		list->arr[pos - 1] = x;
		list->size++;
	}
}
void Modify(SeqList* list, DataType pos, DataType x)
{
	assert(list);
	if (pos > list->size || pos < 0)
	{
		cout << "修改位置不合法" << endl;
	}
	list->arr[pos - 1] = x;
}

void SeqListRemoveAll(SeqList *list, DataType x)
{
	assert(list);
	size_t index = 0;
	size_t i = 0;
	size_t count = 0;
	for (; i < list->size; i++)
	{
		if (list->arr[i] != x)
		{
			list->arr[index] = list->arr[i];
			index++;
		}
		else
		{
			count++;
		}
	}
	list->size -= count;
}


void testSeqList()
{
	SeqList list;
	InitList(&list);
	insertBack(&list, 1);
	insertBack(&list, 2);
	insertBack(&list, 3);
	insertBack(&list, 4);
	insertFront(&list, 7);
	insertFront(&list, 8);
	insertFront(&list, 9);
	popBack(&list);
	popBack(&list);
	popFront(&list);
	popFront(&list);
	del(&list, 2);
	insert(&list, 3, 9);
	Modify(&list, 3, 8);
	insertBack(&list, 1);
	insertBack(&list, 2);
	insertBack(&list, 3);
	insertBack(&list, 4);
	insertBack(&list, 1);
	insertBack(&list, 2);
	insertBack(&list, 3);
	insertBack(&list, 4);
	SeqListRemoveAll(&list, 2);
	printList(&list);
	cout << Size(&list) << endl;
	cout << FindData(&list, 2) << endl;
}

 

//顺序表的动态存储----动态顺序表

typedef struct ma_SeqList
{
	DataType *array;   //数据块指针
	size_t _size;     //当前有效数据量
	size_t _capacity; //容量
}ma_SeqList;

//初始化
void Init_ma_List(ma_SeqList* list, size_t capacity)
{
	assert(list&&capacity > 0);
	list->array = (DataType*)malloc(sizeof(DataType)*capacity);
	list->_size = 0;
	list->_capacity = capacity;
}

//扩容
void checkCapacity(ma_SeqList* list)
{
	if (list->_size >= list->_capacity)
	{
		DataType* a = (DataType*)realloc(list->array, sizeof(DataType)*list->_capacity * 2);
		assert(a);
		list->array = a;
		list->_capacity *= 2;
	}
}
//尾插
void insert_ma_Back(ma_SeqList* list, DataType x)
{
	assert(list);
	checkCapacity(list);
	list->array[list->_size] = x;
	list->_size++;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值