描述:
顺序表和链表是数据结构的基础结构之一,同样也是面试的基础。初学者对于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