求出递增链表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;}
- 求出递增链表La、Lb的差集Lc,并同样以递增的方式存储
- 线性链表之将单调递增的la和lb中的数据元素按值递增,将la和lb合并为新的线性表lc,使lc中的元素仍然单调递增
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 把两个递增的单链表La,Lb,合并成一个递减的单链表Lc
- 实现La和Lb的交集、并集、差集,并把结果存入Lc中(数据结构)
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 《数据结构》2.4求两个递增链表的差集
- 将la,lb链表合并成lc。
- 求两个递增单链表的差集
- 得到两递增链表的共同结点,并以链表形式返回
- 将La和Lb合并为一个新的线性表Lc的几种结构的归纳
- 已知两个线性升序表LA,LB,然后合并两个表为LC,并保持升序
- 线性表LA和LB非递减有序排列,将LA,LB进行归并为新的线性表LC,要求LC中的数据元素扔非递减有序列排列
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 判断带表头的单向循环链表La是否递增
- 链表合并 求两个递增链表的并
- 递增链表的交集
- 用顺序表求lc=la-lb
- HTM-splatting算法
- /etc/login.defs 文件内容及其解释
- HANA内存数据库时代的到来,ORACLE已经日薄西山
- 最简单的DOM树结构模型
- Uva 10916
- 求出递增链表La、Lb的差集Lc,并同样以递增的方式存储
- HDU1195(BFS)
- 实时错误'3706'未找到提供程序。改程序可能未正确安装
- c/c++算法之字符串转换成整数
- LA 5031 Graph and Queries
- 设计排序算法问题
- 判断集合La是否是集合Lb的子集
- 判断IE版本
- Cocosd-x随记--在Xcode环境下,Cocos2d-x使用自定义字体