顺序表:用一段地址连续存储单元依次存储数据元素的线性结构。
#define MAX_SIZE 10
typedef int DataType;
struct SeqList
{DataType _array[MAX_SIZE];
int _size;//顺序表中元素的个数}
以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。
接下来我将用静态顺序表来实现尾插,头插,任意插入数据,尾删,头删等
头文件:
#ifndef __SEP__LIST__
#define __SEP__LIST__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#define MAX_SIZE 10
typedef int DataType;
typedef struct seqlist
{
DataType arr[MAX_SIZE];
size_t size;//顺序表中元素的个数
}SeqList,*PseqList;
//初始化顺序表
void InitSeqList(SeqList* seqList);
//在顺序表中尾插元素data
void PushBack(SeqList* seqList, DataType data);
//将顺序表的尾部元素抛出
void PopBack(SeqList* seqList);
//头插data
void PushFront(SeqList* pSeqList, DataType data);
//头删
void PopFront(SeqList* pSeqList);
//查找data,返回该元素的顺序表的位置
int Find(SeqList* pSeqList, DataType data);
//在顺序表的pos的位置插入元素
void Insert(SeqList* pSeqList, size_t pos, DataType data);
//删除顺序表pos位置的元素
void Erase(SeqList* pSeqList, size_t pos);
//移除顺序表中值为data 的值
void Remove(SeqList* pSeqList, DataType data);
//移除顺序表中所有值为data 的值
void RemoveAll(SeqList* pSeqList, DataType data);
#endif
函数实现部分
#include "seqlist.h"
void InitSeqList(SeqList* seqList)
{
assert(seqList);
memset(seqList, 0, sizeof(DataType)*MAX_SIZE);//可以一个字节一个字节的把整个数组设置成指定的值(第一个参数是起始地址,第二个是设置数组每个字节的值,第三个是数组长度)
seqList->size = 0;//插入数据从顺序表的最开始插入
}
void PushBack(SeqList* seqList, DataType data)
{
assert(seqList);
if (MAX_SIZE == seqList->size)
{
printf("顺序表已经满\n");
return;
}
seqList->arr[seqList->size] = data;
seqList->size++;
}
void PopBack(SeqList* seqList)
{
assert(seqList);
if (0 == seqList->size)
{
printf("顺序表是空的,不能Pop\n");
return;
}
seqList->size--;//此时顺序表中元素没有被真正删除,只是使得Pop的元素无效
}
void PushFront(SeqList* pSeqList, DataType data)
{
size_t index = pSeqList->size;
assert(pSeqList);
if (MAX_SIZE == pSeqList->size)
{
printf("顺序表已经满");
return;
}
for (; index > 0; index--)
{
pSeqList->arr[index] = pSeqList->arr[index - 1];//顺序表是从第一位插入的,所以以后的元素要向后移动,否则会被覆盖。
}
pSeqList->arr[index] = data;
pSeqList->size++;
}
void Popfront(SeqList* pSeqList)
{
size_t index = 1;
assert(pSeqList);
if (0 == pSeqList->size)
{
printf("顺序表为空不能POP");
return;
}
for (; index < pSeqList->size; index++)
{
pSeqList->arr[index - 1] = pSeqList->arr[index];
//index=1在操作时对它减一,是因为害怕数组越界。
}
pSeqList->size--;
}
int Find(SeqList* pSeqList, DataType data)
{
size_t index = 0;
assert(pSeqList);
for (; index < pSeqList->size; index++)
{
if (pSeqList->arr[index] == data)
{
return index + 1;
}
}
return -1;//位置不会是负数,当返回-1时,知道顺序表中没有想要的数据
}
void Tnsert(SeqList* pSeqList, size_t pos, DataType data)
{
size_t index = pSeqList->size;
assert(pSeqList);
if (pos > pSeqList->size)
{
printf("插入位置不合法\n");//保证插入的元素都是连续的
return;
}
if (MAX_SIZE == pSeqList->size)
{
printf("顺序表满了\n");
return;
}
for (; index >= pos; index--)
{
pSeqList->arr[index] = pSeqList->arr[index - 1];
//把插入数据及其后面的元素向后移动。
}
pSeqList->arr[index] = data;
pSeqList->size++;
}
void Erase(SeqList* pSeqList, size_t pos)
{
size_t index = pos - 1;
assert(pSeqList);
if (pos > pSeqList->size)
{
printf("这个位置没有存储数据元素");
return;//否则会溢出
}
for (; index < pSeqList->size - 1; index++)
{
pSeqList->arr[index] = pSeqList->arr[index + 1];
//此时数组下标不会越界,index最多到size-2。
}
pSeqList->size--;
}
void Remove(SeqList* pSeqList, DataType data)
{
size_t index = 0;
size_t temp = 0;
assert(pSeqList);
for (; index < pSeqList->size;index++)
{
if (pSeqList->arr[index] == data)
{
for (temp = index; temp < pSeqList->size - 1; temp++)
{
pSeqList->arr[temp] = pSeqList->arr[temp + 1];//在顺序表中找到该数时,就把后面的元素向前移动一位,达到消除目的
}
pSeqList->size--;
return;
}
}
}
void RemoveAll(SeqList* pSeqList, DataType data);
{size_t index = 0;
size_t rem = 0;
assert(pSeqList);
for (; index < pSeqList->size; index++)
{
if (pSeqList->arr[index] == data)
{
for (rem = index; rem < pSeqList->size - 1; rem++)
{
pSeqList->arr[rem] = pSeqList->arr[rem + 1];
}
pSeqList->size--;
index--;
}
}
}
测试部分
#include "seqlist.h"
SeqList seqList;
//尾插尾删
void TestFun1()
{
InitSeqList(&seqList);
PushBack(&seqList, 1);
PushBack(&seqList, 2);
PushBack(&seqList, 3);
PushBack(&seqList, 4);
printSeqList(&seqList);
PopBack(&seqList);
PopBack(&seqList);
printSeqList(&seqList);
}
//测试头插头删
void TestFun2()
{
InitSeqList(&seqList);
pushFornt(&seqList, 1);
pushFornt(&seqList, 2);
pushFornt(&seqList, 3);
pushFornt(&seqList, 4);
printSeqList(&seqList);
PopFront(&seqList);
PopFront(&seqList);
printSeqList(&seqList);
}
//测试在任意位置插入删除data
void TestFun3()
{
int ret = 0;
InitSeqList(&seqList);
pushFornt(&seqList, 1);
pushFornt(&seqList, 2);
pushFornt(&seqList, 3);
pushFornt(&seqList, 4);
ret = Find(&seqList,4);
Insert(&seqList, 3, 5);
Erase(&seqList,5);
printf("%d\n",ret);
printSeqList(&seqList);
}
//测试移除data
void TestFun3()
{
InitSeqList(&seqList);
pushFornt(&seqList, 1);
pushFornt(&seqList, 2);
pushFornt(&seqList, 2);
pushFornt(&seqList, 4);
pushFornt(&seqList, 1);
pushFornt(&seqList, 2);
pushFornt(&seqList, 2);
pushFornt(&seqList, 4);
Remove(&seqList, 2);
printSeqList(&seqList);
RemoveAll(&seqList,2);
printSeqList(&seqList);
}