
数据结构 集合的差运算 头文件也要
#include#include struct node { int x; struct node *next; }; typedef struct node node; typedef node *index; int n1,n2; \\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/ index fun(int n) { index head,q,p; int i; if (n==0) return NULL; else if (n>=1) { printf(输入元素集:); p=(index)malloc(sizeof(node)); scanf(%d,&p->x); head=q=p; if (n==1) {p->next=NULL;return head;} } for (i=1;ix); q->next=p; q=p; } q->next=NULL; return head; } \\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/ void f(index pa,index pb) { int bol,i=0; index t,head; if (n1>n2); else { t=pa; pa=pb; pb=t; } head=pb; while (pa!=NULL) { bol=1; pb=head; i++; while (pb!=NULL) { if (pa->x!=pb->x) bol=0; else {bol=1;break;} pb=pb->next; } if (bol==0) printf(集合之差元素有:%d\\\ ,pa->x); pa=pa->next; } printf(\\\ 程序结束!\\\ ); } void main() { node a,b; index pa,pb; printf(请输入集合a中元素个数:); scanf(%d,&n1); pa=fun(n1); printf(请输入集合b中元素个数:); scanf(%d,&n2); pb=fun(n2); if (pa!=NULL && pb!=NULL) f(pa,pb); else printf(元素某个为空!\\\ ); printf(\\\ ); }
如何将数据结构运用到实际的编程中去,那位高人有心得体会,不妨分享一下~~~
首先你要认识到数据结构是个什么东西,然后就自然就会用了哦
数据结构 用c语言写的 集合的并、交和差运算的程序
这是求并集的算法描述,链式结构实现的,参考一下算法描述LNode *Merge_LinkList(LNode *La, LNode *Lb) \\\/* 合并以La, Lb为头结点的两个有序单链表 *\\\/{ LNode*Lc, *pa , *pb, *pc, *ptr ;Lc=La; pc=La ; pa=La->next ; pb=Lb->next ; while (pa!=NULL && pb!=NULL) { if (pa->datadata) { pc->next=pa ; pc=pa ; pa=pa->next ; }\\\/* 将pa所指的结点合并,pa指向下一个结点 *\\\/if (pa->data>pb->data) { pc->next=pb; pc=pb ; pb=pb->next ; }\\\/* 将pa所指的结点合并,pa指向下一个结点 *\\\/if (pa->data==pb->data) { pc->next=pa ; pc=pa ; pa=pa->next ; ptr=pb; pb=pb->next; free(ptr); }\\\/* 将pa所指的结点合并,pb所指结点删除 *\\\/} if (pa!=NULL) pc->next=pa ;else pc->next=pb; \\\/*将剩余的结点链上*\\\/free(Lb) ;return(Lc) ;}
数据结构 集合的运算:交、并、补
有限自动机原理就搞定了
谁有数据结构课程设计集合交并运算啊
#include#include#includeusing namespace std;#define ElemType chartypedef struct ElemNode{ ElemType elem; struct ElemNode *next;}ElemNode, *Set;\\\/\\\/-------------FunctionList------------------------------\\\/\\\/---------------函数原型--------------------------------int LengthOf(Set src);\\\/\\\/返回一个集合的长度void CreateSet(Set dest);\\\/\\\/创建一个新的字母集合,限定a-zvoid EmptySet(Set dest);\\\/\\\/清空一个集合,保留头结点void DestroySet(Set dest);\\\/\\\/销毁集合void SortSet(Set dest);\\\/\\\/对一个集合进行从小到大的排序void DisplaySet(Set src);\\\/\\\/打印集合的所有元素int ExistElem(Set dest, ElemType e);\\\/\\\/判断元素是否存在于集合中void DelElem(Set dest, ElemType e);\\\/\\\/删除集合中的一个元素一次void AddElem(Set dest, ElemType e);\\\/\\\/在链表尾部追加一个元素void ContactSet(Set dest, Set src);\\\/\\\/连接一个集合到另一个集合void AddSet(Set dest, Set src1, Set src2);\\\/\\\/集合并运算void MulSet(Set dest, Set src1, Set src2);\\\/\\\/集合交运算void SubSet(Set dest, Set src1, Set src2);\\\/\\\/集合差运算int ExistSubset(Set dest, Set src);\\\/\\\/子集判断void NegSet(Set dest, Set src);\\\/\\\/求补集int main(){ Set dest=(Set)malloc(sizeof(ElemNode)); Set src1=(Set)malloc(sizeof(ElemNode)); Set src2=(Set)malloc(sizeof(ElemNode)); dest->next=NULL; cout<<输入两个集合:<集合并<< <<2->集合交<< <<3->集合差<< <<非零整数->错误
重输<< <<0->进入下一步演示<>item) { if(item) switch(item) { case 1: cout<<集合并运算:Set1∪Set2 = ; AddSet(dest, src1, src2); DisplaySet(dest); EmptySet(dest); cout<重输<>ch; AddElem(dest, ch); DisplaySet(dest); cout<>ch; DelElem(dest, ch); DisplaySet(dest);cout<next=NULL; NegSet(p, dest); DisplaySet(p); cout<next!=NULL) { i++; src=src->next; } return i;}\\\/\\\/LengthOfvoid CreateSet(Set dest){ \\\/\\\/创建一个新的字母集合,限定a-z ElemType ch; Set p=dest,n; for(;;) { ch=getchar(); if(ch=='\\\ ') break; if(ch<97||ch>122) continue; n=(Set)malloc(sizeof(ElemNode)); p->next=n; n->elem=ch; n->next=NULL; p=n; } return ;}\\\/\\\/CreateSetvoid EmptySet(Set dest){ \\\/\\\/清空一个集合,保留头结点 Set p,n; while(dest->next!=NULL) { p=dest; n=p->next; for(;n->next!=NULL;) { p=n; n=n->next; } free(n); p->next=NULL; }}\\\/\\\/EmptySetvoid DestroySet(Set dest){ \\\/\\\/销毁集合 EmptySet(dest); free(dest);}\\\/\\\/DestroySetvoid SortSet(Set dest){ \\\/\\\/对一个字母集合进行从小到大的排序 int i,j,l,flag; Set p,q,n; l=LengthOf(dest); if(l<2) return; flag=1; for(i=l-1;i>0&&flag==1;i--) { flag=0; p=dest; q=p->next; n=q->next; for(j=0;jelem>n->elem) { flag=1; p->next=n; q->next=n->next; n->next=q; q=p->next; n=q->next; } p=q; q=n; n=n->next; } }}\\\/\\\/SortSetvoid DisplaySet(Set src){ \\\/\\\/打印集合的所有元素 Set p; if(src->next==NULL) { printf(φ); return ; } p=src; do { p=p->next; putchar(p->elem); } while(p->next!=NULL);}\\\/\\\/DisplaySetint ExistElem(Set dest, ElemType e){ \\\/\\\/判断元素是否存在于集合中 Set p=dest; if(LengthOf(p)==0) return 0; else{ p=p->next; while(p->elem!=e) { if(p->next==NULL) return 0; p=p->next; } return 1; }}\\\/\\\/ExistElemvoid DelElem(Set dest, ElemType e){ \\\/\\\/删除集合中的一个元素一次 Set p=dest,q; if(LengthOf(p)==0) return ; q=p->next; if(LengthOf(p)==1) { p->next=NULL; free(q); } while(q->elem!=e) { p=p->next; q=q->next; } if(q->next==NULL) { p->next=NULL; free(q); } else p->next=q->next;}\\\/\\\/DelElemvoid AddElem(Set dest, ElemType e){ \\\/\\\/在链表尾部追加一个元素 Set p=dest, n; while(p->next!=NULL) p=p->next; n=(Set)malloc(sizeof(ElemNode)); p->next=n; n->elem=e; n->next=NULL;}\\\/\\\/AddElemvoid ContactSet(Set dest, Set src){ \\\/\\\/连接一个集合到另一个集合 Set p=dest; while(p->next!=NULL) p=p->next; p->next=src->next;}\\\/\\\/ContactSetvoid AddSet(Set dest, Set src1, Set src2){ \\\/\\\/集合并运算 SortSet(src1);SortSet(src2); int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2); src1=src1->next;src2=src2->next; while(ielem<=src2->elem) { i++; if(!ExistElem(dest, src1->elem)) { AddElem(dest, src1->elem); src1=src1->next; } else { src1=src1->next; } } else { j++; if(!ExistElem(dest, src2->elem)) { AddElem(dest, src2->elem); src2=src2->next; } else { src2=src2->next; } } } while(ielem)) { AddElem(dest, src1->elem); src1=src1->next; } } while(jelem)) { AddElem(dest, src2->elem); src2=src2->next; } }}\\\/\\\/AddSetvoid MulSet(Set dest, Set src1, Set src2){ \\\/\\\/集合交运算 SortSet(src1);SortSet(src2); int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2); src1=src1->next;src2=src2->next; while(ielemelem) {i++;src1=src1->next;} else if(src1->elem>src2->elem) {j++;src2=src2->next;} else { i++;j++; if(!ExistElem(dest, src1->elem)) { AddElem(dest, src1->elem); src1=src1->next; src2=src2->next; } } }}\\\/\\\/MulSetvoid SubSet(Set dest, Set src1, Set src2){ \\\/\\\/集合差运算 SortSet(src1);SortSet(src2); int i=0,len=LengthOf(src1); src1=src1->next; while(ielem)) { if(!ExistElem(dest, src1->elem)) { AddElem(dest, src1->elem); src1=src1->next; } } else { src1=src1->next; } }}\\\/\\\/SubSetint ExistSubset(Set dest, Set src){ \\\/\\\/子集判断 int i=0,len=LengthOf(src); src=src->next; while(ielem)) return 0; i++; src=src->next; } return 1;}\\\/\\\/ExistSubsetvoid NegSet(Set dest, Set src){ \\\/\\\/求补集 SortSet(src); int i=0; while(i<26) { if(!ExistElem(src, i+97)) AddElem(dest, i+97); i++; }}\\\/\\\/NegSet