1. 程式人生 > >浙江中醫藥大學-線性表演算法設計題

浙江中醫藥大學-線性表演算法設計題

1、已知兩個連結串列A和B分別表示兩個集合,元素遞增排列。設計演算法求出A與B的交集,並存放於A連結串列中。(本部)

思路:只有同時出現在兩集合中的元素才出現在結果表中,合併後的新表使用頭指標Lc指向。pa和pb分別是連結串列La和Lb的工作指標,初始化為相應連結串列的第一個結點,從第一個結點開始進行比較,當兩個連結串列La和Lb均為到達表尾結點時,如果兩個表中相等的元素時,摘取La表中的元素,刪除Lb表中的元素;如果其中一個表中的元素較小時,刪除此表中較小的元素,此表的工作指標後移。當連結串列La和Lb有一個到達表尾結點,為空時,依次刪除另一個非空表中的所有元素。

void Mix(LinkList& La, LinkList& Lb, LinkList& Lc) 
{  pa=La->next;pb=Lb->next; 
//pa和pb分別是連結串列La和Lb的工作指標,初始化為相應連結串列的第一個結點
Lc=pc=La; //用La的頭結點作為Lc的頭結點
while(pa&&pb)
{ if(pa->data==pb->data)∥交集併入結果表中。
   { pc->next=pa;pc=pa;pa=pa->next;
     u=pb;pb=pb->next; delete u;}
  else if(pa->data<pb->data) {u=pa;pa=pa->next; delete u;}
else {u=pb; pb=pb->next; delete u;}
}
while(pa) {u=pa; pa=pa->next; delete u;}∥ 釋放結點空間
while(pb) {u=pb; pb=pb->next; delete u;}∥釋放結點空間
pc->next=null;∥置連結串列尾標記。
delete Lb;  //釋放Lb的頭結點
2、設計演算法將一個帶頭結點的單鏈表A分解為兩個具有相同結構的連結串列B、C,其中B表的結點為A表中值小於零的結點,而C表的結點為A表中值大於零的結點(連結串列A中的元素為非零整數,要求B、C表利用A表的結點)。

思路:B表的頭結點使用原來A表的頭結點,為C表新申請一個頭結點。從A表的第一個結點開始,依次取其每個結點p,判斷結點p的值是否小於0,利用前插法,將小於0的結點插入B表,大於等於0的結點插入C表。

void DisCompose(LinkedList A)
{    B=A;
     B->next= NULL;    ∥B表初始化
     C=new LNode;∥為C申請結點空間
     C->next=NULL;     ∥C初始化為空表
     p=A->next;        ∥p為工作指標
     while(p!= NULL)
     { r=p->next;      ∥暫存p的後繼
       if(p->data<0)
        {p->next=B->next; B->next=p; }∥將小於0的結點鏈入B表,前插法
       else {p->next=C->next; C->next=p; }∥將大於等於0的結點鏈入C表,前插法
       p=r;∥p指向新的待處理結點。
     }
}
3、設計一個演算法,通過遍歷一趟,將連結串列中所有結點的連結方向逆轉,仍利用原表的儲存空間。
思路:從首元結點開始,逐個地把連結串列L的當前結點p插入新的連結串列頭部
void  inverse(LinkList &L) 
{// 逆置帶頭結點的單鏈表 L
    p=L->next;  L->next=NULL;
    while ( p) {
        q=p->next;    // q指向*p的後繼
        p->next=L->next;
        L->next=p;       // *p插入在頭結點之後
        p = q;
    }
}

4、統計出不帶表頭的單鏈表HL中結點的值等於給定值X的結點數,寫出實現演算法。(濱江)

int CountX(lklist * HL,ElemType x)
{  
int i=0;
LNode* p=HL;//i為計數器
while(p!=NULL) {
if (P->data==x) i++;
p=p->next;
}//while, 出迴圈時i中的值即為x結點個數
return i;
}//CountX