博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有序单链表的(交、并、差)运算
阅读量:5346 次
发布时间:2019-06-15

本文共 2537 字,大约阅读时间需要 8 分钟。

#include "stdafx.h"#include "malloc.h"typedef struct Node{	char data;	Node *next;}List;
// 创建单链表void CreateList(List *&L, char a[], int n){	List *s,*r;	L = (List *)malloc(sizeof(List));	L->next = NULL;	r = L;	for (int i = 0; i < n; i++)	{		s = (List *)malloc(sizeof(List));		s->data = a[i];		r->next = s;		r = s;	}	r->next = NULL;}
// 使用了排序算法中的插入排序void Sort(List *&head){	List *p = head->next, *q, *r; // p指向第一个节点	if(p!=NULL)	{		r = p->next; // r指向第二个节点		p->next = NULL; // p的后继节点为NULL		p = r; // p指向第一个节点		while (p!=NULL)		{			r = p->next; 			q = head;			while (q->next!=NULL &&q->next->data
data) { q = q->next; } p->next = q->next; q->next = p; p = r; } }}// 求两个集合并集void Union(List *La, List *Lb, List *&Lc){ List *la = La->next, *lb = Lb->next,*tc,*s; Lc = (List *)malloc(sizeof(List)); tc = Lc; // 在进行比较 if (la != NULL && lb != NULL) { while (la != NULL && lb != NULL) { s = (List *)malloc(sizeof(List)); if (la->data > lb->data) { // la节点大于lb节点 s->data = lb->data; tc->next = s; tc = s; lb = lb->next; } else if(la->data
data) { // la节点小于lb节点 s->data = la->data; tc->next = s; tc = s; la = la->next; } else { s->data = la->data; tc->next = s; tc = s; la = la->next; lb = lb->next; } } } // 剩余节点(la与lb必定有一个是NULL) if (lb != NULL) { la = lb; } while (la!=NULL) { s = (List *)malloc(sizeof(List)); s->data = la->data; tc->next = s; tc = s; la = la->next; } tc->next = NULL;}// 求两个集合的并集void InterSect(List *La, List *Lb, List *&Lc){ List *la = La->next, *lb,*tc, *s; Lc = (List *)malloc(sizeof(List)); tc = Lc; while (la!=NULL) { lb = Lb->next; // 根据链表为有序链表过滤一部分比较节点 while (lb!=NULL && lb->data
data) { lb = lb->next; } if (lb != NULL && lb->data == la->data) { s = (List *)malloc(sizeof(List)); s->data = la->data; tc->next = s; tc = s; } la = la->next; } tc->next = NULL;}// 求差集,即a-b,去掉a链表中与b链表的交集void Subs(List *La, List *Lb, List *&Lc){ List *la = La->next, *lb, *tc, *s; Lc = (List *)malloc(sizeof(List)); tc = Lc; while (la!=NULL) { lb = Lb->next; // 根据链表为有序链表过滤一部分比较节点 while (lb!=NULL && lb->data
data) { lb = lb->next; } // 去掉Lb链表与La链表的交集部分 if (!(lb != NULL &&la->data == lb->data)) { s = (List *)malloc(sizeof(List)); s->data = la->data; tc->next = s; tc = s; } la = la->next; } tc->next = NULL;}

  1、使用单链表对集合进行交、并、差的运算,重点在于对单链表进行排序,排序后的单链表在进行运算,可以减少节点的比较优化时间复杂度。

转载于:https://www.cnblogs.com/tuqunfu/p/10264474.html

你可能感兴趣的文章
多校HDU5723 最小生成树+dfs回溯
查看>>
ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页
查看>>
关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
查看>>
关于Entity Framework中的Attached报错的完美解决方案终极版
查看>>
Selenium之Web页面滚动条滚操作
查看>>
组合数据类型练习,英文词频统计实例上
查看>>
Uber回馈开源的一些软件
查看>>
day 3 修改haproxy.cfg 作业
查看>>
UIScrollView —— 缩放实现案例(二)
查看>>
【Qt】Qt Linguist介绍【转】
查看>>
sim usim Uim 区别
查看>>
网页中插入透明Flash的方法和技巧
查看>>
动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
查看>>
获取元素属性get_attribute
查看>>
视觉设计师的进化
查看>>
Python/jquery
查看>>
WPF之Binding
查看>>
【BZOJ】【2132】圈地计划
查看>>
Delphi 中big5 转 Unicode 函数
查看>>
ThreadLocal
查看>>