集合分可分为有序集合和无序集合,可以分别用有序链表和无序链表进行表示。

以下用有序链表表示有序集合。

  • 集合的结构定义
 1 /*链表中的结点定义*/
 2 typedef struct node
 3 {
 4     ListItem element;
 5     link next;
 6 }Node, *link;
 7 
 8 /*集合定义*/
 9 typedef struct list
10 {
11     link frist;        //指向第一个元素的指针
12 }List,*Set;

 

  • 相关操作
  1 /*创建一个空集合*/
  2 Set SetInit()
  3 {
  4     Set S = new List;
  5     S->frist = NULL;
  6     return S;
  7 }
  8 
  9 /*判断一个集合是否为空*/
 10 int SetEmpty(Set S)
 11 {
 12     return S->frist == NULL;
 13 }
 14 
 15 /*SetSize(S)返回集合S的大小*/
 16 int SetSize(Set S)
 17 {
 18     int len;
 19     link curren = S->frist;
 20     len = 0;
 21     while (curren)
 22     {
 23         len++;
 24         curren = curren->next;
 25     }
 26     return len;
 27 }
 28 
 29 /*SetAssign(A,B)用集合B给集合A赋值,不能简单的将A->first指向B的first指针指向单元*/
 30 void SetAssign(Set A, Set B)
 31 {
 32     link a, b, c;
 33     b = B->frist;
 34     A->frist = NULL;
 35     if (b)
 36     {
 37         A->frist = new Node;
 38         a = A->frist;
 39         a->element = b->element;
 40         a->next = NULL;
 41         b = b->next;
 42     }
 43     while (b)
 44     {
 45         c = new Node;
 46         c->element = b->element;
 47         c->next = NULL;
 48         b = b->next;
 49         a->next = c;
 50         a = c;
 51     }
 52 }
 53 
 54 /*SetIntersection(A,B)通过遍历集合A和B的链表来实现交集*/
 55 Set SetIntersection(Set A, Set B)
 56 {
 57     link a, b, p, q, r;
 58     Set tmp = SetInit();    //创建一个临时集合
 59     a = A->frist;
 60     b = B->frist;
 61     p = new Node;
 62     q = p;
 63     while (a&&b)
 64     {
 65         if (a->element == b->element)
 66         {
 67             r = new Node;
 68             r->element = a->element;
 69             r->next = NULL;
 70             p->next = r;
 71             p = r;
 72             a = a->next;
 73             b = b->next;
 74         }
 75         else if (a->element < b->element)
 76             a = a->next;
 77         else
 78             b = b->next;
 79     }
 80     if (p != q)    //p==q,此时集合无交集
 81         tmp->frist = q->next;
 82     delete q;
 83     return tmp;
 84 }
 85 
 86 /*SetInsert(x,S)将元素x插入到集合S中*/
 87 void SetInsert(ListItem x, Set S)
 88 {
 89     link p, q, r;
 90     p = S->frist;
 91     q = p;
 92     while (p&&p->element<x)
 93     {
 94         q = p;
 95         p = p->next;
 96     }
 97     if (p&&p->element == x)
 98         return;
 99     r = new Node();
100     r->element = x;
101     r->next = p;
102     if (p == q)
103         S->frist = r;
104     else
105         q->next = r;
106 }