单链表求集合交并

来源:互联网 发布:阿里云短信验证码模板 编辑:程序博客网 时间:2024/04/26 14:27
#include<iostream>#include<malloc.h>using namespace std;typedef int DataType;/*定义链表数据结构*/typedef struct node{DataType data;struct node * next;}LNode,* LinkList;int main(){/*函数声明*/LinkList Tail_Create_LinkList();/*尾插法-创建链表*/int length(LinkList H);/*求单链表长度*/LinkList Locate_LinkList_Value(LinkList H,DataType x);/*查找单链表中数值为x的节点*/LinkList Locate_LinkList_Pos(LinkList H,int i);/*查找单链表中的第i个节点*/void Insert_LinkList(LinkList H,int i,DataType x);/*在链表第i个元素前插入值x*/void Show(LinkList H);/*输出链表*/LinkList CCopy_LinkList(LinkList H);/*单链表的复制*/void Inter_sec(LinkList A,LinkList B);/*求交集*/void Merge_sec(LinkList A,LinkList B);/*求并集*/void Destory_LinkList(LinkList * H);/*销毁单链表*/LinkList A=Tail_Create_LinkList();LinkList B=Tail_Create_LinkList();cout<<"\n\n两链表的交集为:";Inter_sec(CCopy_LinkList(A),CCopy_LinkList(B));cout<<"\n\n两链表的并集为:";Merge_sec(CCopy_LinkList(A),CCopy_LinkList(B));/*销毁单链表*/Destory_LinkList(&A);Destory_LinkList(&B);return 0;}/*尾插法-创建链表*/LinkList Tail_Create_LinkList(){/*建一个空表*/LinkList H;H=(LinkList)malloc(sizeof(LNode));if(!H){cout<<"申请空间失败!";return 0;}H->next=NULL;cout<<"输入单链表元素(负数结束):";LinkList p,r;p=r=(LinkList)malloc(sizeof(LNode));//利用malloc ( )函数向系统申请分配一个节点cin>>p->data;//输入节点的值p->next=NULL;//将新节点的指针置为空while(p->data>=0){//输入节点的数值大于0if(!H->next)H->next=p;//空表,接入表头elser->next=p;r=p;p=(LinkList)malloc(sizeof(LNode));//下一个新节点cin>>p->data;p->next=NULL;}return H;//返回链表的头指针}/*求单链表长度*/int length(LinkList H){LinkList p=H;int count=-1;//H带头结点,从-1开始while(p){p=p->next;count++;}return count;}/*查找单链表中数值为x的节点*/LinkList Locate_LinkList_Value(LinkList H,DataType x){LinkList p=H->next;while(p && p->data!=x){p=p->next;}return p;}/*查找单链表中的第i个节点*/LinkList Locate_LinkList_Pos(LinkList H,int i){LinkList p=H;int j=0;while(p && j<i){//查找第i个节点p=p->next;j++;}if(j!=i || !p){cout<<"参数i错或单链表不存在!";return 0;}return p;}/*在链表第i个元素前插入值x*/void Insert_LinkList(LinkList H,int i,DataType x){LinkList p,q;p=Locate_LinkList_Pos(H,i-1);//寻找第i-1个节点if(!p){cout<<"插入位置有误!";return;}q=(LinkList)malloc(sizeof(LNode));if(!q){cout<<"申请空间失败!";return;}q->data=x;q->next=p->next;//新节点插在第i-1个节点的后面p->next=q;}/*输出链表*/void Show(LinkList H){LinkList p=H->next;//取得链表第一个元素的指针while(p){//只要是非空表cout<<p->data<<" ";//输出链表节点的值p=p->next;//跟踪链表增长}}/*单链表的复制*/LinkList CCopy_LinkList(LinkList H){LinkList G;G=(LinkList)malloc(sizeof(LNode));if(!G){cout<<"申请空间失败!";return 0;}G->next=NULL;LinkList p,r,h=H->next;r=(LinkList)malloc(sizeof(LNode));//利用malloc ( )函数向系统申请分配一个节点while(h){p=(LinkList)malloc(sizeof(LNode));//下一个新节点p->data=h->data;p->next=NULL;if(!G->next)G->next=p;//空表,接入表头elser->next=p;//非空,接入表尾r=p;h=h->next;//再取链表的下一个节点}return G;}/*集合A与B的交集*/void Inter_sec(LinkList A,LinkList B){LinkList H=A;LinkList p=H->next;while(p){if(!Locate_LinkList_Value(B,p->data)){//集合B中没有xH->next=p->next;free(p);//删除该结点,考察下一个结点p=H->next;}else{H=p;p=p->next;//考察下一个结点}}Show(A);}/*求集合A与B的并集*/void Merge_sec(LinkList A,LinkList B){LinkList p=B->next;while(p){if(!Locate_LinkList_Value(A,p->data)){//集合A中没有xInsert_LinkList(A,1,p->data);//将集合A中没有的元素加入到集合A中}p=p->next;}Show(A);}/*销毁单链表*/void Destory_LinkList(LinkList * H){/*销毁后单链表的头指针变为空指针,所以要将头指针的地址作为形参*/LinkList p,q;p=* H;while(p){//释放单链表的所有节点q=p;p=p->next;free(q);}* H=NULL;}

0 0
原创粉丝点击