实现算法2.17的程序

来源:互联网 发布:windows vista32位下载 编辑:程序博客网 时间:2024/05/16 07:48
// algo2-8.cpp 实现算法2.17的程序#include"c1.h"#define N 2typedef char ElemType;#include"c2-3.h"#include"func2-2.cpp"#include"bo2-32.cpp"#include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数void difference(SLinkList space,int &S) // 算法2.17{ // 依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)∪(B-A)// 的静态链表,S为其头指针。假设备用空间足够大,space[0].cur为备用空间的头指针int r,p,m,n,i,j,k;ElemType b;InitSpace(space); // 初始化备用空间S=Malloc(space); // 生成S的头结点r=S; // r指向S的当前最后结点printf("请输入集合A和B的元素个数m,n:");scanf("%d,%d%*c",&m,&n); // %*c吃掉回车符printf("请输入集合A的元素(共%d个):",m);for(j=1;j<=m;j++) // 建立集合A的链表{i=Malloc(space); // 分配结点scanf("%c",&space[i].data); // 输入A的元素值space[r].cur=i; // 插入到表尾r=i;}scanf("%*c"); // %*c吃掉回车符space[r].cur=0; // 尾结点的指针为空printf("请输入集合B的元素(共%d个):",n);for(j=1;j<=n;j++){ // 依次输入B的元素,若不在当前表中,则插入;否则删除scanf("%c",&b);p=S;k=space[S].cur; // k指向集合A中的第一个结点while(k!=space[r].cur&&space[k].data!=b){ // 在当前表中查找p=k;k=space[k].cur;}if(k==space[r].cur){ // 当前表中不存在该元素,插入在r所指结点之后,且r的位置不变i=Malloc(space);space[i].data=b;space[i].cur=space[r].cur;space[r].cur=i;}else // 该元素已在表中,删除之{space[p].cur=space[k].cur;Free(space,k);if(r==k)r=p; // 若删除的是尾元素,则需修改尾指针}}}void main(){int k;SLinkList s;difference(s,k);ListTraverse(s,k,print2);}

运行结果如下:


// algo2-9.cpp 尽量采用bo2-31.cpp中的基本操作实现算法2.17的功能#include"c1.h"#define N 2typedef char ElemType;#include"c2-3.h"#include"func2-2.cpp"#include"bo2-31.cpp"#include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数void difference(SLinkList space) // 改进算法2.17(尽量利用基本操作实现){ // 依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)∪(B-A)的静态链表int m,n,i,j;ElemType b,c;InitList(space); // 构造空链表printf("请输入集合A和B的元素个数m,n:");scanf("%d,%d%*c",&m,&n); // %*c吃掉回车符printf("请输入集合A的元素(共%d个):",m);for(j=1;j<=m;j++) // 建立集合A的链表{scanf("%c",&b); // 输入A的元素值ListInsert(space,1,b); // 插入到表头}scanf("%*c"); // 吃掉回车符printf("请输入集合B的元素(共%d个):",n);for(j=1;j<=n;j++){ // 依次输入B的元素,若不在当前表中,则插入;否则删除scanf("%c",&b);for(i=1;i<=ListLength(space);i++){GetElem(space,i,c); // 依次求得表中第i个元素的值,并将其赋给cif(c==b) // 表中存在b,且其是第i个元素{ListDelete(space,i,c); // 删除第i个元素break; // 跳出i循环}}if(i>ListLength(space)) // 表中不存在bListInsert(space,1,b); // 将b插在表头}}void main(){SLinkList s;difference(s);ListTraverse(s,print2);}

运行结果如下:


/*algo2-9.cpp 是用静态链表的基本操作来实现算法2.17 功能的。由于只用到1 个链表,故采用bo2-31.cpp 中的基本操作;又由于集合是与顺序无关的,而链表的插入以插在表头效率最高,故在algo2-9.cpp 中插入元素时均插在表头。这只影响集合中元素的输出顺序。将algo2-9.cpp 与algo2-8.cpp 对比可见,采用基本操作可使程序简洁明了,思路清晰,因此在编程时应尽量采用已有的基本操作,以提高效率*/


0 0
原创粉丝点击