链表 交并差

来源:互联网 发布:java弹球游戏 编辑:程序博客网 时间:2024/04/25 22:14
<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
#include<stdlib.h>#include <malloc.h>#define OK 1#define ERROR -1 #define TRUE 1typedef int ElemType;typedef int Status; typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList; //LNode和*LinkList;是与前面的typedef配合起来使用的                  //意思是给你声明的结构体起一个别名叫LNode,同时起一个指针别名叫LinkList,以后就可以用以下方式声明变量:                 //LNode a;声明了一个struct LNode型变量a,与写struct LNode a;等价                 //LinkList p;声明了一个struct LNode *型指针变量p,与写struct LNode *p等价void InitList(LinkList &L){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;}/*逆位序创建链表*/void CreatList_L1(LinkList &L)  {int i,n;LinkList p;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;printf("请输入元素个数:\n");scanf("%d",&n); for(i=n;i>0;i--){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}}//CreatList_L1/*正位序创建链表*/void CreatList_L2(LinkList &L){   int i,n;LinkList p,q;L=(LinkList)malloc(sizeof(LNode));L->next =NULL;q=L;printf("请输入元素个数:\n");scanf("%d",&n); for(i=n;i>0;i--){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);q->next = p; q=q->next;}p->next = NULL;}//CreatList_L2/*返回链表L的长度*/int ListLength(LinkList L){int i=0;LinkList p=L;while(p!=NULL){p=p->next;++i;}return i;}//ListLength/*在第i个位置插入元素e*/Status InsertList(LinkList &L,int i,ElemType e){LinkList p,q;p=L;int j=0;while(p!=NULL && j< i-1){p=p->next;++j;}if(p==NULL)return ERROR;q=(LinkList)malloc(sizeof(LNode));q->data=e;q->next=p->next;p->next=q;return TRUE;}//InsertList/*冒泡排序(升序)*/void SortList(LinkList &La){ int temp1,temp2;    //升序 LinkList q=La->next,temp;while(q!=NULL){ temp = q->next;  while(temp!=NULL){   temp1=q->data;   temp2= temp->data;   if(temp1 >= temp2){    q ->data = temp2;   temp->data = temp1;    }   temp=temp->next;     }   q=q->next; }}//SortList/*将第i个元素复制给e*/Status GetElem_L(LinkList L,int i,ElemType &e){//L为带头结点的单链表的头指针//当第i个元素存在时,其值就赋给e并返回OK LinkList p=L->next;//初始化,p指向第一个结点,j为计数器int j=1;while(p&&j<i)//顺时针向后查找,直到p指向第i个元素或p为空 {p=p->next;++j; }  if(!p||j>i) return ERROR;//第i个元素不存在 e=p->data; return OK; }//GetElem_L/*将链表La复制给Lc*/void CopyList(LinkList La,LinkList &Lc){int len_a=ListLength(La);ElemType e;for(int i=1;i<len_a;i++){GetElem_L(La,i,e);InsertList(Lc,i,e);}}//CopyList/*判断相等*/Status Equal(ElemType a,ElemType b){if(a==b)return OK;elsereturn ERROR; } //Equal/*返回L中第一个与e满足关系compare的位序*/  Status LocateList(LinkList L,ElemType e,int(*compare)(ElemType,ElemType)) { int i; LinkList p=L; for(i=1;p->next!=NULL;i++) { p=p->next; if((*compare)(p->data,e)) return i; } return 0; }//LocateList  /*定位指定值的节点的位置*/ Status LocationList(LinkList La,ElemType x){ int n=0; LinkList q=La; while(q!=NULL && q->data !=x){ q=q->next; n++; } if(q==NULL) return 0; else  return n; }//LocationList  /*删除指定位置i的节点*/ Status DeleteList(LinkList La,ElemType i){ LinkList p=La; ElemType j=0; while(p->next &&j<i-1){ p=p->next; ++j; } if(!(p->next)||j>i-1) return ERROR; p->next = p->next->next; }//DeleteList  /*链表归并*/ void MergeList(LinkList La,LinkList &Lb,LinkList &Lc) { LinkList pa=La->next,pb=Lb->next,pc;   Lc=pc=La; // 用La的头结点作为Lc的头结点   while(pa&&pb)     if(pa->data<=pb->data)     {       pc->next=pa;       pc=pa;       pa=pa->next;     }     else     {       pc->next=pb;       pc=pb;       pb=pb->next;     }   pc->next=pa?pa:pb; // 插入剩余段   free(Lb); // 释放Lb的头结点   Lb=NULL; }//MergeList  /*链表的差集*/ void DifrentList(LinkList La,LinkList Lb,LinkList &Lc){ CopyList(La,Lc); ElemType e,n; for(int i=1;i<ListLength(Lb);i++){ GetElem_L(Lb,i,e); n=LocationList(Lc,e);if(n)DeleteList(Lc,n); } } //DifrentList  /*链表的交集*/ void MixdList(LinkList La,LinkList Lb,LinkList &Lc) { ElemType i,j,k=1; LinkList p=La,q=Lb; for(i=1;i<=ListLength(La);i++){ for(j=1;j<=ListLength(Lb);j++){ if(p->data == q->data){ InsertList(Lc,k,p->data); k++; } q=q->next; } p=p->next; q=Lb; } }//MixdList  /*遍历输出*/void PrintList(LinkList L){LinkList p=L->next;while(p!=NULL){printf("%d ",p->data);p = p->next; }printf("\n");}//PrintListint main(){LinkList La,Lb,Lc;CreatList_L1(La);SortList(La);CreatList_L2(Lb);SortList(Lb);InitList(Lc);MergeList(La,Lb,Lc);printf("La与Lb的并集为:\n");PrintList(Lc);MixdList(La,Lb,Lc) ;printf("La与Lb的交集:\n");PrintList(Lc);DifrentList(La,Lb,Lc);printf("La与Lb的差集:\n");PrintList(Lc);DifrentList(Lb,La,Lc);printf("Lb与La的差集:\n");PrintList(Lc);return 0; } 


0 0
原创粉丝点击