数据结构-线性表(顺序表)

1.线性表是最常用且最简单的一种数据结构。数据元素由数据项组成,在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称文件。

2.抽象数据类型线性表的定义:

3.归并算法:已知线性表LA和LB的数据元素按值非递减有序排列,现要求将LA和LB归并成一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。(先设LC为空表,设两个指针i和j分别指向LA和LB的某个元素)

void MergeList(List La,List Lb,List &Lc){
   InitList(Lc);
   i=j=1;k=0;
   La_len=ListLength(La);Lb_len=ListLength(Lb);
   while((I<=La_len)&&(j<=Lb_len)){
     GetElem(La,i,ai);GetElem(Lb,j,bj);
     if(ai<=bj){ListInsert(Lc,++k,ai);++I}
     else{ListInsert(Lc,++k,bj);++j;}
   }
   while(I<=La_len){
     GetElem(La,i++,ai);ListInsert(Lc,++K,ai);
   }
   while(j<=Lb_len){
     GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
   }
}

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

顺序表的初始化操作就是为顺序表分配一个顶定义大小的数组空间,并将线性表的当前长度设置为0。

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

listsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足,可进行再分配,即为顺序表增加一个大小为存储LISTINCREMENT个数据元素的空间。

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

5.线性操作表的插入操作

在第i个元素之前插入一个元素,需将第n至第i(共n-i+1)个元素向后移动一个位置:

Status ListInsert_Sq(SqList &L,int i,ElemType e){
     //在顺序线性表L中第i个位置之前插入新的元素e
     //i的合法值为1<=i<=ListLength_Sq(L)+1
     if(i<1||i>L.length+1)return ERROR;//i值不合法
     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]);    //q为插入位置
    for(p=&(L.elem[L.length-1]);p>=q;--q)*(p+1)=*p; //插入位置及之后的元素右移
    *q=e;  //插入e
    ++L.length;//表长加一
    return ok;
}//ListInsert_Sq;

6.线性操作表的删除操作

删除第i个元素

Status ListDelete_Sq(SqList &L,int i,ElemType e){
    if((i<1)||(i>L.length)) return ERROR;   //i值不合法
    p=&(L.elem[i-1]);       //p为被删除元素的位置
    e=*p;                   //被删除元素的值赋给e
    q=L.elem+L.length-1;    //表尾元素的位置
    for(++P;p<=q;++p)*(p-1)=*p; //被删除元素之后的元素左移
    --L.length;     //表长减1
    return OK;
}//ListDelete_Sq

7.在顺序线性表L中查找第1个值与e满足compare()的元素的位序

int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
//若找到,则返回其在L中的位序,否则返回0
       i=1;//i的初值为第一个元素的序列
       p=L.elem; //p的初值为第一个元素的存储位置;
       while(i<=L.length&&!(*compare)(*p++,e))++I;
       if(I<=L.length) return I;
       else return 0;
}//LocateElem_Sq

8.顺序表的归并,且新顺序表也按照顺序排列

void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
      pa=La.elem;pb=Lb.elem;
      Lc.listsize=Lc.length=La.length+Lb.length;
      pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
      if(!Lc.elem)exit(OVERFLOW);   //存储分配失败
      pa_last=La.elem+La.length-1;
      pb_last=Lb.elem+Lb.length-1;
      while(pa<=pa_last&&pb<=pb_last){. //归并
         if(*pa<=*pb) *pc++=*pa++){
         else *pc++=*pb++;
      }
      while(pa<=pa_last)*pc++=*pa++;   //插入La的剩余元素
      while(pb<=pb_last)*pc++=*pb++;   //插入Lb的剩余元素
}//MergeList_Sq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值