链表 交并差
来源:互联网 发布: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
- 链表 交并差
- 多边形求交并差
- 集合的交并差(链表)(未完)
- 两个集合的交并差
- 集合的交并差链式表示
- STL set之求交并差
- 集合的交并差用HashSet实现
- 一个工具类-----集合的交并差
- c++实现集合的交并差集
- Fxxking dataStructure_ 集合的交并差运算
- 顺序表集合的交并差操作
- 关于SQL2000的交并差(Intersect、Union、Except)命令说明
- 数据结构之顺序表(集合的交并差)
- set集合实现交并差操作;Iiterator实现无序遍历
- JAVA对集合的操作(交并差)
- 顺序表的链式结构中用C语言实现单链表的交并差运算
- poj 3225 Help with Intervals 线段树 集合的交并差补运算
- POJ 题目3225 区间(线段树区间交并差,区间异或)
- 如何将tomcat注册成windows系统服务方法
- [NOI 2014] 随机数生成器:模拟,贪心
- 258_密码必须由6-20位英文字母或数字组成
- 学习整理——Java集合Collection
- [Lintcode]Evaluate Reverse Polish Notation
- 链表 交并差
- Android官方开发文档Training系列课程中文版:电池续航时间优化之按需开启广播接收器
- 7.Binary Tree Serialization-二叉树的序列化和反序列化(中等题)
- awk简单介绍
- 259_属性动画监听
- javascript--作用域,声明提前和this关键字总结
- Java基础之反射
- FrameLayout详解
- 深入分析 Java I/O 的工作机制