码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构----线性表的顺序实现

时间:2015-11-10 15:42:03      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

/*
***************************线性表的顺序实现:用一组地址连续的存储单元依次存储线性表的数据元素
*************************即用数组的实现
参考自: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!