浙江中醫藥大學-線性表演算法設計題
阿新 • • 發佈:2019-01-10
1、已知兩個連結串列A和B分別表示兩個集合,元素遞增排列。設計演算法求出A與B的交集,並存放於A連結串列中。(本部)
思路:從首元結點開始,逐個地把連結串列L的當前結點p插入新的連結串列頭部
思路:只有同時出現在兩集合中的元素才出現在結果表中,合併後的新表使用頭指標Lc指向。pa和pb分別是連結串列La和Lb的工作指標,初始化為相應連結串列的第一個結點,從第一個結點開始進行比較,當兩個連結串列La和Lb均為到達表尾結點時,如果兩個表中相等的元素時,摘取La表中的元素,刪除Lb表中的元素;如果其中一個表中的元素較小時,刪除此表中較小的元素,此表的工作指標後移。當連結串列La和Lb有一個到達表尾結點,為空時,依次刪除另一個非空表中的所有元素。
2、設計演算法將一個帶頭結點的單鏈表A分解為兩個具有相同結構的連結串列B、C,其中B表的結點為A表中值小於零的結點,而C表的結點為A表中值大於零的結點(連結串列A中的元素為非零整數,要求B、C表利用A表的結點)。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的頭結點
思路:B表的頭結點使用原來A表的頭結點,為C表新申請一個頭結點。從A表的第一個結點開始,依次取其每個結點p,判斷結點p的值是否小於0,利用前插法,將小於0的結點插入B表,大於等於0的結點插入C表。
3、設計一個演算法,通過遍歷一趟,將連結串列中所有結點的連結方向逆轉,仍利用原表的儲存空間。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指向新的待處理結點。 } }
思路:從首元結點開始,逐個地把連結串列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