#include <stdio.h>
#include <stdlib.h>
#include "JWArray.h"
/*######################################################################*/
/*######################################################################*/
/* 基础线性表函数声明 */
/*######################################################################*/
/*######################################################################*/
/************************************************************************/
/* 创建指定大小的顺序线性表,nIncrSize参数用于当存储空间不够时重新分配存储 */
/************************************************************************/
JWArray* JWArrayCreate(const int nInitSize, const int nIncrSize)
{
JWArray *pArray;
if (NULL == (pArray = (JWArray *)malloc(sizeof(JWArray))))
{
return NULL;
}
if (NULL == (pArray->pElem = (JWArrayElem *)malloc(nInitSize * sizeof(JWArrayElem))))
{
free(pArray);
return NULL;
}
pArray->nLength = 0;
pArray->nTotalSize = nInitSize;
pArray->nIncrSize = nIncrSize;
return pArray;
}
/************************************************************************/
/* 销毁线性表 */
/************************************************************************/
void JWArrayDestroy(JWArray *pArray)
{
if (NULL != pArray)
{
if (NULL != pArray->pElem)
{
free(pArray->pElem);
}
free(pArray);
}
}
/************************************************************************/
/* 清空线性表 */
/************************************************************************/
void JWArrayMakeEmpty( JWArray *pArray )
{
pArray->nLength = 0;
}
JWArray_BOOL JWArrayIsEmpty(JWArray *pArray)
{
return pArray->nLength == 0 ? JWARRAY_TRUE : JWARRAY_FALSE;
}
JWArray_BOOL JWArrayIsFull(JWArray *pArray)
{
return pArray->nLength >= pArray->nTotalSize ? JWARRAY_TRUE : JWARRAY_FALSE;
}
int JWArrayGetLength(JWArray *pArray)
{
return pArray->nLength;
}
/************************************************************************/
/* 获得指定索引(0~长度-1)的值 */
/************************************************************************/
JWArray_BOOL JWArrayGetAt(JWArray *pArray, const int nIndex, JWArrayElem *pElem)
{
//判断输入索引是否合法,包含表为空的情况
if (nIndex < 0 || nIndex > (pArray->nLength-1))
{
return JWARRAY_FALSE;
}
//获得当前索引的值
*pElem = pArray->pElem[nIndex];
return JWARRAY_TRUE;
}
/************************************************************************/
/* 在指定索引(0~长度)前插入新值,索引==长度时表示在末尾添加新值 */
/************************************************************************/
JWArray_BOOL JWArrayInsert(JWArray *pArray, const int nIndex, const JWArrayElem elem)
{
int i;
JWArrayElem *pNewElem;
//判断输入索引是否合法
if (nIndex < 0 || nIndex > pArray->nLength)
{
return JWARRAY_FALSE;
}
//如果表满则重新分配更大的表
if (JWARRAY_TRUE == JWArrayIsFull(pArray))
{
pNewElem = (JWArrayElem *)realloc(pArray->pElem, (pArray->nTotalSize + pArray->nIncrSize) * sizeof(JWArrayElem));
if (NULL == pNewElem)
{
return JWARRAY_FALSE;
}
else
{
pArray->pElem = pNewElem;
pArray->nTotalSize += pArray->nIncrSize;
}
}
//指定位置插入值
for (i = pArray->nLength; i > nIndex; i--)
{
pArray->pElem[i] = pArray->pElem[i-1];//对于字符串和结构体此处的值传递操作可能要改变一下形式
}
pArray->pElem[nIndex] = elem;//对于字符串和结构体此处的值传递操作可能要改变一下形式
pArray->nLength++;
return JWARRAY_TRUE;
}
/************************************************************************/
/* 删除指定索引的值(0~长度-1) */
/************************************************************************/
JWArray_BOOL JWArrayDelete(JWArray *pArray, const int nIndex, JWArrayElem *pElem)
{
int i;
//判断输入索引是否合法,包含表为空的情况
if (nIndex < 0 || nIndex > (pArray->nLength-1))
{
return JWARRAY_FALSE;
}
//删除指定位置的值
if (NULL != pElem)
{
*pElem = pArray->pElem[nIndex];
}
for (i = nIndex; i < (pArray->nLength-1); i++)
{
pArray->pElem[i] = pArray->pElem[i+1];//对于字符串和结构体此处的值传递操作可能要改变一下形式
}
pArray->nLength--;
return JWARRAY_TRUE;
}
/************************************************************************/
/* 在线性表中遍历找到满足pCompare函数的索引返回索引号,没找到则返回-1 */
/************************************************************************/
int JWArrayLocate(JWArray *pArray, const JWArrayElem elem, JWArray_CompareFunc pCompare)
{
int i;
for (i = 0; i < pArray->nLength; i++)
{
if (JWARRAY_TRUE == pCompare(pArray->pElem[i], elem))//找到满足要求的索引项
{
return i;
}
}
return -1;
}
void JWArrayDump(JWArray *pArray, char *pDumpElemFormat)
{
int i;
//判断是否为空
if (pArray->nLength == 0)
{
printf("当前顺序表为空\n\n");
return;
}
//打印当前顺序线性表数据
printf("当前顺序表值列表详情如下:\n");
printf("是否为空:%s\n", JWARRAY_TRUE == JWArrayIsEmpty(pArray) ? "空" : "非空");
printf("是否为满:%s\n", JWARRAY_TRUE == JWArrayIsFull(pArray) ? "满" : "非满");
printf("长度:%d\n", JWArrayGetLength(pArray));
printf("值列表(下标从0~...):\n");
for (i = 0; i < pArray->nLength; i++)
{
printf(pDumpElemFormat, pArray->pElem[i]); //不同值类型Dump此处的pDumpElemFormat不同
//每五个数据一行
if ((i+1)%5 == 0)
{
printf("\n");
}
}
printf("\n\n");
}
void JWArrayDump_Int(JWArray *pArray)
{
JWArrayDump(pArray, "%d\t");
}
void JWArrayDump_Double(JWArray *pArray)
{
JWArrayDump(pArray, "%f\t");
}
void JWArrayDump_Char(JWArray *pArray)
{
JWArrayDump(pArray, "%c\t");
}
/*######################################################################*/
/*######################################################################*/
/* 栈操作函数声明 */
/*######################################################################*/
/*######################################################################*/
/************************************************************************/
/* 获得当前栈顶元素的值
** 下标最大的为栈顶元素 */
/************************************************************************/
JWArray_BOOL JWArrayGetTop(JWArray *pArray, JWArrayElem *pElem)
{
//判断栈是否为空
if (0 == pArray->nLength)
{
return JWARRAY_FALSE;
}
//获得当前栈顶的值
*pElem = pArray->pElem[pArray->nLength - 1];
return JWARRAY_TRUE;
}
/************************************************************************/
/* 当前栈入栈一个元素 */
/************************************************************************/
JWArray_BOOL JWArrayPush(JWArray *pArray, const JWArrayElem elem)
{
JWArrayElem *pNewElem;
//如果栈满则重新分配更大的栈
if (JWARRAY_TRUE == JWArrayIsFull(pArray))
{
pNewElem = (JWArrayElem *)realloc(pArray->pElem, (pArray->nTotalSize + pArray->nIncrSize) * sizeof(JWArrayElem));
if (NULL == pNewElem)
{
return JWARRAY_FALSE;
}
else
{
pArray->pElem = pNewElem;
pArray->nTotalSize += pArray->nIncrSize;
}
}
//末尾位置插入值
pArray->pElem[pArray->nLength++] = elem;//对于字符串和结构体此处的值传递操作可能要改变一下形式
return JWARRAY_TRUE;
}
/************************************************************************/
/* 当前栈出栈一个元素 */
/************************************************************************/
JWArray_BOOL JWArrayPop(JWArray *pArray, JWArrayElem *pElem)
{
//判断栈是否为空
if (0 == pArray->nLength)
{
return JWARRAY_FALSE;
}
//栈顶出栈
if (NUL