链表(三)

15.已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于
A链表中。
问题思路:归并思想。结果链生成采用尾插法。

LinkList Union(LinkList & la, LinkList & lb) {
    LNode* u;
    pa = la->next;
    pb = lb->next;
    pc = la;   //结果链
    while (pa && pb) {
        if (pa->data = pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
            u = pb;
            pb = pb->next;
            free(u);
        }
        else if(pa->data<pb->data) {
            u = pa;
            pa = pa->next;
            free(u);
        }
        else {
            u = pb;
            pb = pb->next;
            free(u);
        }
    }
    //释放剩余的一个链表
    while (pa) {
        u = pa;
        pa = pa->next;
        free(u);
    }
    while (pb) {
        u = pb;
        pb = pb->next;
        free(u);
    }
    pc->next = NULL;
    free(lb);
    return la;
}

16, 两个整数序列A - a, a, a, ., a和B = b, 2, bs, .b已经存入两个单链表中, 设计一个算法,
判断序列B是否是序列A的连续子序列。

思想:A链表需要设置一个前驱节点(不设置也可)

int Pattern(LinkList A, LinkList B) {
    LNode* p=A;
    LNode* q=B;
    LNode* pre = p;
    while (p && q) {
        if (p->data == q->data) {
            p = p->next;
            q = q->next;
        }
        else {
            pre = pre->next;
            p = pre;
            q = B;
        }
    }
    if (q == NULL)
        return 1;
    else
        return 0;
}

17.设计一个算法用于判断带头结点的循环双链表是否对称

int Symmtry(DLinkList L) {
    DNode* p = L->next, * q = L->prior;
    while (p != q && q->next != p) {  //考虑链表的奇偶
        if (p->data == q->data) {
            p = p->next;
            q = q->prior;
        }
        else
            return 0;
    }
    return 1;
}

18.有两个循环单链表, 链表头指针分别为h1和h2, 编写一个函数将链表h2链接到链表hl之后,要
求链接后的链表仍保持循环链表形式。
思想:找到尾指针即可

LinkList Link(LinkList& h1, LinkList& h2) {
    LNode* p, * q;
    p = h1;
    while (p->next != h1) {
        p = p->next;
    }
    q = h2;
    while (q->next != h2) {
        q = q->next;
    }
    p->next = h2;
    q->next = h1;
    return h1;
}

19, 设有一个带头结点的循环单链表, 其结点值均为正整数。设计一个算法, 反复找出单链表中结
点值最小的结点并输出, 然后将该结点从中删除, 直到单链表空为止, 再删除表头结点。

void Del_Small(LinkList& L) {
    LNode* p, * pre, * minp, * minpre;

    while (L->next != L) {
        p = L->next; pre = L;
        minp = p; minpre = pre;
        while (p != L) {
            if (minp->data > p->data) {
                minpre = pre;
                minp = p;
            }
            pre = p;
            p = p->next;
        }
        minpre->next = minp->next;
        free(minp);
    }
    free(L);
}

 

posted @ 2021-08-12 10:46  为红颜  阅读(158)  评论(0编辑  收藏  举报