线性表相关操作实现

/**
 * ADT 线性表(List)
 * Data
 * Operation
 *     InitList(*L);
 *     ListEmpty(L);
 *     ClearList(*L);
 *     GetElem(L,i,*e);
 *     LocateElem(L,e);
 *     ListInsert(*L,i,e);
 *     ListDelete(*L,i,*e);
 *     ListLength(L);
 * endADT
 */
#include <stdio.h>

#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];//会初始化为零么?
    int length;
}SqList;

Status MakeData(int data[]);//初始化赋值列表
Status InitList(SqList *L, int data[]);//初始化
Status ListEmpty(SqList L);//为空返回true,为假返回false
Status ClearList(SqList *L);//清空线性表
Status GetElem(SqList L, int i, ElemType *e);//返回i位置上的值
Status LocateElem(SqList L, ElemType e);//查找与e相同的元素,查找成功就返回序号,不成,则返回0
Status ListInsert(SqList *L, int i, ElemType e);//i位置上插入e
Status ListDelete(SqList *L, int i, ElemType *e);//删除i上的元素
Status ListLength(SqList L);//返回元素个数

int main()
{
    SqList L;
    int data[MAXSIZE-5];//留点空余,以作后面的操作

    MakeData(data);
    InitList(&L, data);
    printf("线性表长度为:%d\n", ListLength(L));
    ListEmpty(L);
    printf("线性表长度为:%d\n", ListLength(L));

    ElemType e, i;
    printf("请输入你想要的位置i:\n");
    scanf("%d", &i);
    GetElem(L, i, &e);
    printf("%d\n", e);
    printf("与e相等的元素位于%d\n", LocateElem(L, e));
    ListInsert(&L, i, e);
    printf("线性表长度为:%d\n", ListLength(L));
    ListDelete(&L, i, &e);
    printf("线性表长度为:%d\n", ListLength(L));

    ClearList(&L);
    printf("线性表长度为:%d\n", ListLength(L));

    return 0;
}

Status MakeData(int data[])
{
    for (int i = 0; i < MAXSIZE-5; ++i)
    {
        data[i] = i+2;
    }

    return OK;
}

Status InitList(SqList *L, int data[])
{
    L->length = 0;
    for (int i = 0; i < MAXSIZE-5; ++i)
    {
        L->data[i] = data[i];
        L->length++;
    }
    for (int i = MAXSIZE-5; i < MAXSIZE; ++i)
    {
        L->data[i] = 0;
    }

    return OK;
}

Status ListEmpty(SqList L)
{
    if (L.length == 0)
    {
        return TRUE;
    }

    return FALSE;
}

Status ClearList(SqList *L)
{
    if (L->length == 0)
    {
        return OK;
    }

    for (int i = 0; i < L->length; ++i)
    {
        L->data[i] = 0;
    }

    return OK;
}

Status GetElem(SqList L, int i, ElemType *e)
{
    if (L.length==0 || i<1 || i>L.length)
    {
        return ERROR;
    }
    *e = L.data[i-1];

    return OK;
}

Status ListInsert(SqList *L, int i, ElemType e)
{
    int k;

    if (L->length == MAXSIZE)
    {
        return ERROR;
    }
    if (i<1 || i>L->length+1)
    {
        return ERROR;
    }
    if (i<=L->length)
    {
        for (k=L->length-1; k>=i-1; k--)
        {
            L->data[k+1] = L->data[k];//向后移动
        }
    }
    L->data[i-1] = e;
    L->length++;

    return 0;
}

Status ListDelete(SqList *L, int i, ElemType *e)
{
    int k;

    if (L->length == 0)
    {
        return ERROR;
    }
    if(i<1 || i>L->length)
    {
        return ERROR;
    }
    *e = L->data[i-1];
    if (i<L->length)
    {
        for (k=i; k<L->length; k++)
        {
            L->data[k-1] = L->data[k];//向前移动
        }
        L->data[L->length-1] = 0;
    }
    L->length--;

    return OK;
}

Status LocateElem(SqList L, ElemType e)
{
    for (int i = 0; i < L.length; ++i)
    {
        if (L.data[i] == e)
        {
            return i+1;
        }
    }

    return FALSE;
}

Status ListLength(SqList L)
{
    if (!L.length)
    {
        return 0;
    }

    //计数这里倒也没必要这么复杂,直接返回L->length就好了嘛
    //这里权当练习
    int count = 0;
    for (int i = 0; i < MAXSIZE; ++i)
    {
        if (L.data[i] == 0)
        {
            return count;
        }
        count++;
    }

    return count;//其实就是MAXSIZE
}
posted @ 2017-03-17 23:36  lart  阅读(264)  评论(0编辑  收藏  举报