数据结构-编写代码错误 集合A-集合B A中的元素不能再B中出现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-编写代码错误 集合A-集合B A中的元素不能再B中出现相关的知识,希望对你有一定的参考价值。
/*集合A-B*/
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Lnode
DataType data;
struct Lnode *next;
Lnode,*LinkList;
//初始化链表
void InitList(LinkList &L)
L=(LinkList)malloc(sizeof(Lnode));
if(!L) exit(-1);
L->next=0;
//尾部插入法创建链表
void CreatList(LinkList L,int n)
int i;
LinkList p,s;
p=L;
for(i=n;i>0;i--)
s=(LinkList)malloc(sizeof(Lnode));
if(!s)exit(-1);
scanf("%d",&s->data);
L->next=0;
p->next=s;
p=p->next;
//打印链表中的个元素
void DisplayList(LinkList L)
LinkList p;
p=L;
while(p->next!=0)
p=p->next;
printf("%d",p->data);
//删除链表上对应的结点
void DeleteList(LinkList &L,LinkList k)
LinkList p,q;
p=L;
while(p)
q=p;
p=p->next;
if(p==k)
q->next=p->next;
free(p);
//定位数据元素在链表中的位置
LinkList LocateList(LinkList L,DataType e)
LinkList p;
p=L;
while(p->next!=0)
p=p->next;
if(p->data==e)
return (p);
//函数两个集合的差
void HeBing(LinkList A,LinkList &B)
LinkList p,q;
p=A;
while(p->next!=0)
p=p->next;
if(LocateList(B,p->data)>0)
q=LocateList(B,p->data);
DeleteList(B,q);
//主函数
void main()
//生成链表A和B
LinkList A,B;
int i,j;
InitList(A);
InitList(B);
printf("请输入集合A的数据个数:\n");
scanf("%d",&i);
printf("请输入集合A的数据:\n");
CreatList(A,i);
printf("请输入集合B的数据个数:\n");
scanf("%d",&j);
printf("请输入集合B的数据:\n");
CreatList(B,j);
HeBing(A,B);
DisplayList(B);
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Lnode
DataType data;
struct Lnode *next;
Lnode,*LinkList;
//初始化链表
void InitList(LinkList &L)
L=(LinkList)malloc(sizeof(Lnode));
if(!L) exit(-1);
L->next=0;
//尾部插入法创建链表
void CreatList(LinkList L,int n)
int i;
LinkList p,s;
p=L;
for(i=n;i>0;i--)
s=(LinkList)malloc(sizeof(Lnode));
if(!s)exit(-1);
scanf("%d",&s->data);
L->next=0;
p->next=s;
p=p->next;
//打印链表中的个元素
void DisplayList(LinkList L)
LinkList p;
p=L;
while(p->next!=0)
p=p->next;
printf("%d",p->data);
//删除链表上对应的结点
void DeleteList(LinkList &L,LinkList k)
LinkList p,q;
p=L;
while(p)
q=p;
p=p->next;
if(p==k)
q->next=p->next;
free(p);
//定位数据元素在链表中的位置
LinkList LocateList(LinkList L,DataType e)
LinkList p;
p=L;
while(p->next!=0)
p=p->next;
if(p->data==e)
return (p);
//函数两个集合的差
void HeBing(LinkList A,LinkList &B)
LinkList p,q;
p=A;
while(p->next!=0)
p=p->next;
if(LocateList(B,p->data)>0)
q=LocateList(B,p->data);
DeleteList(B,q);
//主函数
void main()
//生成链表A和B
LinkList A,B;
int i,j;
InitList(A);
InitList(B);
printf("请输入集合A的数据个数:\n");
scanf("%d",&i);
printf("请输入集合A的数据:\n");
CreatList(A,i);
printf("请输入集合B的数据个数:\n");
scanf("%d",&j);
printf("请输入集合B的数据:\n");
CreatList(B,j);
HeBing(A,B);
DisplayList(B);本回答被提问者采纳
数据结构常用排序算法-选择插入希尔
选择排序
实现思路:
1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。
2、每次从A集合中查找出最大或者最小的元素后放入集合B中
3、同时将该元素从集合A中移除.
4、循环执行以上两步直到集合A为空,B集合中的元素就有序了.
缺点:
效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法。
示范代码
1 | public class CommSort { |
2 | // 比较大小 |
3 | @SuppressWarnings({ "rawtypes", "unchecked" }) |
4 | public int compareElement(Comparable a, Comparable b) { |
5 | return a.compareTo(b); |
6 | } |
7 | |
8 | // 交换元素 |
9 | public <T> void exchangeElement(T[] a, int i, int j) { |
10 | T tmp = a[i]; |
11 | a[i] = a[j]; |
12 | a[j] = tmp; |
13 | } |
14 | |
15 | // 选择排序 |
16 | public <T> void SelectionSort(Comparable<T>[] a) { |
17 | int len = a.length; |
18 | int minIndex = 0; |
19 | for (int i = 0; i < len; i++) { |
20 | minIndex = i; |
21 | for (int j = i; j < len; j++) { |
22 | if (compareElement(a[j], a[minIndex]) < 0) { |
23 | minIndex = j; |
24 | } |
25 | } |
26 | exchangeElement(a, i, minIndex); |
27 | } |
28 | } |
29 | } |
插入排序
实现思路:
1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。
2、依次从集合A中获取元素并与集合B中的元素一次比较(如:按照数组下标从大到小的顺序),在集合B中找到该元素合适的位置放入(如果是升序排序,该元素应大于在它前面的元素,小于在后面的元素)
3、循环第二步操作直到集合A为空。
优点:
效率很高,特别对部分有序的数据集进行排序效果更好。
缺点:
适合小数据集的排序,对数据集比较大的集合进行排序效率较低。
示例代码:
1 | // 插入排序 |
2 | public <T> void InsertSort(Comparable<T>[] a) { |
3 | int len = a.length; |
4 | for (int i = 1; i < len; i++) { |
5 | for (int j = i; j > 0 && compareElement(a[j], a[j - 1]) < 0; j--) { |
6 | exchangeElement(a, j, j - 1); |
7 | } |
8 | } |
9 | } |
希尔排序
实现思路:
1、实现思路与插入排序一样,唯一的不同是希尔排序在插入排序的基础上加入了跳跃比较。
2、插入排序的跳跃步进值为一直都为1。
3、希尔排序只有最后一次的轮询比较,跳跃步进值才为1.
优缺点与插入排序一样。
示例代码:
1 | // 希尔排序 |
2 | public <T> void ShellSort(Comparable<T>[] a) { |
3 | int weight = 0; |
4 | int len = a.length; |
5 | while (weight < len / 3) { |
6 | weight = 3 * weight + 1; |
7 | } |
8 | while (weight > 0) { |
9 | for (int i = weight; i < len; i++) { |
10 | for (int j = i; j >= weight |
11 | && compareElement(a[j], a[j - weight]) < 0; j -= weight) { |
12 | exchangeElement(a, j, j - weight); |
13 | } |
14 | } |
15 | // 减小比较步进 |
16 | weight /= 2; |
17 | } |
18 | } |
以上是关于数据结构-编写代码错误 集合A-集合B A中的元素不能再B中出现的主要内容,如果未能解决你的问题,请参考以下文章
数据结构 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。(代