前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构 | 每日一练(64)

数据结构 | 每日一练(64)

作者头像
小林C语言
发布2019-06-05 17:04:10
5280
发布2019-06-05 17:04:10
举报

数据结构

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下

——老子

1

每日一练

1.已知 L 为没有头结点的的单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其它字符,编写算法构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符。(要求用最少的时间和最少的空间)

正确答案

ps:||代表注释

1. [题目分析] 将一个结点数据域为字符的单链表,分解成含有字母字符、数字字符和其它字符的三个循环链表,首先要构造分别含有这三类字符的表头结点。然后从原链表第一个结点开始,根据结点数据域是字母字符、数字字符和其它字符而分别插入到三个链表之一的链表。注意不要因结点插入新建链表而使原链表断链。另外,题目并未要求链表有序,插入采用“前插法”,每次插入的结点均成为所插入链表的第一元素的结点即可。

void OneToThree(LinkedList L,la,ld,lo)∥L是无头结点的单链表第一个结点的指针,链表中的数据域存放字符。本算法将链表L分解成含有英文字母字符、数字字符和其它字符的带头结点的三个循环链表。

{la=(LinkedList)malloc( sizeof(LNode)); ∥建立三个链表的头结点

ld=(LinkedList)malloc( sizeof(LNode));

lo=(LinkedList)malloc( sizeof(LNode));

la->next=la;ld->next=ld;lo->next=lo;∥置三个循环链表为空表

while(L!=null)∥分解原链表。

{r=L; L=L->next; ∥L指向待处理结点的后继

if(r->data>=‘a’&& r->data<=‘z’|| r->data>=‘A’&& r->data<=‘Z’)

{r->next=la->next; la->next=r;} ∥处理字母字符。

else if(r->data>=‘0’&& r->data<=‘9’)

{r->next=ld->next;ld->next=r;} ∥处理数字字符

else {r->next=lo->next;lo->next=r;} ∥处理其它符号。

}∥结束 while(L!=null)。

}∥算法结束

[算法讨论] 算法中对L链表中每个结点只处理一次,时间复杂度O(n),只增加了必须的三个表头结点,符合题目“用最少的时间和最少的空间”的要求。

转发朋友圈,点下“在看”就是对小编的最大帮助!

-end-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档