顺序表的各种基本运算

来源:互联网 发布:bms读取软件 编辑:程序博客网 时间:2024/05/17 09:45

顺序表的各种基本运算


  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。下面开始正式内容

順序表是在計算機內存中以數組的形式保存的線性表,是指用一組地址連續的存儲單元依次存儲數據元素的線性結構。维基百科-顺序表


实验环境


  • 语言c/c++
  • 编译器devc++5.11


实验内容与要求


  1. 初始化顺序表;
  2. 依次插入a,b,c,d,e元素;
  3. 输出顺序表L;
  4. 输出顺序表L的长度;
  5. 判断顺序表L是否为空;
  6. 输出顺序表L指定位置元素;
  7. 输出顺序表L指定元素的位置;
  8. 插入元素;
  9. 输出顺序表L;
  10. 删除L元素;
  11. 释放顺序表。


目录


  • 顺序表的各种基本运算
    • 实验环境
    • 实验内容与要求
  • 目录
  • 实验解析
    • 结构说明
    • 定义说明
    • 函数说明
      • 顺序表函数
        • 初始化顺序表
        • 判空
        • 获取长度
        • 打印
        • 插入
        • 删除
        • 查询
        • 释放
      • 主函数
    • 结果展示
  • 附录
    • 相关资料
    • 源代码


实验解析

结构说明


  由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。
  在此,我们利用C语言的结构体类型定义顺序表:

#define   LIST_INIT_SIZE   100  // 线性表初始存储空间分配量#define   LISTINCREMENT    10 //线性表存储空间的分配增量typedef struct{   ElemType   * elem;     //线性表存储空间基址   int    length;                 //当前线性表长度   int    listsize;                //当前分配的线性表存储空间大小                                   //(以sizeof(ElemType)为单位)}SqList;


定义说明


#define  OK  1#define  ERROR  0#define  TRUE  1#define  FALSE  0typedef  int  Status;typedef  char ElemType;

  定义常用常量,类型别称


函数说明



顺序表函数

初始化顺序表

Status InitList_Sq(SqList &L){      L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //构造一个空的顺序表L             if (! L.elem)        exit(0);  //存储分配失败      L. length=0;  //空表长度为0      L.Listsize=LIST_INIT_SIZE; //初始存储容量      return OK;}//InitList_Sq 

   给传入顺序表分配空间 ,成功返回1,失败则结束程序。 使用顺表一定要先初始化再使用顺序表


判空

Status EmptyList_Sq ( SqList L) {     if(L.length==0)          return TRUE;    else         return FALSE;}

  判断传入顺序表L是否为空,空返回1,不空为0


获取长度

Status LengthList_Sq ( SqList L) {     return L.length;}

  返回传入顺序表长度


打印

Status DisplayList_Sq ( SqList L){  //打印表中元素    int i ;    for(i=0;i<L.length;i++)        printf("%c" , L.elem[i]);     printf("\n");    return OK;}

  打印传入顺序表中的值到屏幕


插入

Status ListInsert_Sq(SqList &L, int i , ElemType e) {    //在顺序表L中第i个位置之后插入新的元素e,    // i的合法值为1≤i≤L.length+1,当i =L.length+1时     //  e插在表尾    if (i<1|| i>L.length+1)           return ERROR; // i值不合法    if (L.length>=L.Listsize)           return ERROR; //顺序表已满    for (int j=L.length-1 ; j>= i-1; --j)             L.elem[j+1] =L.elem[j];        //插入位置及之后的元素后移一个位置    L.elem[i-1] =e;         //插入e    L.length++;             //表长增1*/    return OK;}//ListInsert_Sq

  将元素e插入顺序表L的第i位,成功返回1,失败返回0


删除

Status ListDelete_Sq(SqList &L, int i, ElemType &e) {    //在顺序表L中删除第 i个元素,并用e返回其值    //   i的合法值为  1≤i≤L.length    if ((i<1)||(i>L.length))         return ERROR; // i值不合法或表空    e = L.elem[i-1] ;               // 被删除元素的值赋给e    for (int j= i; j<= L.length-1; ++j)         L.elem[j-1]= L.elem[j];            //被删除元素之后的元素前移    L.length--;          //表长减1    return OK;}//ListDelete_Sq

   删除顺序表L第i个元素并保存该元素到变量e,成功返回1,失败返回0


查询

Status GetElemList_Sq ( SqList L,int i,ElemType &e) {    if(i<1||i>L.length)         return ERROR;    e=L.elem[i-1];    return OK;}

  获取顺序表L的第i个元素,存到变量e中,成功返回1,失败返回0

Status  LocateElemList_Sq( SqList L,ElemType e) {    int i=0;    while(i<L.length&&L.elem[i]!=e)         i++;    if(i>=L.length) return 0;    return i+1;}

  获取顺序表L中e元素第一次出现的位置,成功返回元素位置,失败返回0


释放

Status DestroyList_Sq ( SqList &L) {          if (!L.elem)  return ERROR;       free (L.elem);          L.elem = NULL;      L.length = 0;      L.Listsize = 0;      return OK;}// DestroyList_Sq   

   释放传入的顺序表,成功返回1,失败返回0



主函数


int main(){    SqList L;    ElemType e;    printf("(1)初始化顺序表\n");    InitList_Sq(L);    printf("(2)依次插入a,b,c,d,e元素\n");    ListInsert_Sq(L,1,'a');    ListInsert_Sq(L,2,'b');    ListInsert_Sq(L,3,'c');    ListInsert_Sq(L,4,'d');    ListInsert_Sq(L,5,'e');    ListInsert_Sq(L,3,'q');    ListInsert_Sq(L,1,'q');    printf("(3)输出顺序表:");     DisplayList_Sq(L);    printf("(4)顺序表的长度=%d\n",LengthList_Sq(L));    printf("(5)顺序表为%s\n",(EmptyList_Sq(L)?"空":"非空"));    GetElemList_Sq(L,3,e);    printf("(6)顺序表的第三个元素是%c\n",e);    printf("(7)元素a的位置=%d\n",LocateElemList_Sq(L,'a'));    printf("(8)在第四个元素插入元素f\n");    ListInsert_Sq(L,4,'f');    printf("(9)输出顺序表:");    DisplayList_Sq(L);    printf("(10)删除第三个元素\n");    ListDelete_Sq(L,3,e);    printf("(11)f元素第一次出现的位置:");    printf("%d\n",LocateElemList_Sq(L,'f'));    printf("(12)输出顺序表:");    DisplayList_Sq(L);    printf("(13)释放顺序表\n");    DestroyList_Sq(L);}


结果展示


顺序表的各种基本运算


附录

相关资料

  1. 维基百科-顺序表


源代码


#include<stdio.h>   //EOF,NULL#include<malloc.h>  //malloc()#include<process.h>  //exit()#define  OK  1#define  ERROR  0#define  TRUE  1#define  FALSE  0typedef  int  Status;typedef      char    ElemType;#define   LIST_INIT_SIZE   100  // 线性表初始存储空间分配量#define   LISTINCREMENT    10 //线性表存储空间的分配增量typedef struct{    ElemType   * elem;     //线性表存储空间基址    int    length;                 //当前线性表长度    int    Listsize;                //当前分配的线性表存储空间大小                                        //(以sizeof(ElemType)为单位)}SqList;Status InitList_Sq(SqList &L){      L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //构造一个空的顺序表L             if (! L.elem)        exit(0);  //存储分配失败      L. length=0;  //空表长度为0      L.Listsize=LIST_INIT_SIZE; //初始存储容量      return OK;}//InitList_Sq Status DestroyList_Sq ( SqList &L) {          if (!L.elem)  return ERROR;       free (L.elem);          L.elem = NULL;      L.length = 0;      L.Listsize = 0;      return OK;}// DestroyList_Sq  Status EmptyList_Sq ( SqList L) {     if(L.length==0)          return TRUE;    else         return FALSE;}Status LengthList_Sq ( SqList L) {     return L.length;}Status DisplayList_Sq ( SqList L){  //打印表中元素    int i ;    for(i=0;i<L.length;i++)        printf("%c" , L.elem[i]);     printf("\n");    return OK;}Status ListInsert_Sq(SqList &L, int i , ElemType e) {    //在顺序表L中第i个位置之后插入新的元素e,    // i的合法值为1≤i≤L.length+1,当i =L.length+1时     //  e插在表尾    if (i<1|| i>L.length+1)           return ERROR; // i值不合法    if (L.length>=L.Listsize)           return ERROR; //顺序表已满    for (int j=L.length-1 ; j>= i-1; --j)             L.elem[j+1] =L.elem[j];        //插入位置及之后的元素后移一个位置    L.elem[i-1] =e;         //插入e    L.length++;             //表长增1*/    return OK;}//ListInsert_SqStatus ListDelete_Sq(SqList &L, int i, ElemType &e) {    //在顺序表L中删除第 i个元素,并用e返回其值    //   i的合法值为  1≤i≤L.length    if ((i<1)||(i>L.length))         return ERROR; // i值不合法或表空    e = L.elem[i-1] ;               // 被删除元素的值赋给e    for (int j= i; j<= L.length-1; ++j)         L.elem[j-1]= L.elem[j];            //被删除元素之后的元素前移    L.length--;          //表长减1    return OK;}//ListDelete_SqStatus GetElemList_Sq ( SqList L,int i,ElemType &e) {    if(i<1||i>L.length)         return ERROR;    e=L.elem[i-1];    return OK;}Status  LocateElemList_Sq( SqList L,ElemType e) {    int i=0;    while(i<L.length&&L.elem[i]!=e)         i++;    if(i>=L.length) return 0;    return i+1;}int main(){    SqList L;    ElemType e;    printf("(1)初始化顺序表\n");    InitList_Sq(L);    printf("(2)依次插入a,b,c,d,e元素\n");    ListInsert_Sq(L,1,'a');    ListInsert_Sq(L,2,'b');    ListInsert_Sq(L,3,'c');    ListInsert_Sq(L,4,'d');    ListInsert_Sq(L,5,'e');    ListInsert_Sq(L,3,'q');    ListInsert_Sq(L,1,'q');    printf("(3)输出顺序表:");     DisplayList_Sq(L);    printf("(4)顺序表的长度=%d\n",LengthList_Sq(L));    printf("(5)顺序表为%s\n",(EmptyList_Sq(L)?"空":"非空"));    GetElemList_Sq(L,3,e);    printf("(6)顺序表的第三个元素是%c\n",e);    printf("(7)元素a的位置=%d\n",LocateElemList_Sq(L,'a'));    printf("(8)在第四个元素插入元素f\n");    ListInsert_Sq(L,4,'f');    printf("(9)输出顺序表:");    DisplayList_Sq(L);    printf("(10)删除第三个元素\n");    ListDelete_Sq(L,3,e);    printf("(11)f元素第一次出现的位置:");    printf("%d\n",LocateElemList_Sq(L,'f'));    printf("(12)输出顺序表:");    DisplayList_Sq(L);    printf("(13)释放顺序表\n");    DestroyList_Sq(L);}