• 数据结构中线性表的顺序式表示的基本操作函数


    线性表的基本操作共有十二个。我们通过对线性表基本操作的有机组合,可以处理较为复杂的线性表。

    一、初始化顺序线性表——构造一个空的顺序线性表

     1 void InitList(SqList &L)
     2 {
     3        L.elem = (ElemType*)malloc(LIST_INIT_SIZE *sizeof(ELemType));//malloc函数来分配存储空间
     4        if(!L.elem)//分配存储失败
     5        {
     6             exit(OVERFLOW);
     7        }
     8        L.length = 0;//空表的长度为0
     9        L.listsize = LIST_INIT_SIZE;//初始的存储容量等于LIST_INIT_SIZE
    10 }        

    顺序表初始化的基本步骤:

    1、开辟存储空间,使用malloc函数,个数为LIST_INIT_SIZE,每个存储元素的大小为sizeof(ElemType);

    2、初始化当前的表长为0;

    3、初始的存储容量为LIST_INIT_SIZE

    二、销毁顺序线性表

    1 void DestoryList(SqList &L)
    2 {
    3     free(L.elem);//释放L.elem所指的存储空间
    4     L.elem = NULL;//L.elem不再指向任何存储单元
    5     L.length = 0;//顺序表的长度置零
    6     L.listsize = 0;//顺序表的大小也置为零
    7 }

    销毁顺序表的步骤:

    1、用free(L.elem)释放指针所指的存储空间;

    2、指针不指向任何东西,即L.elem = NULL

    3、将顺序表的表长和存储容量都置为零

    三、重置顺序线性表为空

    1 void ClearList(SqList &L)
    2 {
    3     L.length = 0;//直接把当前表长置为零,判断元素的的个数就是通过当前表长来判断的
    4 }

    注:顺序表的当前表长已经置零,如果要存储数据的话,仍然从elem[0]开始存储,新的数据将直接覆盖原来指针中所包含的数据

    四、判断顺序线性表是否为空

     1 Status ListEmpty(SqList L) 
     2 {
     3     if(L.Length == 0)//如果是零返回TRUE,这里是宏定义,TRUEdai表1,FALSE 代表0
     4     {
     5         return TRUE;
     6     }
     7     else
     8     {
     9         return FALSE;
    10     }
    11 ]

    注:Status 也是宏定义,这里代表的就是 int 整形

    五、求顺序线性表中元素的个数

    1 Status ListLength(SqList L)
    2 {
    3     return L.length;//L.length中的值代表的就是顺序表中元素的个数
    4 }

    六、获取顺序线性表中第i个元素的值

    1 Status GetElem(SqList L,int i,ElemType &e)
    2 {
    3     if(i < 1 || i > L.length)//i 不在L的范围之内
    4     {
    5         return ERROR;
    6     }
    7     e = *(L.elem + i - 1);//将L的第i个元素值赋给e
    8 }

    七、确定顺序表中与元素e满足compare()函数的关系

     1 int LocateElem(SqList L,ElemType e,Status *(compare)(ElemType ,ElemType))
     2 {
     3     int i = 1;//i的初值为第一个元素的位序
     4     ElemType *p = L.elem;//p指向第一个元素
     5     while(i <= L.length && !compare(*p ++,e))//i没有超出表的范围并且未找到满足关系的元素
     6     {
     7         i ++;
     8     }
     9     if(i <= L.length)//找到满足关系的元素
    10     {
    11         return i;//返回其位序
    12     }
    13     else//未找到满足关系的数据
    14     {
    15         return 0;
    16     }
    17 }

    注:compare()是一个函数,在其中可以定义两个元素的某种关系,比如相等、二倍等等。

    八、cur_e是L中的元素,且不是第一个,用pre_e返回它的前驱

     1 Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)// 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
     2 {
     3     int i = 2;//从第二个元素开始
     4     ElemType *p = L.elem + 1;//p指向第二个元素
     5     while (i < L.length && *p != cur_e)//i未超出表的范围,且未找到cure_e
     6     {
     7         p++;//p 指向下一个元素
     8         i++;//计数加一
     9     }
    10     if (i > L.length)//到表结束还没有找到cure_e的元素
    11     {
    12         return ERROR;
    13     }
    14     else
    15     {
    16         pre_e = *--p;//如果成功p指向钱一个元素
    17         return OK;
    18     }
    19 }

    九、cur_e是L中的元素,且不是最后一个,用next_e返回它的前驱

     1 Status NexElem(SqList L, ElemType cur_e, ElemType &next_e)//若cur_e是L中的元素,且不是最后一个,则用next_e返回他的后继,否则操作失败,无定义
     2 {
     3     int i = 1;//从第一个元素开始
     4     ElemType *p = L.elem;//p指向第一个元素
     5     while (i < L.length && *p != cur_e)//i未找到值为cur_e的元素
     6     {
     7         p++;//p 指向下一个元素
     8         i++;//计数加一
     9     }
    10     if (i == L.length)//到表尾还么有找到元素
    11     {
    12         return ERROR;
    13     }
    14     else
    15     {
    16         next_e = *++p;//p指向下一个元素,将所指的元素的值赋给next_e
    17         return OK;
    18     }
    19 }

    十、插入元素

     1 Status ListInsert(SqList &L, int i, ElemType e)//在L中第i个位置插入e
     2 {
     3     ElemType *newbase, *q, *p;
     4     if (i < 1 || i > L.length)
     5     {
     6         return ERROR;
     7     }
     8     if (L.length == L.listsize) //存储空间已满
     9     {
    10         newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_INCREMENT)*sizeof(ElemType));
    11         if (!newbase)
    12         {
    13             exit(OVERFLOW);
    14         }
    15         L.elem = newbase;//新的基址赋给L.elem
    16         L.listsize += LIST_INCREMENT;//增加存储容量
    17     }
    18     q = L.elem + i - 1;
    19     for (p = L.elem + L.length - 1; p >= q; --p)//移位
    20     {
    21         *(p + 1) = *p;
    22     }
    23     *q = e;//插入e
    24     L.length++;//表长加一
    25     return OK;
    26 }

    十一、删除元素

     1 Status ListDelete(SqList &L, int i, ElemType &e)//删除第i个元素,并用e返回其值
     2 {
     3     ElemType *p, *q;
     4     if (i < 1 || i > L.length)//i值不合法
     5     {
     6         return ERROR;
     7     }
     8     p = L.elem + i - 1;//p为被删除元素的位置
     9     e = *p;//被删除元素值赋给e
    10     q = L.elem + L.length - 1;//q为表尾元素的位置
    11     for (p++; p <= q; p++)
    12     {
    13         *(p - 1) = *p;
    14     }
    15     L.length--;
    16     return OK;
    17 }

    十二、依次对每个数据元素调用visit()函数

     1 void ListTraverse(SqList L, void(*visit)(ElemType))
     2 {
     3     ElemType *p = L.elem;
     4     int i;
     5     for (i = 1; i <= L.length; i++)
     6     {
     7         visit(*p++);
     8     }
     9     printf("
    ");
    10 }
    我登高只为了看的更远,如果看到的景色不如人意,我将选择继续攀登!
  • 相关阅读:
    android studio 各种问题
    关于Android开发中Arm、X86和Mips(草稿)
    每日更新
    Error creating bean with name 'userRepository': Invocation of init method failed;
    API 'variant.getJavaCompiler()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'
    increase the minSdkVersion to 26
    Exception thrown on Scheduler.Worker thread. Add `onError` handling
    M600 Pro 安装问题解决
    Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed.
    大疆无人机M100相关问题解决过程
  • 原文地址:https://www.cnblogs.com/zkhm123/p/5131387.html
Copyright © 2020-2023  润新知