数据结构(线性表:顺序表详解)

在数据结构的全部结构中中,线性结构属于最简单并且最普通的结构,而线性结构中的顺序结构属于在全部线性结构中最简单的结构

顺序表是具有相同特性的数据元素组成的一个有限序列,顺序表中的所有元素是有限个,并且呈一定的线性排列,所有元素的特性相同。可以是字符串型或者是基本整形。在长度为n的顺序表中,我们以L[0]表示顺序表的第一个元素。相当于表头。以L[n-1]表示最后一个元素。一般c语言中以0开头。

顺序表有3大特性:

(1)有穷性:顺序表中的元素是有限个的。

(2)一致性:所有的元素具有相同的数据类型。

(3)序列性:所有的元素相对位置是线性的,每个位置只存在一个元素。

顺序表排列方式如下图:

 先建立一个表示顺序表的结构,代码实现如下:

#include <stdio.h>
#include <malloc.h>

#define maxsize 50    //定义线性表的最大长度
typedef int elemtype; //定于数据类型,elemtype的数据类型为基本整形,也可以定义为其他类型
typedef struct
{
   elemtype data[maxsize];   //data为是记录顺序表的地址
   int length;               //length为线性表的长度
}Sqlist;           

线性表有9大基本操作,分别为

1.InitList(&L):初始化线性表,构建一个空表。

2.DestroyList(&L):销毁线性表,释放线性表中全部元素。

3.ListEmpty(L):判断线性表是否为空,若为空就返回1,不为空返回0。

4.ListLength(L):求线性表的长度然后返回线性表中元素的个数。

5.DispList(L):输出线性表,依次输出线性表中的每个元素。

6.GetElem(L,i,&e):求线性表中的第i个位置的元素值,并用e返回。

7.LocataElem(L,e):按元素值查找,返回第一个与值e元素相等的元素的位置。

8.ListInsert(&L,i,e):在第i个位置插入元素e。

9.ListDelete(&L,i,&e):删除第i个元素,并且将第i个元素值用e返回。

下面对代码实现来讲解。

首先我们通过数组来建立一个顺序表,假设有一个长度为n的数组a[n],将数组a[n]建立成一个顺序表:代码实现如下

void CreateList(Sqlist *&L,elemtype a[],int n)
{
   L=(Sqlist*)malloc(Sqlist);     //首先给顺序表L,分配一个存储空间。
   for(int i=0;i<n;i++)           //将数组a[]中的元素依次赋给顺序表中相同位置的元素。
      L->data[i]=a[i];
   L->length=n;                   //将顺序表中长度改为n,整个顺序表建立完成。
}

1.初始化顺序表

初始化线性表是构造一个空表,当表的长度为0是,表中无元素,就成了一个空表,代码实现如下

void InitList(Sqlist *&L)
{
   L=(Sqlist*)malloc(Sqlist);  //先给顺序表分配一个存储空间
   L->length=0;                //在将顺序表的长度定义为0。此时,顺序表为空
}

2.销毁顺序表

销毁顺序表是将表中全部元素都删除,释放顺序表L的存储空间,代码实现如下:

void DestroyList(Sqlist *&L)
{
   free(L);                 //释放顺序表中全部空间
}

3.判断顺序表是否为空

该操作是通过返回顺序表长度来判断,如果顺序表长度为0,表示顺序表长度为0,则为空,返回1。若顺序表长度不为0,则返回0。代码实现如下:

bool ListEmpty(Sqlist *L)
{
   return (L->length==0);    //L->length表示线性表的长度,若长度为0返回真,否则返回1
}

4.返回顺序表的长度

通过求顺序表中的元素的数量,来返回顺序表的长度,L->length表示线性表的长度,相当于元素的个数,我们通过返回L->length来实现该操作,代码实现如下:

int ListLength(Sqlist *L)  //该操作需要返回一个值,需要使用int开头
{
   return L->length;       //length记录表的长度,直接返回求出元素的个数
}

5.输出顺序表

输出顺序表是将顺序表的全部元素依次通过屏幕显示出来,从首元素开始一直到尾元素,当L为空时不显示值域

void DispList(Sqlist *L)
{
    for(int i=0;i<L->length;i++)  //从首元素开始到尾元素,依次输出。L->length为元素个数,
      printf("%5d",L->data[i]);   //从L->data[0]开始,一直到L->data[length-1];
    printf("\n");                             
}

6.求顺序表中某个元素值

要求出顺序表中的第i个元素的元素值,必须先要找到第i个元素,然后在将元素值赋值给e后返回。

代码实现如下:

bool GetElem(Sqlist *L,int i,elemtype &e)  //i表示表中第i个位置
{
    if(i<0||i>L->length)                   //如果i不在顺序表可以查找的范围内则返回错误。
      return false;
    else
    {
       i--;                                //从0开始记数,第i个位置表示为L->data[i-1];       
       e=L->data[i];                       //将第i个元素赋给e,然后返回真,查找完成
       return true;
    }
}

7.按元素查找LocateElem(L,e)

扫描顺序表L中的所有元素,如果有等于e的元素,这返回改元素的位置,没有则返回0。代码实现如下:

void LocateElem(Sqlist *L,elemtype e)
{
    int i;                     
    for(i=0;i<L->length;i++)   //从L->data[0]开始到L->[length-1]依次查找
    {
       if(L->data[i]==e)
         {
            return i+1;        //若在表中有元素的值域为e,返回该元素的位置,循环停止。
            break;
         }
     }
     if(i==L->length)          //若i=L->length则表示没有找到,返回为0
     return 0;
}

8.插入数据元素

将某一固定的元素插入某一固定的位置,需要两个步骤,先应该将该位置后面的所有元素都向后移动一位,然后在将元素插在这个位置上面。代码实现如下:

bool ListInsert(Sqlist *&L,int i,elemtype e)
{
    if(i<1||i>L->length)             //如果i不在L内,返回错误。
      return false;
    else                             //从0开始计数,将i-1;找到应该插入的位置
    {
       i--;
       for(int j=L->length;j>i;j--)   //从尾部开始到i,将所有的元素向前移动一位,在将i插入。
          L->data[j]=L->data[j-1];
       L->data[i]=e;
       L->length++;                    //顺序表的长度增加一位,返回为真。
       return true;
    }
}

9.删除数据元素

和插入数据元素类似,先找到需要删除元素的位置,在将该元素的值域通过e返回,在将该位置的元素覆盖,然后将后面的全部元素向前移动一位,顺序表减去一位,删除完成,代码实现如下:

bool ListDelete(Sqlist *&L,int i,elemtype &e)
{
     if(i<1||i>L->length)        //如果i不在长度范围内,返回错误。
       return false;
     else
     {
        i--;                     //找到需要删除的元素的位置,使用e返回
        e=L->data[i];
        for(int j=i;j<L->length-1;j++)   //从该位置到表尾的全部元素依次前移动一位
            L->data[j]=L->data[j+1];
        L->length--;                     //顺序表的长度减去一位,返回为真。删除完成
        return true;
     }
}

顺序表的全部基本操作已经讲解完成,谢谢您的阅读。若有不足或者错误之处,欢迎在评论区指出,谢谢。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值