两个带头结点的单链表的合并

1.设两个带头结点单链表的头指针分别为A和B,且表中结点数据值均为整型,下面算法产生表A和B的并集,并以表C存储。

程序代码:

typedef struct node{

    int data;

    struct node *next;

}lnode,*link;

link union(link A,link B){

    link C,r,p,q;

    C=r=(link)malloc(sizeof(lnode));//C表的头结点,C作为头结点的指针,r作为变量指针使用

    p=A->next;//p指向A链表的一个结点,作为A的遍历指针

    while(p){//这个循环将A表复制到C

        q=(link)malloc(sizeof(lnode));//q作为临时指针变量

        q->data=p->data;//复制数据域数据

        r->next=q;//将q链到r指向的C表

        r=r->next;//保证r向后移动

        p=p->next;//保证p向后移动

    }

    r->next=NULL;//循环结束后,r指针所指结点为最后一个结点,将next域置空

    q=B->next;//q这时作为B的遍历指针

    while(q){//遍历B链表,B中每个节点与A中所有结点比较

        p=A->next;

        while(p){//循环比较出数据相等的结点

            if(p->data=q-->data) break;

            else p=p->next;

        }

        if(p==NULL){//A表遍历完,没有找到数据相等的结点,新建一个结点r,将此时q指针所指结点数据复制r

            r=(link)malloc(sizeof(lnode));

            r->data=q->data;

            r->next=C->next;//这个地方用的是头插法

            C->next=r; 

        }

        q=q->next;//q作为遍历指针保证向后移动

    }

    return(C);

}

2.用C语言函数形式描述的,将两个带头结点单链表合并的算法如下:其中A,B分别为待合并表的头指针,结果链表的头指针仍由A指出(注:若两表中有数据值相同的结点,只保留其中一个)。

程序代码:

typedef struct node{

    int data;

    struct node *next;

}linknode,*link;

void Union(link A, link B){

    link q,p,p1,u;

    p1=A->next;//作为变量指针使用,一直存放的是A表的第一个结点

    while(q){

        p=p1;//p作为A表的遍历指针

        while(p&&q->data==p->data)  p=p->next; //这个循环在找到相同数据值和p为空的时候跳出,与上题中的绿体字部分相当

        if(p==NULL){//p指针为空,即为没有找到相同数据结点

            u=q->next;//u作为变量指针使用,与下面的q=u结合使用实现了(q=q->next)

            q->next=A->next;//头插法

            A->next=q;

            q=u;

        }

        else{//找到相同数据结点

            u=q;//使用变量指针,防止遍历指针q位置错误

            q=q->next;//遍历指针后移

            free(u);//释放q(u=q)节点

        }

    }

}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页