目录
顺序表的介绍
顺序表是一种常见的数据结构,用于存储一组元素。它是由一段连续的内存空间组成的,每个元素都占据一定的空间,并按照一定的顺序排列。
顺序表可以通过数组实现,也可以通过链表实现。使用数组实现的顺序表,在内存中是连续存储的,可以通过下标直接访问元素,因此查找元素的时间复杂度为O(1)。但是插入和删除操作会涉及到元素的移动,时间复杂度为O(n)。
使用链表实现的顺序表,元素在内存中并不是连续存储的,而是通过指针相连的。插入和删除操作只需要修改指针,时间复杂度为O(1),但是查找元素需要遍历整个链表,时间复杂度为O(n)。
顺序表的主要优点是可以随机访问元素,插入和删除操作比较简单;缺点是插入和删除操作的时间复杂度较高,需要移动元素。因此,顺序表适合于频繁进行查找操作,而不频繁进行插入和删除操作的场景。
顺序表的实现(增 减 删 查)
SeqList.h头文件的建立
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLtype;
typedef struct SL //定义一个结构体
{
SLtype* arr;//顺序表的起始位置
int size;//顺序表中的有效数字
int capacity;//内存大小
}SL;
void SLInit(SL* ps);//初始化
void SLDestroy(SL* ps);//销毁
void SLCheckCapacity(SL* ps);//扩容
void SLPrintf(SL* ps);//打印顺序表
void SLPushFront(SL* ps,SLtype x);//在开头插入数据
void SLPushBack(SL* ps, SLtype x);//在尾部插入数据
void SLPopFront(SL* ps);//从开头删除数据
void SLPopBack(SL* ps);//从尾部删除数据
void SLRand(SL* ps, SLtype x, SLtype y);//从指定位置插入数据
SeqList.c功能函数文件的建立
1.顺序表的初始化
void SLInit(SL* ps)
{
assert(ps);
ps->arr = NULL;
ps->capacity = ps->size = 0;
}
2.顺序表的销毁
void SLDestroy(SL* ps)
{
assert(ps);
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->capacity = ps->size = 0;
}
3.顺序表的扩容
void SLCheckCapacity(SL* ps)
{
if (ps->capacity == ps->size)
{
int NEWCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLtype* str = (SLtype*)realloc(ps->arr, NEWCapacity * sizeof(SLtype));
if (str == NULL)
{
perror("str");
exit(1);
}
ps->arr = str;
ps->capacity = NEWCapacity;
}
}
4.顺序表的打印
void SLPrintf(SL* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%d", ps->arr[i]);
}
printf("\n");
}
5.在顺序表开头插入数据
void SLPushFront(SL* ps, SLtype x)
{
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size ; i >= 0; i--)
{
ps->arr[i+1] = ps->arr[i];
}
ps->arr[0] = x;
ps->size++;
}
6.在顺序表尾部插入数据
void SLPushBack(SL* ps, SLtype x)
{
assert(ps);
SLCheckCapacity(ps);
ps->arr[ps->size++] = x;
}
7.在顺序表开头删除数据
void SLPopFront(SL* ps)
{
assert(ps);
for (int i = 0; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
8.在顺序表尾部删除数据
void SLPopBack(SL* ps)
{
assert(ps);
assert(ps->size);
ps->size--;
}
9.从顺序表的指定位置后面插入数据
void SLRand(SL* ps, SLtype x, SLtype y)
{
assert(ps);
SLCheckCapacity(ps);
for (int i = ps->size; i >= y; i--)
{
ps->arr[i + 1] = ps->arr[i];
}
ps->arr[y] = x;
ps->size++;
}
Text.c主函数文件的建立
#include"SeqList.h"
void text1()
{
SL s1;
SLInit(&s1);//创建一个结构体S1
SLPushFront(&s1, 1);
SLPushFront(&s1, 2);
SLPushFront(&s1, 3);
SLPushFront(&s1, 4);
SLPrintf(&s1);
}
void text2()
{
SL s1;
SLInit(&s1);//创建一个结构体S1
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrintf(&s1);
}
void text3()
{
SL s1;
SLInit(&s1);//创建一个结构体S1
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrintf(&s1);
SLPopFront(&s1);
SLPrintf(&s1);
SLPopFront(&s1);
SLPrintf(&s1);
}
void text4()
{
SL s1;
SLInit(&s1);//创建一个结构体S1
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrintf(&s1);
SLPopBack(&s1);
SLPrintf(&s1);
SLPopBack(&s1);
SLPrintf(&s1);
SLPopBack(&s1);
SLPrintf(&s1);
}
void text5()
{
SL s1;
SLInit(&s1);//创建一个结构体S1
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 4);
SLPushBack(&s1, 5);
SLPrintf(&s1);
SLRand(&s1, 3, 2);
SLPrintf(&s1);
}
int main()
{
text1();//检测在顺序表开头插入数据
text2();//检测在顺序表尾部插入数据
text3();//检测在顺序表的开头删除数据
text4();//检测在顺序表的尾部删除数据
text5();//检测从顺序表的指定位置后面插入数据
return 0;
}