版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010095372/article/details/83380627
//结构体
typedef struct Node {
ElementType data;
struct Node * next;
} LNode, * LinkNode;
//将一个单链表拆成3个循环链表,其中一个是纯数字,一个纯字母,一个其他字符
Status depositeLink(LinkNode L, LinkNode *L1, LinkNode *L2, LinkNode *L3){
LinkNode p = L->next;
free(L);
//三个表的创建
(*L1) = (LinkNode)malloc(sizeof(LNode));
(*L2) = (LinkNode)malloc(sizeof(LNode));
(*L3) = (LinkNode)malloc(sizeof(LNode));
//初始化,和自身循环
LinkNode p1 = *L1;
p1->next = p1;
LinkNode p2 = *L2;
p2->next = p2;
LinkNode p3 = *L3;
p3->next = p3;
//他们的尾节点需要记住
LinkNode Tail1 = *L1;
LinkNode Tail2 = *L2;
LinkNode Tail3 = *L3;
//遍历单链表
while (p) {
//这个需要一个变量复制p
LinkNode temp = p;
//紧接着就要将p重新赋值,因为这个要是在下面写的话,就是把p改变了
//因为它们指向的都是同一块地址,就跟头插法的前两句一样
p = p->next;
if((temp->data >= 'a' && temp->data <= 'z') ||
(temp->data >= 'A' && temp->data <= 'Z'))
{
//因为有尾指针,新插进来的将其前驱后继整明白了
temp->next = Tail1->next;
Tail1->next = temp;
//尾指针也就变成了新插进来的这个
Tail1 = temp;
}else if(temp->data >= '0' && temp->data <= '9'){
temp->next = Tail2->next;
Tail2->next = temp;
Tail2 = temp;
}
else{
temp->next = Tail3->next;
Tail3->next = temp;
Tail3 = temp;
}
}
return OK;
}