Java教程

线性表-SqList(顺序表)

本文主要是介绍线性表-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]);
}

 

这篇关于线性表-SqList(顺序表)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!