SDUST-OJ-1681 Problem 求集合的交并补集(不用STL,手写单链表实现)
来源:互联网 发布:java培训 冲刺班 编辑:程序博客网 时间:2024/04/23 18:35
Problem A: 求集合的交并补集
Time Limit: 1 Sec Memory Limit: 4 MBDescription
任意给定两个包含1-30000个元素的集合A,B(集合中元素类型为任意整型数,且严格递增排列),求A交B、A并B、A-B和B-A集合。
Input
输入第一行为测试数据组数。每组测试数据两行,分别为集合A、B。每行第一个数n(1<=n<=30000)为元素数量,后面有n个严格递增的绝对值小于2^31代表集合中包含的数。
Output
对每组测试数据输出5行,第1行为数据组数,后4行分别为按升序输出两个集合的A交B、A并B、A-B和B-A集合。格式见样例。
Sample Input
1
3 1 2 5
4 2 3 5 8
3 1 2 5
4 2 3 5 8
Sample Output
Case #1:
2 5
1 2 3 5 8
1
3 8
2 5
1 2 3 5 8
1
3 8
HINT
考察知识点:有序表合并,时间复杂度O(n),空间复杂度O(n)
做法:
1、用单链表实现
2、详细实现看注释
注意:
1、所给数据本身就是严格递增,无需排序
AC代码(C语言格式写的,但是用C++交的):
#include <stdio.h>#include <stdlib.h>typedef int ElemType;//定义数据项类型typedef struct node * PNode;//定义节点指针//节点的定义typedef struct node{ ElemType data; //数据域 PNode next; //链域}LNode,*LinkList;//构造一个空的单链表int InitList(LinkList *L){ (*L) = (LinkList)malloc(sizeof(LNode)); if ((*L) == NULL) return -1; (*L)->next = NULL; return 0;}//构造一个新的节点int NewNode(PNode *p){ (*p) = (PNode)malloc(sizeof(LNode)); if ((*p) == NULL) return -1; (*p)->next = NULL; return 0;}//单链表取值int GetElem(LinkList L,int i,ElemType *e){ PNode p = NULL; p = L->next; int j = 1; while(p && j<i) { p = p->next; ++j; } if (!p || j>i) return -1; *e = p->data; return 0;}//查找 找到返回此元素地址 未找到返回NULlPNode LocateElem(LinkList L,ElemType e){ PNode p = NULL; p = L->next; while(p && p->data != e) p = p->next; return p;}//在第i个位置 插入节点int ListInsert(LinkList L,int i,ElemType e){ PNode p = L; int j = 0; while(p && j<(i-1)) { p = p->next; ++j; } if (!p || j>i-1) return -1; PNode s; if (NewNode(&s) == -1) return -1; s->data = e; s->next = p->next; p->next = s; return 0;}//删除 第i个节点int ListDelete(LinkList L,int i){ PNode p = L; int j = 0; while((p->next) && (j<i-1)) { p = p->next; ++j; } if (!(p->next) || (j>i-1)) return -1; PNode q = p->next; p->next = q->next; free(q); return 0;}//前插法创建单链表void CreateList_H(LinkList *L,int n){ InitList(L); //创建空链表头 int i; PNode p = NULL; for (i=0;i<n;i++) { NewNode(&p); scanf("%d",&(p->data)); p->next = (*L)->next; (*L)->next = p; }}//后插法创建单链表void CreateList_R(LinkList *L,int n){ InitList(L); //创建空链表头 int i; PNode p = NULL; PNode r = (*L); //r为尾指针(指向最后一个节点) for (i=0;i<n;i++) { NewNode(&p); scanf("%d",&(p->data)); p->next = NULL; r->next = p; r = p; }}//清除整个链表int Clear(LinkList *L){ PNode p,delp; p = (*L); while(p->next) { delp = p; p = p->next; free(delp); } free(p); (*L) = NULL; return 0;}LinkList LA = NULL;LinkList LB = NULL;void Bing(){ int conid = 0; PNode pa,pb; pa = LA; pb = LB; pa = pa->next; pb = pb->next; while(pa && pb) { if (pa->data < pb->data) //pa小,输出 { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; //pa后移 } else if (pa->data > pb->data) //pb小,输出 { if (conid == 0) //第一次输出 { printf("%d",pb->data); conid = 1; } else printf(" %d",pb->data); pb = pb->next; //pb后移 } else //pa->data == pb->data { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; //pa后移 pb = pb->next; //pb后移 } } if (pa != NULL) { while(pa) { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; } } if (pb != NULL) { while(pb) { if (conid == 0) //第一次输出 { printf("%d",pb->data); conid = 1; } else printf(" %d",pb->data); pb = pb->next; } }}void Jiao(){ int conid = 0; PNode pa,pb; pa = LA; pb = LB; pa = pa->next; pb = pb->next; while(pa && pb) { if (pa->data < pb->data) //pa小 pa = pa->next; //pa后移 else if (pa->data > pb->data) //pb小 pb = pb->next; //pb后移 else //pa->data == pb->data { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; //pa后移 pb = pb->next; //pb后移 } }}void A_B(){ int conid = 0; PNode pa,pb; pa = LA; pb = LB; pa = pa->next; pb = pb->next; while(pa && pb) { if (pa->data < pb->data) //pa小,输出 { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; //pa后移 } else if (pa->data > pb->data) //pb小,输出 { pb = pb->next; //pb后移 } else //pa->data == pb->data { pa = pa->next; //pa后移 pb = pb->next; //pb后移 } } if (pa != NULL) { while(pa) { if (conid == 0) //第一次输出 { printf("%d",pa->data); conid = 1; } else printf(" %d",pa->data); pa = pa->next; } }}void B_A(){ int conid = 0; PNode pa,pb; pa = LA; pb = LB; pa = pa->next; pb = pb->next; while(pa && pb) { if (pa->data < pb->data) //pa小,输出 { pa = pa->next; //pa后移 } else if (pa->data > pb->data) //pb小,输出 { if (conid == 0) //第一次输出 { printf("%d",pb->data); conid = 1; } else printf(" %d",pb->data); pb = pb->next; //pb后移 } else //pa->data == pb->data { pa = pa->next; //pa后移 pb = pb->next; //pb后移 } } if (pb != NULL) { while(pb) { if (conid == 0) //第一次输出 { printf("%d",pb->data); conid = 1; } else printf(" %d",pb->data); pb = pb->next; } }}int main(){ int T; scanf("%d",&T); for (int i=0;i<T;i++) { InitList(&LA); //创建链表头 InitList(&LB); //创建链表头 int n; scanf("%d",&n); CreateList_R(&LA,n); //读n个数据后接到链表 scanf("%d",&n); CreateList_R(&LB,n); //读n个数据后接到链表 printf("Case #%d:\n",i+1); Jiao(); printf("\n"); Bing(); printf("\n"); A_B(); printf("\n"); B_A(); printf("\n"); Clear(&LA); //清空数据 Clear(&LB); } return 0;}
0 0
- SDUST-OJ-1681 Problem 求集合的交并补集(不用STL,手写单链表实现)
- 数据结构(线性结构习题)Problem A: 求集合的交并补集
- 数据结构(线性结构习题)Problem A: 求集合的交并补集
- 单链表ADT实现集合交并补
- c++实现集合的交并差集
- List的交并补集
- java 集合交并补
- 【JAVA】集合交并补
- POJ 3225-线段树求区间或集合的交并补、异或
- 集合的交并差用HashSet实现
- 顺序表求集合交并——C++实现
- 两个集合的交并集等
- C++集合的模板类 交并集
- 集合的交并运算
- SDUST-OJ-1682 Problem 击鼓传花
- 【Java】两个ArrayList之间求交并补
- POJ 3225(线段树,区间的交并补操作)
- STL set之求交并差
- 手机页面 根据网页大小自动显示字体大小
- linux下部署tomcat项目
- SCALA学习笔记1--SCALA开发环境安装及验证
- mac 下终端访问文件出现“Permission Denied”解决方案
- Dialog对话框之自定义AlertDialog
- SDUST-OJ-1681 Problem 求集合的交并补集(不用STL,手写单链表实现)
- iOS项目上传到AppStore步骤流程
- 数据库 事务回滚实例(C#)
- iOS开发004 怎样在Swift中使用CocoaPods
- 排除jar包冲突的三板斧
- Android WebView不能执行Ajax的解决办法
- java Socket 一个服务器与多个客户端进行通信
- C# Form之间传递数据(ShowDialog类型)
- sphinx 文档,思路,方法 整理