线性表简介

  线性结构是一个数据元素的有序(次序)集合。

  线性结构的基本特征为:

     1. 集合中必存在唯一的一个“第一元素”;

     2.集合中必存在唯一的一个 “最后元素” ;

     3.除最后元素在外,均有 唯一的后继;

     4.除第一元素之外,均有 唯一的前驱

线性表的类型定义

     ADT(抽象数据类型)是描述逻辑结构的,它的的实现用物理存储来实现,有两种: 顺序存储结构和链式存储结构。   

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

  1. ADT List{ 
  2.     数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n,  n≥0 }   
  3.           {称 n 为线性表的表长(也是元素个数); 称 n=0 时的线性表为空表。}           
  4.     数据关系:R1={ <ai-1 ,ai >|ai-1 ,ai∈D,  i=2,...,n } i是位序 
  5.     基本操作: 
  6. 初始化    ->InitList(&L){构造空的线性表L} 
  7. 销毁      ->Destroy(&L){销毁} 
  8. 是否为空表->ListEmpty(L){若L为空 返回TRUE} 
  9. 求表长    ->ListLength(L){返回L中的元素个数,即表长} 
  10. 取前驱    ->PriorElem(L,cur_e,&pre_e){cur_e为一个元素且不是第一个,则用pre_e返回 
  11.                       它的前驱}     
  12. 去后继    ->NextElem(L,cur_e,&next_e) 
  13. 取元素    ->GetElem(L,i,&e){用e返回L中第i个元素的值} 
  14. 定位      ->LocateElem(L,e,compare()){返回L中第一个与e满足compare()的元素位序, 
  15.                                       否则返回0}                                  
  16. 遍历      ->ListTraverse(L,visit()){依次对L的每个元素调用visit()函数} 
  17. 置空      ->ClearList(&L){置空} 
  18. 改变元素  ->PutElem(&L,i,e){把e覆盖第i个位置,是改变元素,不是插入} 
  19. 插入      ->ListInsert(&L,i,e){插入的位置是i的前面} 
  20. 删除      ->ListDelete(&L,i,&)       
  21. }ADT List 

1集合 和 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合AAB

分析扩大线性 表 LA,将存在于线性表LB 中而不存在于线性表 LA 中的数据元素插入                   

      到线性表 LA 中去。

  1. void union(List &LA, List LB) { 
  2.     LA_len = ListLength(LA);    // 求线性表的长度 
  3.   LB_len = ListLength(LB);  
  4.   for (i = 1;  i <= LB_len;  i++) { 
  5.       GetElem(LB, i, e); // 取LB中第i个数据元素赋给e  
  6.       if (!LocateElem(LA, e, equal( )) )  //e 与LA元素比较,如果没有,则插入 
  7.          ListInsert(LA, ++LA_len, e);// LA中不存在和 e 相同的数据元素,则插入之 
  8.    } 
  9. }                                            O(ListLength(La)×ListLength(Lb) ) 

2 线性表LALB中的数据元素按值非递减有序排列,现要求将LALB归并为一个新的线性表LC,且LC中的数据仍按值非递减有序排列。

分析: LC先设为空表,然后将LALB中的元素逐个插入到LC中。可设两个整型变量ij,分别指向LALB,比较ij所指元素的大小,决定哪个元素插入LC。插入后,在LA LB 中顺序后移

  1. void MergeList(List LA, List LB, List &LC) { 
  2.    InitList(LC);  // 构造空的线性表 LC 
  3.    i = j = 1;    k = 0;  
  4.    LA_len = ListLength(LA); 
  5.    LB_len = ListLength(LB); 
  6.    while ((i <= LA_len) && (j <= LC_len)){       //LA和LB都不为空 
  7.         GetElem(LA,i,ai); GetElem(LB,j,bj); 
  8.         if(ai<bj){    ListInsert(LC, ++k ,ai);  ++i   }  
  9.         else{  ListInsert(LC, ++k, bj) ;  ++j;   }    
  10.   } 
  11.    while (i<=LA_len) {   // 若 La 不空 
  12.         GetElem(LA,i++,ai);        
  13.         ListInsert(LC, ++k ,ai);    
  14.    } //插入LA表中剩余元素     
  15.    while (j<=LB_len)  {  // 若 Lb 不空 
  16.         GetElem(LB,j++,bj);        
  17.         ListInsert(LC, ++k ,bj);  
  18.    }//插入LB表中剩余元素 
  19. } // merge_list 
  20.                                               O( ListLength 2(La)+ListLength 2(Lb) )