求出递增链表La、Lb的差集Lc,并同样以递增的方式存储

来源:互联网 发布:阿里云短信 php 实例 编辑:程序博客网 时间:2024/05/16 16:01

原题:已知两个带头结点的单链表La和Lb分别表示两个集合,元素值递增有序,设计算法求出La、Lb的差集Lc,并同样以递增的方式存储。(La和Lb的差集:即在La中而不在Lb中的元素的集合)

分析:求差集由函数Difference()实现,其算法思想:由于单链表La和Lb是递增有序的,可设置两个指针分别指向两个链表的第一个元素,当La的数据域值小于Lb的数据时,将其复制到Lc;如果数据域值相同,将指针pa和pb前进,否则数据域值小的指针向前进,直到两个指针中有一个为空为止;如果pb指针为空,pa指针非空,则将La中其余元素依次复制到Lc中即可。

#include<stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;int static flag=0;//定义全局变量flagint InitList(LinkList &L){LinkList p,q,pre;L=(LinkList)malloc(sizeof(LNode));//生成头结点L->data=-1;L->next=NULL;//头结点数据域值为-1if(flag == 0)//flag为0时才种下随机种子{srand((unsigned)time(NULL));flag=1;}else{flag=0;}for(int k=0;k<20;k++)//生成结点并插入链表{p=(LinkList)malloc(sizeof(LNode));p->data=rand()%40+1;p->next=NULL;if(L->next == NULL)//如果链表为空,则直接将结点插入作为第一个数据结点{L->next=p;p->next=NULL;}else{//如果链表不为空,则按数据域值从小到大有序的顺序插入pre=L;q=pre->next;while(q != NULL && p->data > q->data){//寻找插入位置pre=q;q=q->next;}//如果表中已有数据域值等于p的数据域值,则丢弃p,继续下次循环if(pre->data == p->data)continue;if(q != NULL && q->data == p->data)continue;if(pre->next == NULL){//如果pre指向尾结点了,则将p结点插入到表尾作新表尾pre->next=p;p->next=NULL;}else{//pre没有指向表尾,说明P结点应该插入在链表中,而不是在表尾p->next=pre->next;pre->next=p;}}}return 1;}int DisplayList(LinkList L)//从头到尾逐个打印各个结点的数据域值{if(L->next == NULL){printf("当前链表为空!\n\n");return -1;}LinkList p;p=L;while(p->next != NULL)//先打印除最后一个结点之前的结点的数据{printf("%5d ->",p->data);p=p->next;}printf("%5d\n\n",p->data);//打印最后个结点的数据return 1;}int Difference(LinkList &Lc,LinkList La,LinkList Lb)//求两集合的差集{LinkList pa=La->next,pb=Lb->next,pc;Lc=(LinkList)malloc(sizeof(LNode));//生成集合Lc的头结点Lc->data=-1;Lc->next=NULL;pc=Lc;//pc永远指向Lc的表尾while(pa!=NULL && pb!=NULL){if(pa->data < pb->data){pc->next=(LinkList)malloc(sizeof(LNode));pc=pc->next;//pc指向新表尾pc->data=pa->data;//复制pa->data到pc中pa=pa->next;}else if(pa->data == pb->data){//如果pa->data == pb->data则全pa、pb都后移pa=pa->next;pb=pb->next;}elsepb=pb->next;}while(pa!=NULL){//如果pa不为空,则将pa开始后的节点全部复制到Lc的表尾pc->next=(LinkList)malloc(sizeof(LNode));pc=pc->next;pc->data=pa->data;pa=pa->next;}pc->next=NULL;//pc为Lc的尾结点,置后继为空return 1;}int main(){LinkList La,Lb,Lc;InitList(La);printf("集合La的数据为:\n");DisplayList(La);InitList(Lb);printf("集合Lb的数据为:\n");DisplayList(Lb);Difference(Lc,La,Lb);//调用求差集函数printf("La、Lb的差集Lc的数据为:\n");DisplayList(Lc);return 1;}
原创粉丝点击