IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表求差集 -> 正文阅读

[数据结构与算法]单链表求差集

/*时间:2021年10月6日
  版本:Dve-C++ 5.11
  问题描述:以单链表表示集合,假设集合A用单链表LA表示,
  集合B用单链表LB表示,设计算法求两个集合的差,即A-B。*/ 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>     
#include<math.h>
#include<time.h> 

#define OK 1;
#define ERROR 0;

#define MAXSIZE 100;

typedef int Status;
typedef int ElemType;

Status visit(ElemType c){
	printf("%d",c);
	return OK;
}

//声明链表 、定义链表  
typedef struct Node{
	ElemType data;			/*数据域*/ 
	struct Node *next;		/*指针域*/ 
}Node,*LinkList;

//初始化链表 
Status InitList(LinkList*L) { 
    *L=(LinkList)malloc(sizeof(Node)); 			/*产生头结点,并使L指向此头结点*/
    if(!(*L)) 									/*存储分配失败*/
        return ERROR;
    (*L)->next=NULL;							/*指针指向空*/

    return OK;
}

//操作结果:返回L中数据元素个数 
int ListLength(LinkList L){
    int i=0;
    LinkList p=L->next; 						/*p指向第一个结点*/
    while(p){
        p=p->next;								/*p 指向下一个结点*/
        i++;
    }
    return i;
}
//获取元素,用e返回L中第i个数据元素的值 
Status GetElem(LinkList L,int i,ElemType *e){
	int j;
	LinkList p;								/*声明一个结点p指向链表L的第一个结点*/ 
	p=L->next;				
	j=0;									/*用来存放单链表的长度*/ 
	while(p&&j<i){ 					    	/*p遍历到i-1*/   
		p=p->next;  
		j++;
	}
	if(!p||j>i ) 
		return ERROR; 
	*e=p->data;  							 /*取第i个元素的数据*/
	return OK;
}
//返回L中第1个与e满足关系的数据元素的位序
int LocateElem(LinkList L,ElemType e){
    int i=0;
    LinkList p=L->next;
    while(p){
        i++;
        if(p->data==e)
			return i;
        p=p->next;
    }
    return 0;								/*若这个数据元素不存在,返回值为0*/
}
//删除链表L中的数据元素,删除第i个数据元素,链表L的元素个数减一 
Status ListDelete(LinkList *L,int i,ElemType *e){ 
	int j;
	LinkList p,q;
	p=*L;
	j=0;
	while(p->next&&j<i){				/*遍历链表,寻找第i个元素*/
        p = p->next;
        j++;
	}
	if(!(p->next)||j>i) 
	    return ERROR;          
	q=p->next;
	p->next=q->next;					/*将p的后继结点赋值给q的后继结点*/
	*e=q->data;               		    /*将q的数据域赋值给e*/ 
	free(q);                   			/*释放q*/
	return OK;
}
//输出链表L的数据元素 
Status ListTraverse(LinkList L){
    LinkList p=L->next;
    while(p){
        visit(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}
//尾插法创建单链表 
void CreateListTail(LinkList*L,int n) {
	LinkList p,r;
	int i,e;
	*L=(LinkList)malloc(sizeof(Node)); 
	r=*L;                               
	for(i=0;i<n;i++){
		p=(Node*)malloc(sizeof(Node)); 
		printf("请输入创建链表的一个数据元素:");
		scanf("%d",&e);
		p->data=e;        
		r->next=p;                       		 /*将尾结点的指针指向新结点 */
		r=p;                           		     /*将当前的新结点定义为新的尾结点*/
	}
	r->next = NULL;
}
//求两个集合的差集 
void Difference(LinkList LA,LinkList LB){
	LinkList pre,p,q,r;
	pre=LA;
	p=LA->next;				/*p指向LA表中的某一结点,而pre始终指向p的前驱结点*/
	while(p!=NULL){
		q=LB->next;
		while(q!=NULL&&q->data!=p->data)
			q=q->next;
		if(q!=NULL){
			r=p;
			pre->next=p->next;
			p=p->next;
			free(r);
		}
		else{
			pre=p;
			p=p->next;
		}
	} 
}

int main(){
	LinkList LA;
	LinkList LB;
	
	InitList(&LA);
	InitList(&LB);
	
	printf("对于LA:\n");
	CreateListTail(&LA,5);
    printf("A:");
    ListTraverse(LA); 
    
   	printf("对于LB:\n");
    CreateListTail(&LB,6);
    printf("B:");
    ListTraverse(LB); 
    Difference(LA,LB);
	printf("A-B:");
	ListTraverse(LA);
    return 0;
}

集合的差A-B中包含所有属于A而不属于集合B的元素。

对于集合A中的每一个元素e,在集合B的链表LB中进行查找,若存在与e相同的元素,则总LA中将其删除。

  1. 算法设计
  1. Init()用来初始化链表;
  2. CreatFromTail()用尾插法来创建链表;
  3. Difference()函数用来求两个集合的差;
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 14:04:31  更:2021-10-07 14:07:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:46:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码