顺序表(Seqlist)&链表(List)的基础操作

描述:

顺序表和链表是数据结构的基础结构之一,同样也是面试的基础。初学者对于Seqlist和List的增删改查的基础练习,为其后的Tree,HashTable,Binary Linked List,Trigeminal linked list等数据结构打下坚实的基础。


C语言下的Seqlist:

<span style="font-size:18px;">
#include<stdio.h>
#include<stdlib.h>
#include<cassert>
#include<string.h>
#define Max_Size 10

typedef int Datatype;
typedef struct Seqlist
{
	Datatype arr[Max_Size];//顺序表的存储空间
	size_t size;//用以表示顺序表的有效数据
	Datatype x;
}Seqlist;

void Init(Seqlist* ptr)
{
	assert(ptr);
	memset(ptr->arr, 0, sizeof(Datatype)*Max_Size);
	ptr->size = 0;
}

void PushBack(Seqlist* ptr,Datatype x)
//尾插,直接将size值+1,然后将x值填入
{
	assert(ptr);
	if (ptr->size >= Max_Size)
	{
		printf("Seqlist is Full!\n");
		return;
	}
	ptr->arr[ptr->size++] = x;
}

void PopBack(Seqlist* ptr)
//尾删,直接将size值-1,注意末位置的数据并未真的删去
{
	assert(ptr);
	if (ptr->size <= 0)
	{
		printf("Seqlist is Empty!\n");
		return;
	}
	--ptr->size;
}

void PushFront(Seqlist* ptr,Datatype x)
//头插,将size值+1,然后从倒数第二个数据开始,不断后移,将首元素位置空出,然后填充x值。注意:若从前往后移动,会覆盖后续的所有数据。
{
	assert(ptr);
	int i = ptr->size - 1;
	if (ptr->size >= Max_Size)
	{
		printf("Seqlist is Full!\n");
		return;
	}
	ptr->size++;
	for (; i >= 0; --i)
	{
		ptr->arr[i + 1] = ptr->arr[i];
	}
	ptr->arr[0] = x;
}

void PopFront(Seqlist* ptr)
//头删,直接从第二个数据开始不断覆盖前一数据,然后size值-1
{
	assert(ptr);
	size_t i = 0;
	if (ptr->size <= 0)
	{
		printf("Seqlist is Empty!\n");
		return;
	}
	for (; i < ptr->size;++i)
	{
		ptr->arr[i] = ptr->arr[i+1];
	}
	--ptr->size;
}

void Erase(Seqlist* ptr, size_t pos)
//定向删除,首先从后往前执行类似头删的移动过程,直至到pos位置时停止。注意:数组的下标从0开始,所以应为pos-1的位置处
{
	assert(ptr);
	size_t i = pos - 1;
	if (ptr->size <= 0)
	{
		printf("Seqlist is Empty!\n");
		return;
	}
	for (; i < ptr->size; ++i)
	{
		ptr->arr[i] = ptr->arr[i + 1];
	}
	--ptr->size;
}

void Insert(Seqlist* ptr, Datatype x, size_t pos)
//定向插入,思想与Erase类似,在此不再赘述
{
	assert(ptr);
	assert(pos);
	if (ptr->size >= Max_Size)
	{
		printf("Seqlist is Full!\n");
		return;
	}
	if (pos > ptr->size)
	{
		printf("Illegal Insert!\n");
		return;
	}
	size_t i = ptr->size++;
	for (; i >= pos - 1; i--)
	{
		ptr->arr[i] = ptr->arr[i - 1];
	}
	ptr->arr[pos - 1] = x;
}

int Find_One(Seqlist* ptr,Datatype x)
//查找某元素值
{
	assert(ptr);
	size_t i = 0;
	for (; i < ptr->size; i++)
	{
		if (ptr->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

void Display(Seqlist* ptr)
//输出顺序表
{
	assert(ptr);
	size_t i = 0;
	if (ptr->size == 0)
	{
		printf("Seqlist is Empty!\n");
		return;
	}
	for (; i < ptr->size; i++)
	{
		printf("%d ", ptr->arr[i]);
	}
	printf("\n");
}</span>




▲顺序表有其限制性,对于静态的顺序表来说,其存储空间由一开始宏定义的Max_Size设置,而后不能再作变化,除非更改宏值。对于动态的顺序表,其增加了capacity容量的概念,可每次动态增长其size的值,可以参考点击进入此网站,不过cplusplus中的顺序表不再是Seqlist,而更名为Vector。



C++下的Seqlist:

<span style="font-size:18px;">
#include<iostream>
using namespace std;

SeqList::SeqList()
:_array(NULL)
, _size(0)
, _capacity(0)
{}
//顺序表只考虑深拷贝


//传统写法
SeqList(const SeqList& s)
      :_array(new DataTyp
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值