标签:
/*
***************************线性表的顺序实现:用一组地址连续的存储单元依次存储线性表的数据元素
*************************即用数组的实现
参考自:http://blog.csdn.net/thefutureisour/article/details/7830062
*/
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct ArrayList
{
ElemType *aArray;//实际的数组
int iLength;//实际的元素个数
int iSize;//容量
}aAL;
void Test(bool Function);
bool InitList(aAL *aal, int len);//初始化---len表示指定的容量
void DestroyList(aAL *aal);//只要释放给数组的空间,实际元素个数和容量都置为0
void ClearList(aAL *aal);
bool ListEmpty(aAL *aal);
int ListLength(aAL *aal);
bool GetElem(aAL *aal, int i, int *e);
int LocateElem(aAL *aal, int e);//成功返回e对应的下标,否则返回-1
bool PriorElem(aAL *aal, int e, int *Pre_e);
bool NextElem(aAL *aal, int e, int *Next_e);
bool ListInsert(aAL *aal, int i, int e);
bool ListDelete(aAL *aal, int i, int *e);
void ListTraverse(aAL *aal);
int main(void)
{
//--------------链表的初始化
//aAL *aTest = NULL;
aAL aTest;
int len;
int i, e;//e是当前元素的值 i是第i个元素的下标
printf("请输入你想要的数组的容量:");
scanf("%d", &len);
printf("InitList:");
Test(InitList(&aTest, len));
ListTraverse(&aTest);
//------------在链表中的第i个位置插入一个元素并使长度加1
//printf("请输入当前要插入元素的值:");
//scanf("%d", &e);
ListInsert(&aTest, 0, 10);
ListInsert(&aTest, 0, 20);
ListInsert(&aTest, 0, 30);
ListInsert(&aTest, 0, 40);
ListInsert(&aTest, 0, 50);
ListTraverse(&aTest);
//-------------链表的销毁
//DestroyList(aTest);
//------------链表的清空
//ClearList(aTest);
//------------判断链表是否为空
printf("ListEmpty:");
Test(ListEmpty(&aTest));
ListTraverse(&aTest);
//------------测链表的长度
printf("链表的当前长度为: %d\n", ListLength(&aTest));
ListTraverse(&aTest);
//------------返回第i个元素的值
printf("请输入要得到元素的下标:");
scanf("%d", &i);
GetElem(&aTest, i, &e);
printf("当前元素是: %d\n", e);
ListTraverse(&aTest);
//------------返回当前元素的下标
printf("请输入当前元素的值来得到其下标:");
scanf("%d", &e);
printf("当前元素的下标是: %d\n", LocateElem(&aTest, e));
ListTraverse(&aTest);
//------------找到当前元素的直接前驱的值
int Pre_e;
printf("请输入当前元素的值来找直接前驱的值:");
scanf("%d", &e);
Test(PriorElem(&aTest, e, &Pre_e));
printf("直接前驱的值: %d\n", Pre_e);
ListTraverse(&aTest);
//------------找到当前元素的直接后继的值
int Next_e;
printf("请输入当前元素的值来找直接后继的值:");
scanf("%d", &e);
Test(NextElem(&aTest, e, &Next_e));
printf("直接后继的值: %d\n", Next_e);
ListTraverse(&aTest);
//------------在链表中的第i个位置插入一个元素并使长度加1
printf("请输入当前要插入元素的值和它的下标:");//e是当前元素的值 i是第i个元素的下标
scanf("%d%d", &e, &i);
ListInsert(&aTest, i, e);
ListTraverse(&aTest);
//------------在链表中的第i个位置删除一个元素并使长度减1
printf("请输入当前要删除元素的下标:");
scanf("%d", &i);
ListDelete(&aTest, i, &e);
printf("你删除的数是:%d\n", e);
ListTraverse(&aTest);
//-------------------------------
return 0;
}
void Test(bool Function)
{
if (Function)
printf("SUCCESS\n");
else
printf("FAIL\n");
}
bool InitList(aAL *aal, int len)
{
aal->iLength = 0;//实际的元素个数
aal->iSize = len;//容量
aal->aArray = (ElemType *)malloc(sizeof(ElemType) * len);//分配len个的(ElemType * )类型的空间大小给实际的数组
if (aal->aArray == NULL)//分配失败返回false
return false;
else
return true;
}
//只要释放给数组的空间,实际元素个数和容量都置为0
void DestroyList(aAL *aal)
{
aal->iLength = 0;
aal->iSize = 0;
free(aal->aArray);//释放之后是一个野指针
aal->aArray = NULL;//最好使其为空
}
//清空是将内容清除而销毁则是整张表都没有了
void ClearList(aAL *aal)
{
aal->iLength = 0;
}
bool ListEmpty(aAL *aal)
{
if (aal->iLength == 0)
return true;
else
return false;
}
int ListLength(aAL *aal)
{
return aal->iLength;
}
bool GetElem(aAL *aal, int i, int *e)
{
if (i > ListLength(aal) || i < 0 )
return false;
else
{
*e = aal->aArray[i-1];
return true;
}
}
//成功返回e对应的下标,否则返回-1
int LocateElem(aAL *aal, int e)
{
for (int i = 0; i < ListLength(aal); i++)
{
if (aal->aArray[i] == e)
return i;
}
return -1;
}
//e表示当前元素
bool PriorElem(aAL *aal, int e, int *Pre_e)
{
for (int i = 0; i < ListLength(aal); i++)
{
if ( e == aal->aArray[i])
{
if (i == 0)//第一个元素
{
return false;
}
else
{
*Pre_e = aal->aArray[i-1];
return true;
}
}
}//for
return false;
}
//e表示当前元素
bool NextElem(aAL *aal, int e, int *Next_e)
{
for (int i = 0; i < ListLength(aal); i++)
{
if ( e == aal->aArray[i])
{
if (i == (ListLength(aal) - 1) )//最后一个元素的下表为----ListLength(aal) - 1
{
return false;
}
else
{
*Next_e = aal->aArray[i+1];
return true;
}
}
}//for
return false;
}
//e表示当前要插入的元素-----i是第i个元素的下标
bool ListInsert(aAL *aal, int i, int e)
{
if (i < 0 || i > ListLength(aal))//先判断是否合法
return false;
if (aal->iLength == aal->iSize && aal->iSize != 0)//如果满了就扩大一倍--------aal->iLength == aal->iSize == 0为空 也可能
{
aal->aArray = (ElemType *)realloc(aal->aArray, sizeof(ElemType) * aal->iSize * 2);
if (aal->aArray == NULL)//分配失败
return false;
else
aal->iSize *= 2;
}
//插入部分
for (int j = ListLength(aal); j > i; j--)
{
aal->aArray[j] = aal->aArray[j-1];
}
aal->aArray[i] = e;
aal->iLength++;//优先级->大于++
return true;
}
//e表示当前要删除的元素-----i是第i个元素的下标
bool ListDelete(aAL *aal, int i, int *e)
{
if (i < 0 || i > ListLength(aal))//先判断是否合法
return false;
*e = aal->aArray[i];
//删除部分
for (int j = i; j < ListLength(aal); j++)
aal->aArray[j] = aal->aArray[j+1];
aal->iLength--;
return false;
}
void ListTraverse(aAL *aal)
{
if (aal->iLength == 0)
{
printf("当前没有元素\n");
}
else
{
printf("当前元素个数:%d\n当前元素是:", ListLength(aal));
for (int j = 0; j < ListLength(aal); j++)//为了区别i这里使用j作为循环变量
{
printf("%d\t", aal->aArray[j]);
}
putchar(10);
}
}
标签:
原文地址:http://www.cnblogs.com/anwser-jungle/p/4952784.html