新人小白的C语言笔记---线性表的实现

59 阅读3分钟

新人小白的C语言笔记---线性表的实现

关于线性表的构造和初始化,我学习到了两种形式,第一种通过结构体数组来进行数据的存储,不过它在进行插入和删除操作的时候,太过费劲,同时,结构体数据是存储在栈上,我们无法控制它空间的生成与消失,这时就可以采用第二种方法来避免问题,通过指针,原先存储在数组,现在通过Data指针来进行数据的存储(这时数据存储在堆上)(先给顺序表的开辟空间,然后再给数据存储开辟空间)。

#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
//1
//typedef struct {
//    //一个整型数组
//    ElemType Data[MAXSIZE];
//    //length元素的个数(位次)
//    int length;
//}SeqList;
//初始化
//void InitList(SeqList* L)
//{
//    L->length = 0;
//}

//2:大->中->小的顺序
typedef struct {
    ElemType* Data;
    int length;
}SeqList;
//初始化
SeqList* InitList()
{
    //分配一个线性表的内存
    SeqList* L = (SeqList*)malloc(sizeof(SeqList));
    //分配一个数组的内存
    L->Data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    L->length = 0;
    return L;
}





//在尾部插入代码,append:在后面加,增补。
int appendElem(SeqList* L, ElemType e)
{
    //做一个线性表中是否满了的判定
    if (L->length >= MAXSIZE)
    {
        printf("已经满了,勿进\n");
        return 0;
    }
    else
    {
        //如果不是满的,就在L->length这个位置插入一个元素e,也就是尾部。
        L->Data[L->length] = e;
        //不要忘了计数+1
        L->length++;
        return 1;
    }
}
//遍历输出这个顺序表
void ListElem(SeqList* L)
{
    //这里length就是做限制了
    for (int i = 0;i < L->length;i++)
    {
        //这里用数组下标来遍历输出元素
        printf("Data[%d]=%d\n", i, L->Data[i]);
    }
    printf("\n");
}
//插入元素,将被插入的位置后面的数据往后移
int InsertElem(SeqList* L, int pos, ElemType e)
{
    if (pos <= L->length)
    {
        if (L->length > MAXSIZE)
        {
            printf("插不了了,表满了");
        }
        else
        {
            if (pos < 1 || pos >= L->length)
            {
                printf("插入位置有误");
            }
            else
            {
                //利用循环将被插入的位置后面的数据往后移
                for (int i = L->length - 1;i >= pos - 1;i--)
                {
                    L->Data[i + 1] = L->Data[i];
                }
                //插入要插入的元素
                L->Data[pos - 1] = e;
                //记得给数据个数(长度)加1哦
                L->length++;
            }
        }
    }
    return 1;
}
//删除某一个位置的元素
int DeleteElem(SeqList* L, int pos, ElemType* e)
{
    *e = L->Data[pos - 1];
    if (pos < 1 || pos >= L->length)
    {
        printf("删除操作有误");
    }
    else
    {
        if (pos < L->length - 1)
        {
            //通过循环向前覆盖  
            for (int i = pos;i < L->length;i++)
            {
                L->Data[i - 1] = L->Data[i];
            }
            printf("删除的第%d个元素为%d\n", pos, *e);
        }
        else {
            //nothing
        }
        L->length--;
    }
    return 1;
}
//查找
int searchlist(SeqList* L, ElemType e)
{
    for (int i = 0;i < L->length;i++)
    {
        if (L->Data[i] == e)
        {
            printf("所查的元素在第%d个位置\n", i);
        }
        else
        {
            //nothing
        }
    }
    return 0;
}
int main(int argc, char const* argv[])
{
    //声明一个线性表并初始化
    /*SeqList list;*/
    /*InitList(list);*/
    SeqList* list = InitList();
    appendElem(list, 88);
    appendElem(list, 33);
    appendElem(list, 75);
    appendElem(list, 98);
    ListElem(list);
    InsertElem(list, 3, 12);
    ListElem(list);
    ElemType delData;
    DeleteElem(list, 2, &delData);
    ListElem(list);
    searchlist(list, 12);
    printf("初始化成功,成功创建一个线性表,目前长度占用%d\n", list->length);
    printf("初始化成功,成功创建一个线性表,占用字节数为%zu\n", sizeof(list->Data));
    return 0;
}