您的位置:首页 > 其它

顺序表的一些功能实现

2016-12-03 23:56 357 查看
#include <stdio.h>

#include <stdlib.h>

#define INIT_SIZE    100    //线性表初始化大小

#define INCRESS_SIZE 20     //顺序表满后的每次扩充大小

#define ERROR        -1

#define OK            0

#define MALLOC_ERROR -2

typedef int ElementType;    //顺序表元素类型

typedef struct _sqlist

{

    ElementType *list;      //指向顺序表的指针

    int leng;               //当前顺序表的长度

    int max_len;            //顺序表的最大长度

}SqList;                    //重命名结构体类型

int Init_list(SqList *sqlist)

{

    if (sqlist == NULL)

    {

        return ERROR;

    }

    //创建顺序表空间

    sqlist->list = (ElementType*)malloc(INIT_SIZE*sizeof(ElementType) / sizeof(char));

    if (sqlist->list == NULL)

    {

        return MALLOC_ERROR;

    }

    sqlist->leng = 0;

    sqlist->max_len = INIT_SIZE;

    return OK;

}

//扩充空间

int AgainMalloc(SqList *sqlist)

{

    if (sqlist == NULL)

    {

        return ERROR;

    }

    ElementType *newbase = (ElementType*)realloc((sqlist->list), (sqlist->max_len + INCRESS_SIZE)*sizeof(ElementType) / sizeof(char));

    if (newbase == NULL)

    {

        return MALLOC_ERROR;

    }

    sqlist->list = newbase;

    sqlist->max_len += INCRESS_SIZE;

    return OK;

}

//头插法

int Insert_Head(SqList *s, ElementType data)

{

    if (s == NULL)

    {

        return ERROR;

    }

    if (s->leng == s->max_len)

    {

        if (AgainMalloc(s) != OK)

        {

            return MALLOC_ERROR;

        }

    }

    int i;

    for (i = s->leng - 1; i >= 0; i--)

    {

        s->list[i + 1] = s->list[i];

    }

    //在pos位置插入新数据

    s->list[0] = data;

    s->leng++;

    return OK;

}

//尾插法

int Insert_Last(SqList *sqlist, ElementType newdata)

{

    if (sqlist == NULL)

    {

        return ERROR;

    }

    //判断顺序表有没有满

    if (sqlist->leng == sqlist->max_len)

    {

        if (AgainMalloc(sqlist) != OK)

        {

            return MALLOC_ERROR;

        }

    }

    sqlist->list[sqlist->leng] = newdata;

    sqlist->leng++;

    return OK;

}

//打印顺序表数据

void DisPlay(SqList *sqlist)

{

    if (sqlist == NULL)

    {

        return;

    }

    int i;

    for (i = 0; i < sqlist->leng; i++)

    {

        printf("%4d", sqlist->list[i]);

    }

    printf("\n");

}

//在第pos个位置前插入一个数据

int Insert_Pos(SqList *s, int pos, ElementType data)

{

    //入口参数检查

    if (s == NULL || pos <= 0 || pos > s->leng + 1)

    {

        return ERROR;

    }

    //判断顺序表有没有满

    if (s->leng == s->max_len)

    {

        if (AgainMalloc(s) != OK)

        {

            return MALLOC_ERROR;

        }

    }

 

    //将从pos位置开始的数据后移一位

    int i;

    for (i = s->leng - 1; i >= pos - 1; i--)

    {

        s->list[i + 1] = s->list[i];

    }

    //在pos位置插入新数据

    s->list[pos - 1] = data;

    s->leng++;

    return OK;

}

//将第pos位置的数据删除

int Delete_Pos(SqList *s, int pos)

{

    if (s == NULL || pos < 1 || pos > s->leng)

    {

        return ERROR;

    }

    //从pos位置的数据往前移一位

    int i;

    for (i = pos; i < s->leng; i++)

    {

        s->list[i - 1] = s->list[i];

    }

    s->leng--;

    return OK;

}

//查找元素

int Search_Element(SqList *s, ElementType data)

{

    if (s == NULL)

    {

        return ERROR;

    }

    int i;

    for (i = 0; i < s->leng; i++)

    {

        if (s->list[i] == data)

        {

            return i + 1;

        }

    }

    return OK;

}

//将顺序表数据倒置

int Inverse_List(SqList *s)

{

    if (s == NULL)

    {

        return ERROR;

    }

    int front = 0;

    int lattar = s->leng - 1;

    int temp;

    while (front < lattar)

    {

        temp = s->list[front];

        s->list[front++] = s->list[lattar];

        s->list[lattar--] = temp;

    }

    return OK;

}

int main()

{

    SqList sqlist;          //定义一个顺序表结构变量

    sqlist.list = NULL;

    //初始化sqlist顺序表

    if (Init_list(&sqlist) != OK)

    {

        return ERROR;

    }

    printf("打印sqlist:\n");

    int i;

    for (i = 0; i < 10; i++)

    {

        //尾插法

        Insert_Last(&sqlist, i);

    }

    DisPlay(&sqlist);

    //在第i个位置插入一个数据

    if (Insert_Pos(&sqlist, 3, 11) != OK)

    {

        return ERROR;

    }

    DisPlay(&sqlist);

    //在第i个位置删除一个数据

    if (Delete_Pos(&sqlist,3) != OK)

    {

        return ERROR;

    }

    DisPlay(&sqlist);

    printf("打印s2: \n");

    SqList s2;

    //初始化s2顺序表

    if (Init_list(&s2) != OK)

    {

        return ERROR;

    }

    for (i = 0; i < 10; i++)

    {

        //头插法

        Insert_Head(&s2, i);

    }

    DisPlay(&s2);

    //查找s2的第八个元素

    int pos = Search_Element(&s2, 8);

    printf("s2的第八个元素为 %d\n", pos);

    printf("将s2倒序\n");

    Inverse_List(&s2);

    DisPlay(&s2);

    system("pause");

    return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: