C 将一个单链表拆成3个循环链表,其中一个是纯数字,一个纯字母,一个其他字符

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/u010095372/article/details/83380627