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

admin2013-07-12  31

问题 已知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->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; } } }

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

最新回复(0)