您的位置:首页 > 理论基础 > 数据结构算法

数据结构——顺序(升序)链表(增加,删除,集合的并,交,差)

2017-09-09 16:58 441 查看
1 //有序链表(升序)在一个有序链表中寻找一个集合成员(用有序链表表示集合,
2 //集合成员可以无限增加)
3
4 //基于有序链表表示集合的结构定义
5 typedef int DataType;//假定集合元素的数据类型为int型
6 typedef struct node//集合的结点定义
7 {
8     DataType data;//每个成员的数据
9     struct node *link;//链接指针
10 } SetNode;
11
12 typedef struct LinkSet//集合的定义
13 {
14     SetNode *first, *last;//表头、表尾指针
15 };
16
17
18 //集合的查找算法Contains是最常用的集合操作,它判断一个元素x是否存在于集合中。
19 //实际是,在一个有序链表中顺序检测过程:从链表首元结点开始,沿链表查找,直到找到这个元素或
20 //遇到大于这个元素的一个元素。若找到,则查找成功该元素在集合中;否则查找失败,元素不在此集合
21 SetNode *Contains(LinkSet& S, DataType x)
22 {//如果x是集合S的成员,则函数返回与x匹配的集合结点地址,否则返回NULL
23     SetNode *p = S.first->link;//链的扫描指针
24     while(p != NULL && p->data < x)//循链搜索
25         p=p->link;
26     if(p != NULL && p->data == x)//找到
27         return p;
28     else
29         return NULL;//未找到
30 }
31
32 //集合的插入指定算法。把一个新元素x插入集合中,算法先查找x插入位置。如果找到x则不能插入;
33 //否则插入在刚刚大于x的元素前面。这时必须用一个只真pre记忆p的前趋结点地址,
34 //新元素插入在pre与p中间
35
36 //集合addMember算法实现
37 int addMember(LinkSet& S, DataType x)
38 {
39 //把新元素x加入到集合之中。若集合中已有此元素,则函数返回0,否则函数返回1
40     SetNode *p = S.first->link;//p是扫描指针
41     SetNode *pre = S.first;//pre是p的前趋
42     while(p != NULL && p->data < x)//循链扫描
43     {
44         pre = p;
45         p = p->link;
46     }
47     if(p != NULL && p->data == x)//集合中已有此元素,不插入
48         return 0;
49     SetNode *q = new SetNode;//创建值为x的结点,用q指示
50     if(!q)
51     {cerr<<"存储分配失败!\n"; exit(1);}
52     q->data = x;//链入
53     q->link = p;//链入
54     pre->link = q;//链入
55     if(p == 0)//链到链尾时改链尾指针 if(!p)
56         S.last = q;
57     return 1;
58 }
59 //集合删除指定元素算法。先搜索删除结点位置。若未找到这个元素,则不能删除;否则将被删元素所在
60 //结点从链中摘下,需一个指针pre记忆p的前趋结点地址
61
62 //集合delMenber算法实现
63 int delMember(LinkSet& S, DataType x)
64 {//把集合中x元素删去。若集合不空且元素x在集合中,则函数返回true,否则返回0
65     SetNode *p = S.first->link;
66     SetNode *pre = S.first;
67     while(p != NULL && p->data < x)//循链扫描
68     {
69         pre = p;
70         p = p->link;
71     }
72     if(p != NULL && p->data == x)//找到,可以删除结点p
73     {
74         pre->link = p->link;//重新链接,从链上摘下p
75         if(p == S.last)//删去链尾时改链尾结点
76             S.last = pre;
77         delete p;//删除含x结点
78         return 1;//删除成功
79     }
80     else
81         return 0;//集合中无此元素,不能删除
82 }
83

83
84 //集合并运算‘ 合并两个有序链表并消除重复元素。
85 //需要对两个有序链表检测,当两个链表都未检测完时比较对应元素的值,把小的插
86 //入到结果链表中
87 //当其中有一个链表检测完时八零一个链表复制到结果链表中。
88
89 //集合Merge算法
90 void Merge(LinkList& LA, LinkList&LB, LinkSet& LC)
91 {//求集合LA与集合LB的并,结果通过LC返回,要求LC已存在且为空
92     SetNode *pa = LA.first->link;//LA集合链表扫描指针
93     SetNode *pb = LB.first->link;//LB集合链表扫描指针
94     SetNode *p, *pc = LC.first;//结果链表的存放指针
95     while(pa != NULL && pb != NULL)//两个集合都未检测完
96     {
97         if(pa->data <= pb->data)//LA集合中元素小或相等
98         {
99             pc->link = new SetNode;
100             if(!pc->link)
101             {cerr<<"存储分配失败!\n"; exit(1);}
102             pc->link->data = pa->data;//LA集合中的元素链入LC
103             pa = pa->link;    //循链LA
104             if(pa->data == pb->data)//LA集合元素与LB元素相等
105                 pb = pb->link;//循链LB
106         }
107         else//LB集合中元素值小
108         {
109             pc->link = new SetNode;
110             if(!pc->link){cerr<<"存储分配失败!\n"; exit(i);}
111             pc->link->data = pb->data;//LB集合中元素链入LC中
112             pb = pb->link;//循链LB
113         }
114         pc = pc->link;//LC循链指向下一个应存放的空间
115     }
116     p = (pa != NULL)? pa : pb;//处理未处理完的集合
117     while(p != NULL)         //向结果链表中逐个复制
118     {
119         pc->link = new SetNode;
120         if(!pc->link){cerr<<"存储分配失败!\n"; exit(i);}
121         pc->link->data = p->data;
122         pc = pc->link;
123         p = p->link;
124     }
125     pc->link = NULL;   //结果链表收尾
126     LC.last = pc;
127 }

128 //交运算
129 void Intersect(LinkList& LA, LinkList&LB, LinkSet& LC)
130 {
131     SetNode *pa = LA.first->link;//LA集合链表扫描指针
132     SetNode *pb = LB.first->link;//LA集合链表扫描指针
133     SetNode *pc = LC.first;
134     while(pa != NULL && pb != NULL)
135     {
136         if(pa->data <= pb->data)
137         {
138             if(pa->data == pb->data)
139             {
140                 pc->link = new SetNode;
141                 if(!pc->link){cerr<<"存储分配失败!\n"; exit(1);}
142                 pc->link->data = pa->data;
143                 pa = pa->link;
144                 pb = pb->link;
145             }
146             else
147                 pa = pa->link;
148         }
149         else
150             pb = pb->link;
151         pc = pc->link;
152     }
153     p = (pa == NULL) ? pa : pb;
154     while(p == NULL)
155     {
156         pc->link = NULL;
157         LC.last = pc;
158     }
159 }

160 //差运算
161 void SetDifference(LinkList& LA, LinkList&LB, LinkSet& LC)
162 {
163     SetNode *pa = LA.first->link;
164     SetNode *pb = LB.first->link;
165     SetNode *pc = LC.first;
166     while(pa != NULL && pb!= NULL)
167     {
168         if(pa->data < pb->data)
169         {
170             pc->link = new SetNode;
171             if(!pc->link){cerr<<"存储分配失败!\n"; exit(1);}
172             pc->link->data = pa->data;
173             pa = pa->link;
174         }
175         else if(pa->data == pb->data)
176         {
177             pa = pa->link;
178             pb = pb->link;
179         }
180         else
181         {
182             pc->link->data = pb->data;
183             pb = pb->link;
184         }
185         pc = pc->link;
186     }
187     p = (pa != NULL) ? pa : pb;
188     while(p != NULL)         //向结果链表中逐个复制
189     {
190         pc->link = new SetNode;
191         if(!pc->link){cerr<<"存储分配失
4000
败!\n"; exit(i);}
192         pc->link->data = p->data;
193         pc = pc->link;
194         p = p->link;
195      }
196     pc->link = NULL;   //结果链表收尾
197     LC.last = pc;
198 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构