#include using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList; bool InitList(LinkList &L){ L = (LNode *)malloc(sizeof(LNode)); // 带头节点 if(L == NULL) return false; L->next = NULL; return true; } void InputList(LinkList &L){ int x; cin>>x; LinkList tail = L; while(x != -99999){ // 输入 -99999 结束输入 LNode *newNode = (LNode*)malloc(sizeof(LNode)); newNode->data = x; newNode->next = NULL; tail->next = newNode; tail = newNode; cin >> x; } } void PrintList(LinkList &L){ LinkList p = L->next; while(p != NULL){ cout << p->data << ",\n"[p->next == NULL]; p = p->next; } } LinkList p1, p2, p3, tmp; void MergeList1(LinkList &L1, LinkList &L2, LinkList &L3){ // 升序合并并去重 p1 = L1->next; p2 = L2->next; L3 = p3 = L1; while(p1 && p2){ if(p1->data < p2->data){ p3->next = p1; p3 = p1; p1 = p1->next; }else if(p2->data < p1->data){ p3->next = p2; p3 = p2; p2 = p2->next; }else{ p3->next = p1; p3 = p1; p1 = p1->next; tmp = p2->next; delete p2; p2 = tmp; } } p3->next = p1?p1:p2; delete L2; } void MergeList2(LinkList &L1, LinkList &L2, LinkList &L3){ // 降序合并 p1 = L1->next; p2 = L2->next; L3 = L1; L3->next = NULL; while(p1 || p2){ if(!p1) { tmp = p2; p2 = p2->next; } else if(!p2) { tmp = p1; p1 = p1->next; } else if(p1->data <= p2->data) { tmp = p1; p1 = p1->next; } else { tmp = p2; p2 = p2->next; } tmp->next = L3->next; L3->next = tmp; } delete L2; } void MixList(LinkList &L1, LinkList &L2, LinkList &L3){ // 两链表相交 p1 = L1->next; p2 = L2->next; L3 = p3 = L1; while(p1 && p2){ if(p1->data == p2->data){ p3->next = p1; p3 = p1; p1 = p1->next; tmp = p2; p2 = p2->next; delete tmp; }else if(p1->data < p2->data){ tmp = p1; p1 = p1->next; delete tmp; }else{ tmp = p2; p2 = p2->next; delete tmp; } } while(p1) { tmp = p1; p1 = p1->next; delete tmp; } while(p2) { tmp = p2; p2 = p2->next; delete tmp; } p3->next = NULL; delete L2; } void DiffList(LinkList &L1, LinkList &L2, int &n){ // 两链表相差 p1 = L1->next; p2 = L2->next; p3 = L1; while(p1 && p2){ if(p1->data < p2->data){ p3 = p1; p1 = p1->next; n++; }else if(p1->data > p2->data){ p2 = p2->next; }else{ p3->next = p1->next; tmp = p1; p1 = p1->next; delete tmp; } } } int main(){ LinkList L1, L2, L3; InitList(L1); InitList(L2); InitList(L3); InputList(L1); InputList(L2); // PrintList(L1); PrintList(L2); // 初始化并输入输出两个链表 MergeList1(L1, L2, L3); cout << "两链表升序合并并去重: "; PrintList(L3); LinkList L4, L5, L6; InitList(L4); InitList(L5); InitList(L6); InputList(L4); InputList(L5); // PrintList(L4); PrintList(L5); // 初始化并输入输出两个链表 MergeList2(L4, L5, L6); cout << "两链表降序合并: "; PrintList(L6); LinkList L7, L8, L9; InitList(L7); InitList(L8); InitList(L9); InputList(L7); InputList(L8); MixList(L7, L8, L9); cout << "两链表相交: "; PrintList(L9); LinkList L10, L11; InitList(L10); InitList(L11); InputList(L10); InputList(L11); int n = 0; DiffList(L10, L11, n); cout << "两链表相差: "; PrintList(L10); cout << "元素个数位: " << n << endl; return 0; } /* test samples 1 3 5 7 9 13 15 -99999 2 4 6 8 10 11 13 14 15 -99999 */