zoukankan      html  css  js  c++  java
  • 数据结构——求集合(单链表)的并、交和差运算:

    求集合(用单链表表示)的并、交和差运算:
    问题描述:该算法的设计,要求运行结果如下所示:
    (包含三种排序)

    集合的运算如下:
    原 集 合A: c a e h
    原 集 合B: f h b g d a
    有序集合A: a c e h
    有序集合B: a b d f g h
    集合的并C: a b c d e f g h
    集合的交C: a h
    集合的差C: c e

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define OK 1
    
    typedef char elemtype;
    typedef int  Status;
    
    typedef struct LNode {
    	elemtype data;
    	struct LNode *next;
    } LNode,*LinkList;
    
    Status InitList(LinkList &L) {
    	L=(LinkList)malloc(sizeof(LNode));
    	if(!L)  exit(-1);
    	L->next=NULL;
    	return OK;
    }
    
    Status ListInsert_L(LinkList &L,int i,elemtype e) {
    	LinkList p=L,q;
    	int j=0;
    	for(; p&&j<i-1; j++)
    		p=p->next;
    	if(p&&j>i-1)  return -1;
    	q=(LinkList)malloc(sizeof(LNode));
    	q->data=e;
    	q->next=p->next;
    	p->next=q;
    }
    
    Status ListPritnt_L(LinkList &L) {
    	LinkList p=L;
    	for(p=p->next; p; p=p->next) {
    		printf("%c ",p->data);
    	}
    	printf("
    ");
    }
    
    Status ListLength(LinkList &L) {
    	int i=0;
    	LinkList p=L->next;
    	while(p) {
    		p=p->next;
    		i++;
    	}
    	return i;
    }
    
    Status ListSort_L1(LinkList &L) { //交换结点的冒泡排序
    	LinkList p,q,p_prior;
    	int i,j,n;
    	n=ListLength(L);
    	for(i=1; i<n; i++) {
    		p=L->next;
    		q=p->next;
    		p_prior=L;
    		for(j=0; j<n-i; j++) {
    			if((p->data)>(q->data)) {
    				p_prior->next=q;
    				p->next=q->next;
    				q->next=p;
    				//交换后的更新结点情况和没交换时不同
    				p_prior=q;
    				q=p->next;
    			} else {
    				p_prior=p;
    				p=q;
    				q=q->next;
    			}
    		}
    	}
    	p=q=p_prior=NULL;
    }
    
    Status ListSort_L2(LinkList &L) { //直接交换内部元素
    	LinkList p,q;
    	elemtype temp;
    	int i,j,n;
    	n=ListLength(L);
    	for(i=1; i<n; i++)
    		for(j=0,p=L->next,q=p->next; j<n-i; p=q,q=q->next,j++) {
    			if((p->data)>(q->data)) {
    				temp=p->data;
    				p->data=q->data;
    				q->data=temp;
    			}
    		}
    	p=q=NULL;
    }
    
    void BubbleSort(struct LNode * head) { 
    	//https://www.cnblogs.com/darkchii/p/7302412.html
    	struct LNode * p, * q, * tail;
    
    	tail = NULL;
    
    	while((head->next->next) != tail) {
    		p = head;
    		q = head->next;
    		while(q->next != tail) {
    			if((q->data) > (q->next->data)) {
    				p->next = q->next;
    				q->next = q->next->next;
    				p->next->next = q;
    				q = p->next;
    			}
    			q = q->next;
    			p = p->next;
    		}
    		tail = q;
    	}
    }
    
    LinkList ListMerge_L(LinkList &L1,LinkList &L2) { //L1,L2有序情况的合并
    	LinkList p=L1->next,q=L2->next;
    	LinkList L3;
    	int i=1;
    	InitList(L3);
    	while(p&&q) {
    		if(p->data<q->data) {
    			ListInsert_L(L3,i++,p->data);
    			p=p->next;
    		} else if(p->data==q->data) {
    			ListInsert_L(L3,i++,p->data);
    			p=p->next;
    			q=q->next;
    		} else {
    			ListInsert_L(L3,i++,q->data);
    			q=q->next;
    		}
    	}
    	while(p) {
    		ListInsert_L(L3,i++,p->data);
    		p=p->next;
    	}
    	while(q) {
    		ListInsert_L(L3,i++,q->data);
    		q=q->next;
    	}
    	return L3;
    }
    
    LinkList ListIntersect_L(LinkList &L1,LinkList &L2) {
    	LinkList p=L1->next,q=L2->next;
    	LinkList L;
    	int i=1,flag=0;
    	InitList(L);
    	while(p) {
    		while(q) {
    			if(p->data==q->data) {
    				flag=1;
    				break;
    			}
    			q=q->next;
    		}
    		if(flag) {
    		ListInsert_L(L,i++,q->data);
    		}
    		p=p->next;
    		q=L2->next;
    		flag=0;
    	}
    
        return L;
    }
    
    
    LinkList ListDifferent_L(LinkList &L1,LinkList &L2) {//就是把交运算改一下 
    	LinkList p=L1->next,q=L2->next;
    	LinkList L;
    	int i=1,flag=1;
    	InitList(L);
    	while(p) {
    		while(q){
    			if(p->data==q->data) {
    				flag=0;
    				break;
    			}
    			q=q->next;
    		}
    		if(flag) {
    		ListInsert_L(L,i++,p->data);
    		}
    		p=p->next;
    		q=L2->next;
    		flag=1;
    	}
        return L;
    }
    int main() {
    	elemtype A[10]= {'c','a','e','h'};
    	elemtype B[10]= {'f','h','b','g','d','a'};
    	int i;
    	LinkList head1,head2,head3,head4,head5;
    	InitList(head1);
    	InitList(head2);
    
    	for(i=0; A[i]; i++) {
    		ListInsert_L(head1,i+1,A[i]);
    	}
    	printf("原 集 合A:");
    	ListPritnt_L(head1);
    
    	for(i=0; B[i]; i++) {
    		ListInsert_L(head2,i+1,B[i]);
    	}
    	printf("原 集 合B:");
    	ListPritnt_L(head2);
    
    	ListSort_L1(head1);
    	ListSort_L2(head2);
    	printf("有序集合A:");
    	ListPritnt_L(head1);
    	printf("有序集合B:");
    	ListPritnt_L(head2);
    
    	head3=ListMerge_L(head1,head2);
    	printf("集合的并C:");
    	ListPritnt_L(head3);
    
    	head4=ListIntersect_L(head1,head2);
    	printf("集合的交C:");
    	ListPritnt_L(head4);
    	
    	head5=ListDifferent_L(head1,head2);
    	printf("集合的差C:");
    	ListPritnt_L(head5);	
    }
    
  • 相关阅读:
    [HAOI2010]软件安装
    「HNOI2015」菜肴制作
    [ZJOI2007] 小Q的矩阵游戏 (模板—Dinic)
    「POI2012」约会 Rendezvous
    [APIO2016]划艇
    [CQOI2011]放棋子
    【SDOI2015】bzoj3990 排序
    [bzoj2242] [SDOI2011]计算器
    模板—BSGS
    【BZOJ1227】[SDOI2009]虔诚的墓主人
  • 原文地址:https://www.cnblogs.com/vivid-victory/p/10090479.html
Copyright © 2011-2022 走看看