• 用链表实现集合


    用链表来表示集合时,链表的中的每个项表示集合的一个成员,表示集合的链表所占用的空间正比于所表示的集合的大小,而不是正比于全集合的大小,因此,链表可以表示无穷全集合的子集。

    链表分为无序链表和有序链表两种类型。

    以下为有序链表实现代码:

     1 typedef struct node *link;
     2 struct node
     3 {
     4     int data;//有序链表的结点类型Node
     5     link next;
     6 }Node;
     7 
     8 typedef struct list *Set;
     9 struct list 
    10 {
    11     link first;//指向第一个元素的指针
    12 }LIst;
    13 
    14 //建立一个空集合
    15 Set SetInit()
    16 {
    17     Set S=malloc(sizeof*S);
    18     S->first=0;
    19     return S;
    20 }
    21 
    22 //判断集合S是否为空
    23 int SetEmpty(Set S)
    24 {
    25     return S->first==0;
    26 }
    27 
    28 //返回集合S的大小
    29 int SetSize(Set S)
    30 {
    31     int len;
    32     link current;
    33     current=S->first;
    34     len=0;
    35     while(current!=NULL)
    36     {
    37         len++;
    38         current=current->next;
    39     }
    40 }
    41 
    42 //实现交集运算
    43 Set SetIntersection(Set A,Set B)
    44 {
    45     link a,b,p,q,r;
    46     Set tmp=SetInit();
    47     a=A->first;
    48     b=B->first;
    49     p=(link)malloc(sizeof(Node));
    50     q=p;
    51     while(a&&b)
    52     {
    53         if(a->data==b->data)
    54         {
    55             r=(link)malloc(sizeof(Node));
    56             r->data=a->data;
    57             r->next=0;
    58             p->next=r;
    59             p=r;
    60             a=a->next;
    61             b=b->next;
    62         }
    63         else if(a->data<b->data)
    64             a=a->next;
    65         else
    66             b=b->next;
    67     }
    68     if(p!=q)
    69         tmp->first=q->next;
    70     return tmp;
    71 }
    72 //插入元素x
    73 void SetInsert(int x,Set S)
    74 {
    75     link p,q,r;
    76     p=S->first;
    77     q=p;
    78     while(p&&p->data<x)//找插入结点位置
    79     {
    80         q=p;
    81         p=p->next;
    82     }
    83     if(p&&p->data==x)
    84         return ;
    85     r=(link)malloc(sizeof(Node));
    86     r->data=x;
    87     r->next=0;
    88     if(p==q)//恰好在头结点
    89         S->first=r;
    90     else
    91         q->next=r;
    92 
    93 
    94 }
    View Code
  • 相关阅读:
    自动化基础知识
    第一章Google软件测试介绍
    《将博客搬至CSDN》
    二叉树的先序遍历和中序遍历分析(递归)
    java 部分快捷功能
    toString
    自增自减运算符剖析
    二进制数的直接表示
    编程中的&&和||
    npm 镜像地址设置
  • 原文地址:https://www.cnblogs.com/zeze/p/Bitsit.html
Copyright © 2020-2023  润新知