2.12

   FUNC  compare(A,B:sqlist):char;

{本算发比较顺序表AB,A<B,返回’<’, A=B,返回’=’, A>b返回’>’};

  算法1

      i:=1; equal:=true;{为退出while循环而设}

      WHILE (i<= LENGTH(A)) AND (i<=LENGTH(B) AND equal DO

         IF GET(A,i)=GET(B,i) {A,B中对应字符相等,后移指针}

            THEN i:=i+1 ELSE equal:=false;

      IF (i=LENGTH(A)+1) and (i=LENGTH(B)+1) AND equal

        THEN compare:=’=’{A=B,除去最大公共前缀后子表为空}

        ELSE IF (LENGTH(A)=LENGTH(B) AND (GET(A,i)<GET(B,i) OR

              OR (I=LENGTH(A)+1) AND (i<LENGTH(B)+1) OR

              (I<LENGTH(A)+1) AND (i<LENGTH(B)+1) AND GET(A,i)<get(B,i)

              THEN compare:=’<’;{A’B’非空;A’,B’均不空但A’第一字符小于B’}

              ELES compare:=’>’;

   ENDF;

 算法2  {建立子表A’B’}

       equal:=true;

       i:=1; k:=0;{iA,B比较对应元素的指针,kA’,B’指针}

       INITIATE (A’); INITIATE (B’);

       WHILE (i<= LENGTH (A)) AND (i<= LENGTH(B) AND equal DO

          IF GET(A,i)=GET(B,i)

            THEN i:=i+1 ELSE equal:=false;

       FOR j:=i TO LENGTH (A) DO [INSERT[(A’,k+1,GET(A,i));k:=k+1];

       k:=0;

       FOR j:=i TO LENGTH(B) DO [INSERT[B’,k+1,GET(B,i)),k:=k+1];

       IF EMPTY(A’) AND EMPTY(B’) THEN RETURN(‘=’){A’,B’均空}

         ELSE IF (EMPTY (A’) AND NOT(EMPTY (B’)) OR

               (NOT EMPTY (A’) AND NOT EMPTY (B’) AND GET(A’,1)<GET(B’,1)

               THEN RETURN(‘<’)  {A’B不空,A’首字符小}

               ELSE RETURN(‘>’);


2.19

 PROC Deletelist (VAR la:Linkedlist; mink,maxk:elemtype);

   {la是带头节点的递增有序单链表,本算法删除递增有序单链表中}

   {所有值大于mink且小于maxk的元素}

   pre:=la;  {pre为链表中当前元素的前驱}

   q:=la^.next;  {q为链表中待处理的当前元素}

   found:=false;  {设标记};

   WHILE (q<>NIL) AND NOT  found  DO

      IF q^.data<=mink THEN  [pre:=q; q:=q^.next]

                     ELSE found:=true; {找到第一待删节点后停止搜索}

   WHILE (q<>NIL) AND found DO {找到大于maxk的就停止或到达表尾}

      IF q^.data<maxk THEN  [ p:=q; q:=q^.next; dispos(p)]

                     ELSE found:=false;

   pre^.next:=q;{删除了所有该删节点}

 ENDP;

2.21          

  PROC Invertsqlist (VAR va:sqlisttp);

{本算法就地逆置线性表va,2.21是顺序表,2.22是单链表}

    FOR i:=1 TO (va.last  DIV  2)  DO  va.data[i]ßàva.data[va.last-i+1]

  ENDP;

2.22          

  PROC Invertsqlist (VAR va:sqlisttp); {链式存储结构}

算法1

p:=NIL;{前驱} q:=la^.next;{当前}

WHILE q<>NIL DO

   [ r:=q^.next;  {r记下一结点  [ r:=q; {r为临时变量}

    q^.next:=p;  {逆置}              q:=q^.next;

    p:=q;  {前驱跟上}               r^.next:=p;

    q:=r;  {处理下一结点}           p:=r

   ]                              ]

     la^.next:=p; {保留头指针不动,头节点指向第一元素}

     算法2

 q:=la^.next; la^.next:=NIL;

 WHILE q<>NIL DO  {此算法省去了中间变量r}

    [ p:=q;

     q:=q^.next;

     p^.next:=la^.next;

     la^.next:=p

    ]

ENDP;


2.24 PROC  unitinvert(VAR lc:linkedlist; la,lb:linkedlist);

     {la,lb是两个递增有序的单链表,本算法将la,lb合并成按元素值递减有序的}

     {单链表lc. 算法中比较la,lb相应元素,小者链入lc且逆置}

     pa:=la^.next;  pb:=lb^.next;  {pa,pb先指向la,lb中第一元素}

     lc:=la;  pc:=lc;  q:=NIL;  {qpc的前驱,逆置后为后继}

     WHILE (pa<>NIL) AND (pb<>NIL) DO

        IF pa^.data<=pb^.data

           THEN [pc:=pa;  pa:=pa^.next;  pc^.next:=q;{逆置} q:=pc; ]

           ELSE [pc:=pb;  pb:=pb^.next;  pc^.next:=q;  q:=pc;  ]

     WHILE pa<>NIL DO {处理表A剩余部分}

        [pc:=pa; pa:=pa^.next ;  pc^.next:=q;  q:=pc;  ]

     WHILE pb<>NIL DO{处理表B剩余部分}

        [pc:=pb;  pb:=pb^.next ;  pc^.next:=q;  q:=pc;  ]

      lc^.next:=q;  {表头链入链表中}

  ENDP;             

2-25 PROC   IntersectSqlist   (VAR  vc: Sqlist;  va, vb:Sqlist);

   {va,vb是两个递增有序的线性表,用顺序存储结构存储,本算法求两表的交集,

   {且放入vc, vc也是递增有序的线性表}

   vc.last:=0;   I:=1;   j:=1;  k:=1;  {i,j,kva,vb,vc三表当前元素指针}

   WHILE  (I<=va.last)  AND  (j<=vb.last)  DO

      IF  va.data[I]<vb.data[j]  THEN  I:=I+1;

         ELSE IF va.data[I]=vb.data[j]{找到交集元素}

                 THEN  [k:=k+1;  vc.data[k]:=va.data[I];  I:=I+1;  j:=j+1]

                 ELSE   j:=j+1;

   vc.last:=k;

ENDP;

2-26 PROC  IntersectSqlist  (VAR  lc:Linklist;  la,lb:Linkedlist)

      { la,lb是两个递增有序单链表的头指针,本算法求两表的交集lc,}

      {lc也是递增有序单链表}

     pa:=la^.next;  pb:=lb^.next;    new(lc);  lc^.next:=NIL;

     pc:=lc;   {初始化,pc指向lc表中最后一个结点}

     WHILE  (pa<>NIL)  AND  (pb<>NIL)  DO

        IF  pa^.data<pb^.data  THEN  pa:=pa^.next

           ELSE IF  pa^.data=pb^.data

                   THEN  [new(p);  p^.data:=pa^.data;  p^.next:=pc^.next;

                           pc^.next:=p;  pc:=p;

                           pa:=pa^.next;   pb:=pb^.next;

                          ]

                  ELSE  pb:=pb^.next;  {pb^.data<pa^.data, pb后移}

   ENDP; 


2.32

      PROC ChangeToBilink(hp:Bilinklist);

     {hpbilinklist型单向循环链表,next是指向后继结点的指针域}

     {pre初值为NIL, 本算法将该链表改为双向循环链表}

     TYPE

          Bilinklist=^binode;

          binode=RECORD

                    data:elemtp;

                    pre,next:bilinklist;

                 END;

      p:=hp^.next;  q:=hp;  {qp的前驱}

      WHILE p<>hp DO

         [p^.pre:=q;  q:=p;  p:=p^.next];

       hp^.pre:=q; {p^.pre:=q}

   ENDP;

2. P:=hp^.next;  q:=hp;

     WHILE p^.pre=NIL DO

        [p^.pre:=q;  q:=p;  p:=p^.next];

2.33

  PROC splitlinklist(VAR lc,ld,lo:linkedlist;ll:linkedlist);

{ ll是数据域为字符的循环链表,本算法将ll分解为lc,ldlo}

{三个各含字母,数字和其它符号的循环链表,利用原空间}

p:=ll^.next;  lc:=lL;  lc^.next:=lc;

NEW(ld);  ld^.next:=ld;

NEW(lo);  lo^.next:=lo;{初始化}

WHILE p<>ll DO

  [q:=p^.next;  {用以记住后继结点}

   CASE

     p^.data IN ['0'..'9']: [ p^.next:=ld^.next;  ld^.next:=p ];

     p^.data IN ['A'..'Z'] OR p^data  IN  ['a'..'z']:

                            [ p^.next:=lc^.next;  lc^next:=p ];

     ELSE [ p^.next:=lo^.next;  lo^.next:=p];

    ENDC

   p:=q;

  ]

ENDP;