【DS专题活动】第九期(11月24日~11月30日)解答
短歌如风 2003-12-02 03:52:18 以下是B组解答:
第一题:假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针;已知s为指向链表中某个结点的指针,编写算法在链表中删除指针s所指结点的前驱结点。
CLinkList Delete_pre(CLinkList s)
{
CLinkList p, pre;
assert(s != NULL && s->next != s);//假设链表长度大于1
pre = s;
p = pre->next;
while(p -> next != s)
{
pre = p;
p = pre->next
}
pre->next = p->next;
free(p);
return s;
}
第二题:已知有一个单向循环链表,其每个结点中有三个域:pre、data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空(NULL),编写算法将此单向循环链表改为双向循环链表。
DuLinkList Create_pre(DuLinkList L)
{
DuLinkList p = L;
while(L->next != p)
{
L->next->pre = L;
L = L->next;
}
L->next->pre = L;
return p;
}
第三题:已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。
void (LinkList L, CLinkList* A, CLinkList* B, CLinkList* c)
{
LinkList s = L;
LNode HeadA, HeadB, HeadC;
LinkList LastA = &HeadA, LastB = &HeadB, LastC = &HeadC;
HeadA.next = HeadB.next = HeadC.next = NULL;
while(s != NULL)
{
if(IsNumeric(s->data))
LastA->next = s;
else if(IsAlpha(s->data))
LastB->next = s;
else
LastC->next = s;
s = s->next;
}
LastA->next = HeadA.next;
LastB->next = HeadB.next;
LastC->next = HeadC.next;
*A = HeadA.next;
*B = HeadB.next;
*C = HeadC.next;
}