• 求集合的并,交,差集合(有序单链表的实践)


      //说实话我把差集想的太复杂了  考虑了许多没用的

      //最后却用了一种简单的方法解决了

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    typedef struct node
    {
    //char data;
    // int count;
    int data;
    struct node *next;
    } lnode,*linklist;

    linklist creat()
    {
    linklist l,p,r,s;
    int n;
    int i;
    //char d,temp;
    l=(linklist)malloc(sizeof(lnode));
    // l->count=0;
    if( l==NULL)
    {
    printf("内存分配失败");
    exit(-1);
    }
    l->next=NULL;
    p=l;
    printf("请输入链表值的个数:");
    scanf("%d",&n);
    printf("请依次输入链表的值:");
    for(i=0;i<n;i++)
    {
    s=(linklist)malloc(sizeof(lnode));
    if( s==NULL)
    {
    printf("内存分配失败");
    exit(-1);
    }
    // s->count++;
    scanf("%d",&s->data);
    p->next=s;
    s->next=NULL;
    p=s;
    }
    return l;

    }

    int empty(linklist l)
    {
    if(l->next==NULL)
    {
    printf("空");
    return 1;
    }
    else
    return 0;

    }
    void tra(linklist l)
    {
    linklist p;
    p=l->next;
    while(p)
    {
    // printf("%c ",p->data);
    printf("%d ",p->data);
    p=p->next;
    }
    printf(" ");

    }

    int len(linklist l)
    {
    linklist p;
    int j=0;
    p=l->next;
    while(p)
    {
    // printf("%c ",p->data);
    j++;
    p=p->next;
    }
    return j;
    }
    int sort(linklist l)
    {
    linklist p,q;
    int i,j;
    int temp;
    for(i=0,p=l->next;i<len(l)-1;i++,p=p->next)//记住不要写p->count 因为p->count==1
    {
    for(j=i+1,q=p->next;j<len(l);j++,q=q->next)

    if(p->data > q->data)
    {
    temp=q->data;
    q->data=p->data;
    p->data=temp;
    }
    }
    return 1;
    }


    void bing(linklist l,linklist p)//q始终连接小的值 如果有一个表中元素已经都比较过则将q指向到别的表的剩余元素
    {
    linklist r,s,t,q;
    t=(linklist)malloc(sizeof(lnode));
    t->next=NULL;
    q=t;
    r=l->next;
    s=p->next;
    while(r!=NULL&&s!=NULL)
    {
    if(r->data < s->data)
    {
    q->next=r;
    q=r;
    r=r->next;
    }

    else
    {
    q->next=s;
    q=s;
    s=s->next;
    }


    }
    if(r==NULL)
    {
    q->next=s;
    }
    else if(s==NULL)
    {
    q->next=r;
    }

    sort(t);
    printf("并集的结果");
    tra(t);

    }

    void jiao(linklist l,linklist p)//元素相等则让q指向随表一个表中的相等元素的位置 记得指向后将q指针置空,否则会输出那个表的剩余元素
    { linklist r,s,t,q;
    t=(linklist)malloc(sizeof(lnode));
    t->next=NULL;
    q=t;
    r=l->next;
    s=p->next;
    while(r!=NULL&&s!=NULL)
    {
    if(r->data < s->data)
    {
    r=r->next;
    }

    else if(r->data == s->data)
    {
    q->next=s;
    q=s;
    q->next=NULL;
    r=r->next;
    s=s->next;
    }
    else
    {
    s=s->next;
    }



    }

    sort(t);
    printf("交集的结果");
    tra(t);

    }
    void cha(linklist l,linklist p)//差集c=a-b 有a集合的元素,无b中的元素
    { //有相等的元素就新建一个节点,并将r的值赋给他
    linklist r,s,t,q,q1;
    t=(linklist)malloc(sizeof(lnode));
    t->next=NULL;
    q=t;
    r=l->next;
    s=p->next;
    while(r!=NULL)
    {
    if(r->data < s->data)
    { q1=(linklist)malloc(sizeof(lnode));
    q1->data=r->data;
    q->next=q1;
    q=q1;
    r=r->next;
    }
    else if(r->data > s->data)
    {
    q1=(linklist)malloc(sizeof(lnode));
    q1->data=r->data;
    q->next=q1;
    q=q1;
    s=s->next;

    }
    else { //考虑l表中的最后三位

    r=r->next;
    s=s->next;
    }

    }

    q1->next=NULL;
    sort(t);
    printf("请输出表一的差集(l-p)");
    tra(t);
    }
    int main()
    {
    linklist l,s,p,r,q;
    int i,j,k;
    printf("链表1 ");
    l=creat();
    sort(l);
    tra(l);
    printf("链表2 ");
    p=creat();
    sort(p);
    tra(p);
    printf("请输入操作:0-2 ");
    scanf("%d",&k);
    switch(k)
    {
    case 0 :bing(l,p);break;
    case 1 :jiao(l,p);break;
    case 2 :cha(l,p);break;
    default :printf("选错了"); break;
    }


    //bing(l,p);
    //jiao(l,p);
    //cha(l,p);
    return 0;
    }

  • 相关阅读:
    IIS代理
    NODEJS
    js图表插件
    注册nodejs程序为windows服务
    中断子系统7_中断出口处理
    Leetcode: Sort List
    jquery 鼠标经过放大图片
    在Tomcat上运行ADF Essentials应用
    简谈HTML5与APP技术应用
    Boost的Serialization和SmartPoint搭配使用
  • 原文地址:https://www.cnblogs.com/mykonons/p/5887334.html
Copyright © 2020-2023  润新知