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

admin2014-12-08  42

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

选项

答案void OneToThree(LinkList&L,&la,&ld,&lo){ /*L是无头结点的单链表第一个结点的指针,链表中的数据域存放字符。本算法将链表L分解成含有英文字母字符、数字字符和其它字符的带头结点的三个循环链表*/ la=(LinkList)malloc(sizeof(LNode)); //建立三个链表的头结点 ld=(LinkList)malloc(sizeof(LNode)); lo=(LinkList)malloc(sizeof(LNode)); la一>next=la; //置三个循环链表为空表 ld一>next=ld; lo一>rlext=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; } } }

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

最新回复(0)