第一章--线性表

线性表

终于抽出空来写第二篇,在医院每天忙得连翻书的心情都没有,凡事要坚持加油!
线性结构的特点是:
在数据元素的非空有限集中,
⒈存在唯一的一个被称作“第一个”的数据元素;
⒉存在唯一的一个被称作“最后一个”的数据元素;
⒊除第一个之外,集合中的每一个数据元素均只有一个“前驱”;
⒋除最后一个之外,集合中每个数据元素均只有一个“后继”。

线性表的类型和定义

线性表(linear_list) 是最常用,最简单的一种有限序列,是n个数据元素组成的有限序列。

抽象数据类型线性表的定义如下:

ADT List {
   数据对象:D={Ai | Ai ∈ ElemSet,i = 1,2,3,...n,n>=0}
   数据关系:R1 = {<Ai-1,Ai > | Ai-1,Ai ∈ D,i=2,...n}
   基本操作:
      InitList (&L)  //创建一个空的线性表L
      DestroyList(&L) //销毁线性表L
      CleartList(&L) //将表L重置为空表
      ListEmpty(L) //判空,空则返回true,否则返回false
      ListLength(L) //查表L的长度
      GetElem(L,i,&e) //用e返回表L中第i个位置的值
      LocatElem(L,e,compeare() ) //返回表L中第一个与e满足关系compare()的数据元素的位序
      PriorElem(L,cur_e,&pre_e) //若cur_e∈L && cur_e i≠0 则返回它的前驱
      NextElem(L,cur_e,&next_e) //若cur_e∈L && cur_e i≠n 则返回它的后继
      ListInsert(&L,i,&e) //在表L第i个位置前插入e,L的长度加1
      Listdelete(&L,i,&e) //删除表L第i个位置的元素并用e返回其值,L的长度减1
      ListTraverse(L,visit() ) //对表L每一个元素调用函数visit()
}ADT List

线性表的顺序表示和实现

线性表的动态分配顺序存储结构

#define LIST_INIT_SIZE   100  //线性表存储空间的初始分配量
#define LISTINCTEMENT   10  //线性表存储空间的分配增量
typedef  struct {
       ElemType  *elem;    //存储空间基值(int data)
       int       length;         //存储空间长度
       int       listsize;        //当前分配的存储容量
}Sqlist;

:手动简单书写方式:

int A{maxSize}
int a
Struct InitList Sq (Sqlist &L){
      //构造一个空的线性表L
      L.elem = (elemtype * ) malloc (LIST_INIT_SIZE * sizeof (elemtype) )  //分配空间
      if( ! L.elem) exit (overflow); //判空,如果所分配的基址不为空则失败
      L.length = 0;
      L.listsize = LIST_INIT_SIZE;
      return(OK);     
} //initlist_ sq

线性表顺序存储的查找、插入、删除操作的实现

struct ListInsert _sq (sqlist L,int i,elem e){
      //在顺序线性表L中第i个位置之前插入新的元素e
      if(i<0 || i>L.length+1)  return error;
      if(L.length >= L.listsize){
           newbase = (elemtype *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(elemtype))
           if(!newbase) exit(overflow);
           L.elem = newbase;
           L.listsize += LISTINCREMENT;
           }
           q = &(L.elem[i-1]);
           for(p= & (L.elem[L.length-1]);p>=q;--p) *(p+1) = *p;
           *q = e;
           ++L.length;
           renturn ok;
}//Listinsert_sq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值