顺序表的各种基本运算

顺序表的各种基本运算


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

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

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


实验环境


  • 语言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  0
typedef  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  0
typedef  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_Sq

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

Status 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);
}

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值