A. 有一個帶頭結點的單鏈表L,設計一個演算法使其元素遞增有序排列
/*插入排序法*/
voidsort(Linklist*&L)
{
LinkList*p=L->next,*q,*r;
if(p!=NULL)
{
/*把鏈表分成兩條,一條已經排序好了(L),一條待排序(p)*/
r=p->next;
p->next=NULL;
p=r;
/*對於所有待排序的元素*/
while(p!=NULL)
{
/*把p鏈表的第一個元素插入到L,並且將它從p中移除*/
r=p->next;//r指向p的第二個元素
/*找到合適的插入點*/
q=L;
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
/*在q後面插入p*/
p->next=q->next;
q->next=p;
/*現在p的第一個元素已經被移到L中合適的位置了*/
p=r;
}
}
}
B. 寫出在帶頭結點的動態單鏈表結構上求線性表的長度的演算法: int LengthList( Node *L ) 謝謝!!
int LengthList( Node *L )
{
Node *p = L->next; //將p初始指向鏈表中第一個節點的地址
int length = 0;
while(p) //當p指向的地址不為空時,繼續循環計算長度
{
++length;
p = p->next; //鏈表長度加1後,將p指向其後繼節點地址
}
return length;
}
C. 已知有兩個帶頭的結點的循環單鏈表LA、LB,編寫一個演算法,將兩個循環單鏈表合並為一個循環單鏈表
已知帶有頭結點的兩個單鏈表 la 和 lb 都是非遞增有序序列。
編寫好的演算法實現將這兩個鏈表合並為新的帶有頭結點的鏈表 lc ,使得 lc 的元素仍然是非遞增有序排列的序列,如果遇到 la 與 lb 中元素相同,則只取 la 中的元素,去掉 lb 中的元素。已知 la 的元素個數 為 m , lb 的元素個數為 n。
循環單鏈表是單鏈表的另一種形式,其結構特點鏈表中最後一個結點的指針域不再是結束標記,而是指向整個鏈表的第一個結點,從而使鏈表形成一個環。和單鏈表相同,循環鏈表也有帶頭結點結構和不帶頭結點結構兩種,帶頭結點的循環單鏈表實現插入和刪除操作較為方便。