循环单链表合并

来源:互联网 发布:成都凶宅数据库查询 编辑:程序博客网 时间:2024/05/20 03:06

假设链表 p 和链表 q 中的结点值都是整数,且按结点值的递增次序链接起来的带表头结点的环形链表。各链表的表头结点的值为 max,且链表中其他结点的值都小于 max,在程序中取 max 为 9999。在各个链表中,每个结点的值各不相同,但链表 p 和链表 q 可能有值相同的结点(表头结点除外)。下面的程序将链表 q合并到链表 p 中,使得合并后的链表是按结点值递增次序链接起来的带表头结点的环形链表,且链表中各个结点的值各不相同。

#include <iostream>#include <cstdio>#include <stdlib.h>using namespace std;const int maxv = 9999;typedef  struct LNode{    int data;    struct LNode *link;}LNode, *CLinkList;void MergeList(CLinkList &p, CLinkList q) {    LNode* r = p;    LNode* s;    LNode* q2 = q;    //while (r->link->data != maxv && q->link->data != maxv) {    while (r->link != p && q->link != q2) {        while (r->link->data < q->link->data) r = r->link;        if (r->link->data > q->link->data) {            s = q->link;                                //删除表q中s指向的结点            q->link = s->link;            s->link = r->link;                         //将s指向的结点插入表p            r->link = s;            r = r->link;                                //工作指针后移        }        else {                                          //两个结点的值相等时,不插入新结点,直接删除表q中的结点            r = r->link;            s = q->link;            q->link = s->link;            free(s);        }    }    free(q);}void CreateList (CLinkList &L, int n) {                  //CreatList 尾插法建立单链表LNode* p;LNode* r;L = (LNode*) malloc (sizeof(LNode));L->link = L;r = L;for (int i = 0; i < n; i ++) {p = (LNode*) malloc (sizeof(LNode));cin >> p->data;p->link = L;r->link = p;r = p;}cout << "Create a linked list successfully." << endl;}void PrintList (CLinkList L) {                           //PrintList 打印单链表LNode* p;p = L->link;while (p != L) {cout << p->data << " ";p = p->link;}cout << endl;}int main () {    CLinkList p, q;    CreateList(p, 5);    CreateList(q, 10);    MergeList(p, q);    //system("PAUSE");    PrintList(p);    return 0;}


0 0