数据结构——顺序(升序)链表(增加,删除,集合的并,交,差)
来源:互联网 发布:sketch windows 编辑:程序博客网 时间:2024/06/07 23:08
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集合中的元素链入LC103 pa = pa->link; //循链LA104 if(pa->data == pb->data)//LA集合元素与LB元素相等105 pb = pb->link;//循链LB106 }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;//循链LB113 }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 else147 pa = pa->link;148 }149 else150 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 else181 {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<<"存储分配失败!\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 }
阅读全文
0 0
- 数据结构——顺序(升序)链表(增加,删除,集合的并,交,差)
- 集合的并、交、差
- 集合的交、并、差的实现
- 集合的交、并、差的实现
- 集合的交 并 差 补 运算
- 集合的交、并、差运算
- 集合的并、交和差运算
- 集合交、并、差运算
- multiset集合容器的集合运算:并、交、差
- 集合的并、交和差运算的程序
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- C语言实现集合的交,并,差
- C语言实现集合的交,并,差
- SQLServer数据集合的交、并、差集运算
- SQLServer数据集合的交、并、差集运算
- SQLServer数据集合的交、并、差集运算
- SQLServer数据集合的交、并、差集运算
- Java中对集合的并,交,联集,差操作
- git 使用 meld 解决冲突文件
- named.conf 详解
- 学生信息管理系统总结(二)
- 测试用例是什么?
- spring简介
- 数据结构——顺序(升序)链表(增加,删除,集合的并,交,差)
- 1017. A除以B (20)
- VC6.0——(应用程序无法正常启动0xc0000142)
- 数学建模专栏 | 第十一篇:MATLAB CUMCM真题求解实例二:优化型
- 顺序表的初始化、插入、删除
- DNS BIND之recursion递归
- js各种宽高的总结
- python的五大数据类型
- AutoCAD 2018 64位/32位 简体中文免费版