习题3.4 & 3.5: 求两链表的交集和并集

#include<stdio.h>

#include<stdlib.h>

struct Node;

typedef struct Node *PtrToNode;

typedef PtrToNode List;

typedef PtrToNode Position;



struct Node{

    ElementType Ele;

    PtrToNode Next;

};



Position

First( List L )

{

    return L->Next;

}

Position

Next( List L, Position p )

{

    return  p->Next;

}



List

CreateAndMakeEmpty( List L )

{

    L = malloc( sizeof( struct Node ) );

    if( L == NULL )

        Error("out of space ");

    L->Next = NULL;

    return L;

}



void

Insert( Position p, ElementType X )

{

    Position TmpCell;

    TmpCell = malloc( sizeof( struct Node ) );

    if( TmpCell == NULL )

        Error("out of space ");

    TmpCell->Ele = X;

    TmpCell->Next = p->Next;

    p->Next = TmpCell;

}

List

FindSimilar( List L1, List L2 )

{

   Position L1Pos,L2Pos,LresPos;

   List Lres;

   CreateAndMakeEmpty( Lres ); 

   LresPos = Lres;

   L1Pos = First(L1);

   L2Pos = First(L2);

   while( L1Pos != NULL && L2Pos != NULL )

   {

        if( L1Pos->Ele > L2Pos->Ele )

            next( L2, L2Pos );

        else if( L1Pos->Ele < L2Pos->Ele )

            next( L1, L1Pos )

        else

        {

            Insert( LresPos, L1Pos->Ele );

            LresPos = LresPos->Next;

            L1Pos = next( L1, L1Pos );

            L2Pos = next( L2, L2Pos );

        }

   }

}

void

PrintList( List Lres )

{

    Position p;

    p = First( Lres );

    while( p != NULL )

    {

        printf("%?",p->Ele);

        p = p->Next;

    }

}



List

GetUnion( List L1, List L2 )

{

    ElementType InsertEle;

    List Lres;

    Position L1Pos,L2Pos,LresPos;

    L1Pos = First( L1 );

    L2Pos = First( L2 );

    Lres = CreateAndMakeEmpty( Lres );

    LresPos = Lres;

    while( L1Pos != NULL && L2Pos != NULL )

    {

        if( L1Pos->Ele < L2Pos->Ele )

        {

            InsertEle = L1Pos->Ele;

            L1Pos = next( L1, L1pos );

        }

        else if( L1Pos->Ele > L2Pos->Ele )

        {

            InsertEle = L2Pos->Ele;

            L2Pos = next( L2, L2Pos );

        }

        else

        {

            InsertEle = L1Pos->Ele;

            L1Pos = next( L1, L1Pos ); L2Pos = next( L2, L2Pos );

        }

        Insert( LresPos, InsertEle );

        LresPos = next( Lres, LresPos );

    }

    while( L1Pos != NULL )

    {

        InsertEle = L1Pos->Ele;

        Insert( LresPos, InsertEle );

        LresPos = next( Lres, LresPos );

        L1Pos = next( L1Pos );

    }

    while( L2Pos != NULL )

    {

        InsertEle = L2Pos->Ele;

        Insert( LresPos, InsertEle );

        LresPos = next( Lres, LresPos );

        L2Pos = next( L2, L2Pos );

    }

    printList();

}
View Code

 

你可能感兴趣的:(链表)