顺序表示的线性表的基本操作

本文介绍了一个使用C语言实现的顺序线性表基本操作集合,包括初始化、销毁、清空线性表等,还提供了获取、定位元素及插入、删除等功能的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. /* ********************************************************
  2.  * 科目; 顺序表示的线性表的基本操作
  3.  * 描述;用C实现线性表;
  4.  *作者;刘柏燊
  5.  *2008年12月14日
  6. ***********************************************************/
  7.  void InitList(SqList *L) 
  8.  { /* 操作结果:构造一个空的顺序线性表L */
  9.    (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  10.    if(!(*L).elem)
  11.      exit(OVERFLOW); /* 存储分配失败 */
  12.    (*L).length=0; /* 空表长度为0 */
  13.    (*L).listsize=LIST_INIT_SIZE; /* 初始存储容量 */
  14.  }
  15.  

  16. void DestroyList(SqList *L)
  17.  { /* 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */
  18.    free((*L).elem);
  19.    (*L).elem=NULL;
  20.    (*L).length=0;
  21.    (*L).listsize=0;
  22.  }
  23.  

  24. void ClearList(SqList *L)
  25.  { /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
  26.    (*L).length=0;
  27.  }
  28.  

  29. Status ListEmpty(SqList L)
  30.  { /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
  31.    if(L.length==0)
  32.      return TRUE;
  33.    else
  34.      return FALSE;
  35.  }


  36.  int ListLength(SqList L)
  37.  { /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
  38.    return L.length;
  39.  }


  40.  Status GetElem(SqList L,int i,ElemType *e)
  41.  { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值 */
  42.    if(i<1||i>L.length)
  43.      return ERROR;
  44.    *e=*(L.elem+i-1);
  45.    return OK;
  46.  }


  47.  int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
  48.  { /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
  49.    /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
  50.    /*           若这样的数据元素不存在,则返回值为0。算法2.6 */
  51.    ElemType *p;
  52.    int i=1; /* i的初值为第1个元素的位序 */
  53.    p=L.elem; /* p的初值为第1个元素的存储位置 */
  54.    while(i<=L.length&&!compare(*p++,e))
  55.      ++i;
  56.    if(i<=L.length)
  57.      return i;
  58.    else
  59.      return 0;
  60.  }


  61.  Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
  62.  { /* 初始条件:顺序线性表L已存在 */
  63.    /* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */
  64.    /*           否则操作失败,pre_e无定义 */
  65.    int i=2;
  66.    ElemType *p=L.elem+1;
  67.    while(i<=L.length&&*p!=cur_e)
  68.    {
  69.      p++;
  70.      i++;
  71.    }
  72.    if(i>L.length)
  73.      return INFEASIBLE; /* 操作失败 */
  74.    else
  75.    {
  76.      *pre_e=*--p;
  77.      return OK;
  78.    }
  79.  }


  80.  Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
  81.  { /* 初始条件:顺序线性表L已存在 */
  82.    /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */
  83.    /*           否则操作失败,next_e无定义 */
  84.    int i=1;
  85.    ElemType *p=L.elem;
  86.    while(i<L.length&&*p!=cur_e)
  87.    {
  88.      i++;
  89.      p++;
  90.    }
  91.    if(i==L.length)
  92.      return INFEASIBLE; /* 操作失败 */
  93.    else
  94.    {
  95.      *next_e=*++p;
  96.      return OK;
  97.    }
  98.  }


  99.  Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */
  100.  { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
  101.    /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
  102.    ElemType *newbase,*q,*p;
  103.    if(i<1||i>(*L).length+1) /* i值不合法 */
  104.      return ERROR;
  105.    if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配 */
  106.    {
  107.      newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LIST_INCREMENT)*sizeof(ElemType));
  108.      if(!newbase)
  109.        exit(OVERFLOW); /* 存储分配失败 */
  110.      (*L).elem=newbase; /* 新基址 */
  111.      (*L).listsize+=LIST_INCREMENT; /* 增加存储容量 */
  112.    }
  113.    q=(*L).elem+i-1; /* q为插入位置 */
  114.    for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */
  115.      *(p+1)=*p;
  116.    *q=e; /* 插入e */
  117.    ++(*L).length; /* 表长增1 */
  118.    return OK;
  119.  }


  120.  Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */
  121.  { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
  122.    /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
  123.    ElemType *p,*q;
  124.    if(i<1||i>(*L).length) /* i值不合法 */
  125.      return ERROR;
  126.    p=(*L).elem+i-1; /* p为被删除元素的位置 */
  127.    *e=*p; /* 被删除元素的值赋给e */
  128.    q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */
  129.    for(++p;p<=q;++p) /* 被删除元素之后的元素左移 */
  130.      *(p-1)=*p;
  131.    (*L).length--; /* 表长减1 */
  132.    return OK;
  133.  }


  134.  void ListTraverse(SqList L,void(*vi)(ElemType*))
  135.  { /* 初始条件:顺序线性表L已存在 */
  136.    /* 操作结果:依次对L的每个数据元素调用函数vi() */
  137.    /*           vi()的形参加'&',表明可通过调用vi()改变元素的值 */
  138.    ElemType *p;
  139.    int i;
  140.    p=L.elem;
  141.    for(i=1;i<=L.length;i++)
  142.      vi(p++);
  143.    printf("/n");
  144.  }
以上每一个函数可以单独组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值