顺序表的顺序指用一组地址连续的储存单元依次存储线性表的数据结构。
其结构如下
所实现的功能:
顺序表的初始化
顺序表的插入
顺序表删除某一结点
顺序表的查找
顺序表的长度
顺表是否为空
顺序表的清空
顺序表的销毁
最简单顺序表—固定的大小
SeqList.h
#pragma once //预防头文件被重复引用
#define SIZE 10
typedef struct SeqList
{
int elem[SIZE];//存放数据的数组
int length;//有效数据个数
}SeqList,*PSeqList;//PSeqList == SeqList *
//初始化
void InitSeqList(PSeqList ps);
//在ps的pos下标插入val
bool Insert(PSeqList ps,int pos,int val);
//在ps中查找第一个key,找到返回下标,失败-1
int Search(PSeqList ps,int key);
//删除ps中第一个key
bool Delete(PSeqList ps,int key);
//删除ps中pos位置的值
bool DeletePos(PSeqList ps,int pos);
//获取ps中第一个key的前驱下标
int GetPrio(PSeqList ps,int key);
//获取ps中第一个key的后继下标
int GetNext(PSeqList ps,int key);
//获取长度(有效数据个数)
int GetLength(PSeqList ps);
//判空
bool IsEmpty(PSeqList ps);
//清空数据
void Clear(PSeqList ps);
//销毁ps
void Destroy(PSeqList ps);
void Show(PSeqList ps);
SeqList.cpp
//顺序表的实现
#include "seqlist.h"
#include <stdio.h>
#include <assert.h>
//初始化
void InitSeqList(PSeqList ps)
{
assert(ps != NULL);
if(ps == NULL)
{
return;
}
ps->length = 0;
//lenght = 0;//error
}
static bool IsFull(PSeqList ps)
{
return ps->length == SIZE;
}
//在ps的pos下标插入val
bool Insert(PSeqList ps,int pos,int val)
{
if(pos<0 || pos>ps->length || IsFull(ps))
{
return false;
}
int i;
for(i=ps->length-1;i>=pos;i--)//数据后移
{
ps->elem[i+1] = ps->elem[i];
}
ps->elem[pos] = val;//赋新值
ps->length++;
return true;
}
//在ps中查找第一个key,找到返回下标,失败-1
int Search(PSeqList ps,int key)
{
for(int i=0;i<ps->length;i++)
{
if(ps->elem[i] == key)
{
return i;
}
}
return -1;
}
//删除ps中第一个key
bool Delete(PSeqList ps,int key)
{
int index = Search(ps,key);
/*if(index < 0)
{
return false;
}*/
return DeletePos(ps,index);
//return DeletePos(ps,Search(ps,key));
}
//删除ps中pos位置的值
bool DeletePos(PSeqList ps,int pos)
{
if(pos<0 || pos>=ps->length)
{
return false;
}
for(int i=pos;i<ps->length-1;i++)
{
ps->elem[i] = ps->elem[i+1];
}
ps->length--;
return true;
}
//获取ps中第一个key的前驱下标,注意第一个元素没有前驱
int GetPrio(PSeqList ps,int key)
{
return Search(ps,key) - 1;
}
//获取ps中第一个key的后继下标,注意最后一个元素没有后继
int GetNext(PSeqList ps,int key)
{
int index = Search(ps,key);
if(index<0 || (index==ps->length-1))
{
return -1;
}
return index + 1;
}
//获取长度(有效数据个数)
int GetLength(PSeqList ps)
{
return ps->length;
}
//判空
bool IsEmpty(PSeqList ps)
{
return ps->length == 0;
}
//清空数据
void Clear(PSeqList ps)
{
ps->length = 0;
}
//销毁ps
void Destroy(PSeqList ps)
{
Clear(ps);
}
void Show(PSeqList ps)
{
for(int i=0;i<ps->length;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
}