1.概念及结构
顺序表是用一段
物理地址连续
的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
顺序表一般可以分为:
1. 静态顺序表:使用定长数组存储元素。
所谓的静态顺序表,是事先define 一个常量
例如定义一个结构体
#define MAX 1000
typedef int SLDataType;
// 顺序表的静态存储
typedef struct SeqList
{
SLDataType SLData[MAX]; // 定长数组
size_t size ; // 有效数据个数
}SeqList;
2.动态顺序表:使用自定义长度存储元素。
typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组
size_t size ; // 有效数据个数
size_t capicity ; // 容量空间的大小
}SeqList;
2.顺序表的增删查改。
实现效果:
1.尾插
2.尾删
3.头插
4.头删
5.查找
6.指定位置插入
7.指定位置删除
8.输出
9.总结
1.尾插>>
在顺序表的末尾插入>>前面的数字不需要移动。
代码段->
void SeqListPushBack(SeqList* ps, SLDateType x)//尾插
{
SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
2.尾删>>
删除第最后一个元素
void SeqListPopFront(SeqList* ps)//尾删
{
if(ps->size!=0)
ps->a[ps->size--];
else
printf("无需删除,没有字符");
}
2.头插>>
头插需要移动数据,从后向前移动,如果从前向后移动,第一个元素会覆盖后面的每一个元素->>导致与自己想要的结果存在差异。
void SeqListPushFront(SeqList* ps, SLDateType x)//头插
{
SLCheckCapacity(ps);
ps->size++;
int end = ps->size - 1;
while (end>=0)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
}
3.头删>>
与头插相反,从第二个元素开始往前拷贝,第一个空间的数可以不用删,因为能够覆盖,最后减去一个空间。如图所示>>
void SeqListPopBack(SeqList* ps)//头删
{
if (ps->size != 0)
{
int end = 0;
while (end <= ps->size - 1)
{
ps->a[end] = ps->a[end + 1];
end++;
}
ps->size--;
}
else
printf("无需删除,没有字符");
}
5.查找
int SeqListFind(SeqList* ps, SLDateType x)// 顺序表查找
{
for (int i = 0; i < ps->size; i++)
{
if (x == ps->a[i])
{
return i;
}
else
return -1;
}
}
6.指定位置插入
与头插同理,只不过是在指定的位置进行插入。
void SeqListInsert(SeqList* ps, int pos, SLDateType x)// 顺序表在pos位置插入x
{
SLCheckCapacity(ps);
ps->size++;
int end = ps->size - 1;
while (end>=pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
}
7.指定位置删除
类似于头删
void SeqListErase(SeqList* ps, int pos)// 顺序表删除pos位置的值
{
int end = pos;
while (end <= ps->size)
{
ps->a[end] = ps->a[end + 1];
end++;
}
ps->size--;
}
8.输出顺序表
void SeqListPrint(SeqList* ps)//输出
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d", ps->a[i]);
}
}
9.总结
完整代码
#define _CRT_SECURE_NO_WARNINGS 7
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
#include<string.h>
typedef int SLDateType;
typedef struct SeqList
{
SLDateType *a;
int size;
int capacity;
}SeqList;
void SeqListInit(SeqList* ps);
void SeqListDestroy(SeqList* ps);
void SeqListPrint(SeqList* ps);
void SeqListPushBack(SeqList* ps, SLDateType x);
void SeqListPushFront(SeqList* ps, SLDateType x);
void SeqListPopFront(SeqList* ps);
void SeqListPopBack(SeqList* ps);
int SeqListFind(SeqList* ps, SLDateType x);
void SeqListInsert(SeqList* ps, int pos, SLDateType x);
void SeqListErase(SeqList* ps, int pos);
void SeqListModty(SeqList* ps, int pos, SLDateType x);
#include"contect.h"
void SeqListInit(SeqList* ps)
{
ps->a = (SLDateType*)malloc(sizeof(SLDateType)*4);
if (ps->a == NULL)
{
perror("malloc fill");
}
ps->capacity = 4;
ps->size = 0;
}
void SeqListDestroy(SeqList* ps)
{
free(ps->a);
ps->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
void SLCheckCapacity(SeqList* ps)
{
if (ps->size == ps->capacity)
{
SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * ps->capacity * 2);
if (tmp == NULL)
{
perror("realloc");
return;
}
ps->a = tmp;
ps->capacity = ps->capacity * 2;
}
}
void SeqListPushBack(SeqList* ps, SLDateType x)//尾插
{
SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
void SeqListPushFront(SeqList* ps, SLDateType x)//头插
{
SLCheckCapacity(ps);
ps->size++;
int end = ps->size - 1;
while (end>=0)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
}
void SeqListPopFront(SeqList* ps)//尾删
{
if(ps->size!=0)
ps->a[ps->size--];
else
printf("无需删除,没有字符");
}
void SeqListPopBack(SeqList* ps)//头删
{
if (ps->size != 0)
{
int end = 0;
while (end <= ps->size - 1)
{
ps->a[end] = ps->a[end + 1];
end++;
}
ps->size--;
}
else
printf("无需删除,没有字符");
}
void SeqListPrint(SeqList* ps)//输出
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d", ps->a[i]);
}
}
int SeqListFind(SeqList* ps, SLDateType x)// 顺序表查找
{
for (int i = 0; i < ps->size; i++)
{
if (x == ps->a[i])
{
return i;
}
else
return -1;
}
}
void SeqListInsert(SeqList* ps, int pos, SLDateType x)// 顺序表在pos位置插入x
{
SLCheckCapacity(ps);
ps->size++;
int end = ps->size - 1;
while (end>=pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
}
void SeqListErase(SeqList* ps, int pos)// 顺序表删除pos位置的值
{
int end = pos;
while (end <= ps->size)
{
ps->a[end] = ps->a[end + 1];
end++;
}
ps->size--;
}
void SeqListModty(SeqList* ps, int pos, SLDateType x)//修改
{
assert(0 <= pos && pos <= ps->size);
ps->a[x] = pos;
}int main()
{
SeqList s;
SeqListInit(&s);
SeqListPushBack(&s, 1);
SeqListPushBack(&s, 2);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 4);
SeqListPushBack(&s, 4);
SeqListPushBack(&s, 4);
SeqListPopFront(&s);
SeqListPushFront(&s,0);
SeqListPushFront(&s, 0);
SeqListPopBack(&s);
SeqListInsert(&s, 5, 5);
SeqListErase(&s, 6);
int pos=SeqListFind(&s, 5);
if (pos != -1)
{
SeqListErase(&s, 5);
}
SeqListModty(&s,3,7);
SeqListPrint(&s);
SeqListDestroy(&s);
}