【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;
}
...全文
60 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
短歌如风 2003-12-02
  • 打赏
  • 举报
回复
楼上两位说的对,还漏了几句。上周比较忙,
第三题:已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。
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;

assert(A != NULL && B != NULL & C != NULL);
while(s != NULL)
{
if(IsNumeric(s->data))
{
LastA->next = s;
LastA = s;
}
else if(IsAlpha(s->data))
{
LastB->next = s;
LastB = s;
}
else
{
LastC->next = s;
LastC = 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;
}
这样才对。

关于用指针还是引用代表“变参”,在C++中我喜欢用引用,这样就不用对输入的指针是否有效进行检验了。而在C中只好用指针了。

xiaoyige886 2003-12-02
  • 打赏
  • 举报
回复
第三题:
少了
LastA->next = s;
LastA = s;

to plainsong
用 CLinkList* A ,和 CLinkList& A,一个是指向指针的指针,一个是指针的引用
他们的差别大吗? 您比较倾向与用哪一种?

哈哈,我基础不过关? 对了,您收不收徒弟呀? 如果要的话,我以后就跟您混了!
tristsesame 2003-12-02
  • 打赏
  • 举报
回复
应该有
LastA = LastA->next
...
LastB = LastB->next
...
LastC = LastC->next

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧