线性表-SqList(顺序表)

复制代码

知识点:

1:缺点

1)插入和删除操作需要移动大量的元素
2)当线性表长度变化较大时,难以确定存储空间的容量
3)任意造成存储空间的碎片

2:优点

1)无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
2)可以快速的存取表中的任意位置的元素。

3:代码中增加,删除,是需要在原来线性表中进行,所以需要用到引用对原数据进行操作;不需要对原来数据进行的操作,我们直接对赋值后的局部变量(含有原线性表的所有数据)参数进行操作,即可

复制代码
#include <stdio.h>
#include <stdlib.h>
#define initSize 20//顺序表初始大小
typedef int elemType;

静态存储-(数组大小不变)

typedef struct
{
     elemType data[initSize];
     int length;//每增加一个数,length增加1
}

动态存储-(动态分配存储,以下代码均为动态存储)

typedef struct
{
    elemType* elem;//动态分配空间首地址
    int length;//线性表当前长
    int listSize;//线性表最大长

}sqList;

初始化

复制代码
void initSqList(sqList *l)
{
    l->elem=(elemType *)malloc(initSize*sizeof(elemType));
    if(!l->elem)
    {
        printf("动态分配内存失败\n");
        exit(0);
    }
    else
    {
        l->length=0;
        l->listSize=initSize;
    }
    printf("初始化成功\n");
}
复制代码

销毁

void destorySqList(sqList *l)
{
    if(l->elem)free(l->elem);//释放空间
    l->elem=NULL;//指针指向空
    printf("销毁成功\n");
}

清空

void clearSqList(sqList *l)
{
   l->length=0;
   printf("清空成功\n");
}

判空

复制代码
int isEmptySqList(sqList l)
{
    if(l.length==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
复制代码

求表长

//求表长
int getSqListLength(sqList l)
{
    return l.length;
}

按位置查找

复制代码
elemType getSqListElem(sqList l,int i)
{
    if(i<1||i>l.length)
    {
        printf("位置不合法!\n");
        return 0;
    }
    else
    {
       printf("找到了:%d\n",l.elem[i-1]);
       return l.elem[i-1];
    }
}
复制代码

按数据查找

复制代码
elemType getSqListloc(sqList l,elemType e)
{
    int i,flag=1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==e)
        {
            flag=0;
            printf("所查元素位序为%d", i + 1);
            return i+1;
        }
    }
    if(flag)
    {
        printf("查询无果");
        return 0;
    }

}
复制代码

求前驱

复制代码
elemType getSqListPre(sqList l,elemType cur_e,elemType *pre_e)
{
    int i,k=-1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==cur_e)
        {
            k=i-1;
            break;
        }
    }
    if(k>-1)
    {
        *pre_e=l.elem[k];
        printf("前驱元素为%d\n", *pre_e);
        return pre_e;
    }
    if(k=-1)
    {
        printf("查询无果");
        return 0;
    }
}
复制代码

求后继

复制代码
elemType getSqListNext(sqList l,elemType cur_e,elemType *next_e)
{
    int i,k=-1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==cur_e)
        {
            k=i+1;
            break;
        }
    }
    if(k>-1)
    {
        *next_e=l.elem[k];
        printf("前驱元素为%d\n", *next_e);
        return next_e;
    }
    if(k==-1)
    {
        printf("查询无果");
        return 0;
    }
}
复制代码

末尾插入元素

复制代码
void insertSqListLastElem(sqList *l,elemType e)
{
    int k=l->length;
    //不能大于顺序表的当前储存空间 否则开辟空间
    if(k>=l->listSize)
    {
        printf("顺序表已满!\n");//如果数组超出listSize,就动态的开辟同样大小空间末尾分配加入
        l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType));
        if(!l->elem)
        {
            printf("分配空间失败!\n");
            return 0;
        }
        l->listSize+=initSize;
    }
    l->elem[k+1]=e;
    l->length++;
}
复制代码

指定位置插入元素

复制代码
void insertSqListElem(sqList *l,int i,elemType e)
{
    int k;
    if(i<1||i>l->length+1)
    {
        printf("插入位置%d不合法!\n", i);
        return 0;
    }
    if(l->length>=l->listSize)
    {
        printf("顺序表已满!\n");//如果数组超出listSize,就动态的分配加入
        l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType));
        if(!l->elem)
        {
            printf("分配空间失败!\n", i);
            return 0;
        }
        l->listSize+=initSize;
    }
    for(k=l->length;k>i-1;k--)//i之后元素往后挪
    {
        l->elem[k]=l->elem[k-1];
    }
    l->elem[i-1]=e;
    l->length++;
}
复制代码

末尾删除

elemType deleteSqListLastElem(sqList* l)
{
    l->length--;
    return l->length;
}

指定位置删除

复制代码
elemType deleteSqListElem(sqList* l,int i,elemType* e)
{
    int k;
    if(i<1||i>l->length)
    {
        printf("删除位置%d不合法\n", i);
        return 0;
    }
    *e=l->elem[i-1];
    for(k=i-1;k<l->length;k++)//i之后元素往前挪
    {
        l->elem[k]=l->elem[k+1];
    }
    l->length--;
    return *e;
}
复制代码

遍历输出

复制代码
void ListTraverse(sqList l)      //遍历所有元素
{
    int i;
    if (isEmptySqList(l))
    {
        printf("顺序表为空\n");
        return 0;
    }
    for (i = 0; i < l.length; i++)
        printf("%-5d", l.elem[i]);
}
复制代码

 

posted on   Y-flower  阅读(1956)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示