目录
一、 顺序表的概念及结构
顺序表示用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组储存,在数组上增删查改。
顺序表一般分为:
1.静态顺序表:使用定长数组存储元素。
#include<stdio.h>
#define N 10
typedef int SLDataType;
typedef struct SeqList
{
SLDataType data[N];
int size;//数组中有几个元素
int capacity;//数组容量
}SeqList;
2.动态顺序表:使用动态开辟的数组储存
typedef struct SeqList
{
SLDataType * data;//指向动态开辟的数组
int size;//数组中元素个位数;
int capacity;//容量
} SeqList;
二、实现顺序表
下面采用动态开辟的方式实现顺序表
1.初始化
//初始化
void SLIniti(SeqList* pc)
{
assert(pc);
pc->data = NULL;
pc->capacity = 0;
pc->size = 0;
}
2.打印
//打印
void SLPrint(SeqList* pc)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->size; i++)
{
printf("%d ", pc->data[i]);
}
printf("\n");
}
3.扩容
//扩容
void CheckCapacity(SeqList* pc)
{
assert(pc);
int NewCapacity = (pc->capacity == 0 ? 4 : 2 * pc->capacity);
SLDataType* temp = (SLDataType*)realloc(pc->data, NewCapacity * sizeof(SLDataType));
if (temp == NULL)
{
perror("realloc");
exit(-1);
}
pc->data = temp;
pc->capacity = NewCapacity;
temp = NULL;
}
4.尾插
//尾插
void SLPushBack(SeqList* pc, SLDataType nums)
{
assert(pc);
//检查容量
CheckCapacity(pc);
pc->data[pc->size] = nums;
pc->size++;
}
5.头插
//头插
void SLPushFront(SeqList* pc, SLDataType nums)
{
assert(pc);
CheckCapacity(pc);
int end = pc->size;
while (end > 0)
{
pc->data[end] = pc->data[end - 1];//挪动数据
end--;
}
pc->data[end] = nums;
pc->size++;
}
6.尾删
//尾删
void SLPopBack(SeqList* pc)
{
assert(pc);
if (pc->size > 0)
{
pc->size--;
}
}
7.头删
//头删
void SLPopFront(SeqList* pc)
{
assert(pc);
int begin = 0;
if (pc->size > 0)
{
while (begin < pc->size - 1)
{
pc->data[begin] = pc->data[begin + 1];//挪动数据
begin++;
}
}
pc->size--;
}
8.删除在pos位置的数
//删除在pos位置的数
void SLErase(SeqList* pc, int pos)
{
assert(pc);
assert(pos >= 0 && pos < pc->size);//检查是否在数组内
int begin = pos;
while(begin < pc->size - 1)
{
pc->data[begin] = pc->data[begin + 1];//挪动数据
begin++;
}
pc->size--;
}
我们可以根据这个函数将头删 尾删改成调用这个函数来实现代码如下:
8.1改进后的头删
//头删
void SLPopFront(SeqList* pc)
{
//assert(pc);
//int begin = 0;
//if (pc->size > 0)
//{
// while (begin < pc->size - 1)
// {
// pc->data[begin] = pc->data[begin + 1];//挪动数据
// begin++;
// }
//}
//pc->size--;
SLErase(pc, 0);
}
8.2改进后的尾删
//尾删
void SLPopBack(SeqList* pc)
{
//assert(pc);
//if (pc->size > 0)
//{
// pc->size--;
//}
SLErase(pc, pc->size - 1);
}
9.在pos处插入一个数
//在pos处插入一个数
void SLInsert(SeqList* pc, int pos, SLDataType nums)
{
assert(pc);
CheckCapacity(pc);
assert(pos >= 0 && pos <= pc->size);检查pos的位置
int end = pc->size;
while (end > pos)
{
pc->data[end] = pc->data[end - 1];//挪动数据
end--;
}
pc->data[end] = nums;
pc->size++;
}
同样的我们也可利用这个函数改进头插 尾插;
9.1改进后的头插
//头插
void SLPushFront(SeqList* pc, SLDataType nums)
{
//assert(pc);
//CheckCapacity(pc);
//int end = pc->size;
//while (end > 0)
//{
// pc->data[end] = pc->data[end - 1];
// end--;
//}
//pc->data[end] = nums;
//pc->size++;
SLInsert(pc, 0, nums);
}
9.2 改进后的尾插
//尾插
void SLPushBack(SeqList* pc, SLDataType nums)
{
//assert(pc);
检查容量
//CheckCapacity(pc);
//pc->data[pc->size] = nums;
//pc->size++;
SLInsert(pc, pc->size, nums);
}
10.修改数据
//修改pos位置的数据
void SLMotify(SeqList* pc, int pos, SLDataType nums)
{
assert(pc);
assert(pos >= 0 && pos < pc->size);
pc->data[pos] = nums;
}
11.查找数据
//查找
int SLFind(SeqList* pc, SLDataType nums)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->size; i++)
{
if (pc->data[i] == nums)
{
return i;
}
}
return -1;
}
12销毁数组
//销毁
void SLDestory(SeqList* pc)
{
assert(pc);
if (pc->data)
{
free(pc->data);
pc->data = NULL;
pc->size = 0;
pc->capacity = 0;
}
}
简单的顺序表就完成了,本篇博客也就到这里了,以上若有错误恳请大佬指正,感激不尽!!!