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。
循环单链表是单链表的另一种形式,其结构特点链表中最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循环链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作较为方便。