头文件
pragma once
#define INIT_SIZE 10
typedef struct DSeqList
{
int *elem;//指向保存数据的内存
int length;//有效数据个数
int listsize;//总格子数
}DSeqList;
typedef DSeqList * PDSeqList;
//初始化函数
void InitDSeqList(PDSeqList plist);
//往plist的pos位置插入数据val
bool Insert(PDSeqList plist,int pos,int val);
//打印
void Show(PDSeqList plist);
//判空
bool IsEmpty(PDSeqList plist);
//bool IsFuLL;
//
//查找,找到了返回下标,没有找到返回-1
int Search(PDSeqList plist,int key);
//删除
bool DeleteVal(PDSeqList plist,int key);
//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PDSeqList plist,int pos,int *rtval);
//获取pos下标存储的数据
bool GetVal(PDSeqList plist,int pos,int *rtval);
//修改pos下标的数据
bool SetVal(PDSeqList plist,int pos,int newval);
//获取val的前趋值
bool GetPriVal(PDSeqList plist,int key,int *rtval);
//获取val的后继值
bool GetNextVal(PDSeqList plist,int key,int *rtval);
//长度,即有效数据个数
int GetLength(PDSeqList plist);
//清除所有数据
void Clear(PDSeqList plist);
//销毁
void Destroy(PDSeqList plist);
cpp文件
#include"dseqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//初始化函数
void InitDSeqList(PDSeqList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return ;
}
plist->elem = (int *) malloc (INIT_SIZE*sizeof(int));
plist->length = 0;
plist->listsize = INIT_SIZE;
}
static bool IsFull(PDSeqList plist)
{
return plist ->length == plist->listsize;
}
//总容量扩大到原来的2倍
static void Inc(PDSeqList plist)
{
//plist->elem = (int *) malloc (INIT_SIZE*2*sizeof(int));//error
plist->elem = (int *) realloc(plist->elem,2*plist->listsize*sizeof(int));
plist->listsize *= 2;
}
//往plist的pos位置插入数据val
bool Insert(PDSeqList plist,int pos,int val)
{
assert(plist != NULL);
if(pos <0 || pos >plist->length)// !!!
{
return false;
}
if(IsFull(plist))
{
Inc(plist);
}
for(int i =plist->length-1; i>=pos;i--)//!!!
{
plist->elem[i+1] = plist->elem[i];
}
plist->elem[pos] = val;
plist->length++;
return true;
}
//打印
void Show(PDSeqList plist)
{
for(int i= 0;i<plist->length;i++)
{
printf("%d ",plist->elem[i]);
}
printf("\n");
}
//判空
bool IsEmpty(PDSeqList plist)
{
return plist->length == 0;
}
static bool IsFuLL(PDSeqList plist)
{
return plist->length == plist->listsize ;
}
//查找,找到了返回下标,没有找到返回-1
int Search(PDSeqList plist,int key)
{
assert(plist != NULL );
for(int i= 0;i<plist->length-1;i++)
{
if(plist->elem[i] == key)
{
return i;
}
}
return -1;
}
//删除
bool DeleteVal(PDSeqList plist,int key)
{
int i = Search(plist,key);
if(i == -1)
{
return false;
}
return DeletePos(plist,i,NULL);
}
//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PDSeqList 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 --;
}
//获取pos下标存储的数据
bool GetVal(PDSeqList plist,int pos,int *rtval)
{
assert(plist != NULL);
if(pos < 0 || pos >=plist->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[pos];
}
return true;
}
//修改pos下标的数据
bool SetVal(PDSeqList plist,int pos,int newval)
{
assert(plist != NULL);
if(pos < 0 || pos >=plist->length)
{
return false;
}
plist->elem[pos] = newval;
return true;
}
//获取val的前趋值
bool GetPriVal(PDSeqList 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(PDSeqList plist,int key,int *rtval)
{
int i = Search(plist,key);
if(i <0 || i>=plist->length-1)
{
return false;
}
if(rtval != NULL)
{
*rtval = plist->elem[i+1];
}
return true;
}
//长度,即有效数据个数
int GetLength(PDSeqList plist)
{
return plist->length;
}
//清除所有数据
void Clear(PDSeqList plist)
{
plist->length = 0;
}
//销毁
void Destroy(PDSeqList plist)
{
free(plist->elem);
}
主函数
#include<stdio.h>
#include<stdlib.h>
#include"dseqlist.h"
int main()
{
DSeqList dseq;
InitDSeqList(&dseq);
for(int i= 0;i<40;i++)
{
Insert(&dseq,i,i);
}
Show(&dseq);
DeletePos(&dseq,5,NULL);
Show(&dseq);
Destroy(&dseq);
Clear(&dseq);
Show(&dseq);
return 0;
}