0
点赞
收藏
分享

微信扫一扫

C语言数据结构 静态和动态顺序表

慎壹 2022-02-20 阅读 41
#include <stdio.h>
#include <stdlib.h>

//定义bool函数
#define bool char
#define true 1
#define false 0

//定义变量
#define MaxSize 10    //静态顺序表的最大容量
#define InitSize 10   //动态顺序表的最大容量

//自定义数据元素类型
#define Elemtype int  //后期可以直接改变数据类型,不用挨个改

//静态顺序表结构
typedef struct SqList
{
    int length;             //目前表中的元素个数(长度)
    Elemtype data[MaxSize]; //储存数据元素的数组
}SqList;
//动态顺序表结构
typedef struct SeqList
{
    int length;
    Elemtype *data;         //动态顺序表采用指针的方式
    int maxsize;            //当前可存储的最大个数(长度)
}SeqList;

//静态顺序表初始化
bool InitSqList(SqList* L)  //要改变表中内容,必须用指针才能做到
{
    L->length = 0;          //长度设置为0
    return true;
}
//动态顺序表初始化
bool InitSeqList(SeqList* L)
{
    L->length = 0;
    L->maxsize = InitSize;   //最大个数赋值
    L->data=(Elemtype*)malloc(sizeof(Elemtype)*InitSize); //开辟一块空间
    return true;
}

//静态顺序表的输出
bool PrintSqList(SqList L)   //输出不需要改动,所以不用指针
{
    if(L.length == 0)        //判断合法性
    {
        printf("SqList is empty!\n");
        return false;
    }
    printf("SqList:");
    for(int i = 0; i < L.length; i++)
    {
        printf("%d->",L.data[i]);
    }
    printf("End\n");
    return true;
}
//动态顺序表的输出
bool PrintSeqList(SeqList L)
{
    if(L.length == 0)
    {
        printf("SeqList is empty!\n");
        return false;
    }
    printf("SeqList:");
    for(int i = 0; i < L.length; i++)
    {
        printf("%d->",L.data[i]);
    }
    printf("End\n");
    return true;
}

//静态表元素插入
bool InsertSqList(SqList* L, int i, Elemtype e)//在i的位置插入元素e
{
    if(i < 1 || (L->length + 1) < i)
    {
        printf("Error!\n");
        return false;
    }
    if(L->length >= MaxSize)
    {
        printf("Error!\n");
        return false;
    }
    for(int j = L->length; j >= i; j--)
    {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = e;
    L->length++;
    return true;
}
//动态表插入元素
bool InsertSeqList(SeqList* L, int i, Elemtype e)//在i的位置插入元素e
{
    if(i < 1 || (L->length + 1) < i)
    {
        printf("Error!\n");
        return false;
    }
    if(L->length >= InitSize)
    {
        printf("Error!\n");
        return false;
    }
    for(int j = L->length; j >= i; j--)
    {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = e;
    L->length++;
    return true;
}

//静态表删除元素
bool SqListDelete(SqList* L, int i, Elemtype* e)//删除位置i的元素并得到其值
{
    if(L->length <= 0)
    {
        printf("Empty!\n");
        return false;
    }
    if(i < 1 || (L->length + 1) < i)
    {
        printf("Error!\n");
        return false;
    }
    *e = L->data[i-1];
    for(int j = i-1; j < L->length; j++)
    {
        L->data[j] = L->data[j+1];
    }
    L->length--;
    return true;
}
//动态顺序表删除元素
bool SeqListDelete(SeqList* L, int i, Elemtype* e)
{
    if(L->length <= 0)
    {
        printf("Empty!\n");
        return false;
    }
    if(i < 1 || (L->length + 1) < i)
    {
        printf("Error!\n");
        return false;
    }
    *e = L->data[i-1];
    for(int j = i-1; j < L->length; j++)
    {
        L->data[j] = L->data[j+1];
    }
    L->length--;
    return true;
}

//静态表按值查找
int SqListLocElem(SqList L, Elemtype e)
{
    for(int i = 0; i < L.length; i++)
    {
        if(L.data[i] == e)
        {
            return i+1;
        }
    }
    return 0;
}
//动态表按值查找
int SeqListLocElem(SeqList L, Elemtype e)
{
    for(int i = 0; i < L.length; i++)
    {
        if(L.data[i] == e)
        {
            return i+1;
        }
    }
    return 0;
}

//动态表的扩容
bool IncreaseSize(SeqList* L, int len) //len是要增加的长度
{
    Elemtype *p = L->data;           //定义一个指针指向原来指针的位置
    L->data = (Elemtype*)malloc(sizeof(Elemtype)*(len+L->length));//给原指针分配一个新空间
    for(int i = 0; i < L->length; i++)
    {
        L->data[i] = p[i];
    }
    L->maxsize += len;
    free(p);
    return true;
}

int main()
{
    SqList L1;               //定义
    SeqList L2;
    InitSqList(&L1);         //初始化
    InitSeqList(&L2);

    Elemtype e;              //测试用
    InsertSeqList(&L2,1,1);
    InsertSeqList(&L2,2,2);
    InsertSeqList(&L2,3,3);
    InsertSeqList(&L2,4,4);
    SeqListDelete(&L2,3,&e);
    PrintSeqList(L2);
}
举报

相关推荐

0 条评论