定长顺序表:
seqlist.h文件
//.h
//定长顺序表
#pragma once
#include <stdbool.h>
#define SIZE 10
typedef struct SeqList
{
int elem[SIZE]; //保存数据
int length; //有效数据的个数
}SeqList;
typedef SeqList *PSeqList;
//初始化函数
void InitSeqList(PSeqList plist); //PSeqList == SeqList*
//往plist的pos位置插入数据val
bool Insert(PSeqList plist, int pos, int val);
//打印
void Show(PSeqList plist);
//判空
bool IsEmpty(PSeqList plist);
//bool IsFull
//
//查找,如果找到了就返回给下标,没有找到的话就返回-1
int Search(PSeqList plist, int key);
//删除
bool DeleteVal(PSeqList plist,int key);
//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PSeqList plist, int pos, int *rtval);
//获取pos下标所存储的数据
bool GetVal(PSeqList plist, int pos, int *rtval);
//修改pos下标的数据
bool SetVal(PSeqList plist, int pos, int newval);
//获取val的前趋值
bool GetPriVal(PSeqList plist, int key, int *rtval);
//获取val的后继值
bool GetNextVal(PSeqList plist, int key, int *rtval);
//长度,即有效数据的个数
int GetLength(PSeqList plist);
//清楚所有数据
void Clear(PSeqList plist);
//销毁该树
void Destory(PSeqList plist);
seqlist.c文件
#include <stdio.h>
#include <stdio.h>
#include <assert.h>
#include "seqlist.h"
//初始化函数
void InitSeqList(PSeqList plist) //PSeqList == SeqList*
{
assert(plist != NULL);
plist->length = 0; //即当前位置没有有效数据所以该树为空
}
//往plist的pos位置插入数据val
bool Insert(PSeqList plist, int pos, int val)
{
assert(plist != NULL);
if(pos < 0 || pos > plist->length || plist->length == SIZE)
{
return false;
}
//插入新数据,移动pos之后的数据
for(int i = plist->length - 1; i >= pos; i--)
{
plist->elem[i+1] = plist->elem[i];
}
//插入新数据
plist->elem[pos] = val;
//更新有效数据的个数
plist->length++;
}
//打印
void Show(PSeqList plist)
{
assert(plist != NULL);
for(int i = 0; i < plist->length; i++)
{
printf("%d ", plist->elem[i]);
}
printf("\n");
}
//判空
bool IsEmpty(PSeqList plist)
{
return plist->length == 0;
}
//bool IsFull
//
//查找,如果找到了就返回给下标,没有找到的话就返回-1
int Search(PSeqList plist, int key)
{
assert(plist != NULL);
for( int i = 0; i < plist->length; i++)
{
if(plist->elem[i] == key)
{
return i;
}
}
return -1;
}
//删除
bool DeleteVal(PSeqList plist,int key)
{
assert(plist != NULL);
int i = Search(plist, key);
if(i == -1)
{
return false;
}
return DeletePos(plist, i, NULL);
}
//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PSeqList plist, int pos, int *rtval)
{
assert(plist != NULL);
if(pos < 0 || pos >= plist->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[pos];
}
//移动数据
for(int i = pos; i < plist->length-1; i++)
{
plist->elem[i] = plist->elem[i+1];
}
plist->length--;
return true;
}
//获取pos下标所存储的数据
bool GetVal(PSeqList plist, int pos, int *rtval)
{
if(pos < 0 || pos >= plist->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[pos];
}
return true;
}
//修改pos下标的数据
bool SetVal(PSeqList plist, int pos, int newval)
{
if(pos < 0 || pos >= plist->length)
{
return false;
}
plist->elem[pos] = newval;
return true;
}
//获取val的前趋值
bool GetPriVal(PSeqList plist, int key, int *rtval)
{
int i = Search(plist, key);
if( i <= 0)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[i-1];
}
return true;
}
//获取val的后继值
bool GetNextVal(PSeqList plist, int key, int *rtval)
{
int i = Search(plist, key);
if(i >= plist->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[i+1];
}
return true;
}
//长度,即有效数据的个数
int GetLength(PSeqList plist)
{
return plist->length;
}
//清楚所有数据
void Clear(PSeqList plist)
{
plist->length = 0;
}
//销毁该树
void Destory(PSeqList plist)
{
Clear(plist);
}
main.c
#include <stdio.h>
#include "seqlist.h"
int main()
{
SeqList seq;
InitSeqList(&seq);
for( int i = 0; i < 20; i++)
{
Insert(&seq, i , i);
}
Show(&seq);
DeleteVal(&seq,5);
Show(&seq);
Insert(&seq,3,30);
Show(&seq);
Clear(&seq);
Show(&seq);
return 0;
}