数据结构-编写代码错误 集合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);

参考技术A /*集合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);本回答被提问者采纳

数据结构常用排序算法-选择插入希尔

选择排序

实现思路:

1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。

2、每次从A集合中查找出最大或者最小的元素后放入集合B中

3、同时将该元素从集合A中移除.

4、循环执行以上两步直到集合A为空,B集合中的元素就有序了.

缺点:

效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法。

 

示范代码

public class CommSort {
    // 比较大小
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public int compareElement(Comparable a, Comparable b) {
        return a.compareTo(b);
    }
 
    // 交换元素
    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为空。

优点:

效率很高,特别对部分有序的数据集进行排序效果更好。

缺点:

适合小数据集的排序,对数据集比较大的集合进行排序效率较低。

示例代码:

// 插入排序
public <T> void InsertSort(Comparable<T>[] a) {
    int len = a.length;
    for (int i = 1; i < len; i++) {
        for (int j = i; j > 0 && compareElement(a[j], a[j - 1]) < 0; j--) {
            exchangeElement(a, j, j - 1);
        }
    }
}

希尔排序

实现思路:

1、实现思路与插入排序一样,唯一的不同是希尔排序在插入排序的基础上加入了跳跃比较。

2、插入排序的跳跃步进值为一直都为1。

3、希尔排序只有最后一次的轮询比较,跳跃步进值才为1.

优缺点与插入排序一样。

示例代码:

// 希尔排序
public <T> void ShellSort(Comparable<T>[] a) {
    int weight = 0;
    int len = a.length;
    while (weight < len / 3) {
        weight = 3 * weight + 1;
    }
    while (weight > 0) {
        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中出现的主要内容,如果未能解决你的问题,请参考以下文章

用java编写程序,求集合的并集、交集和差集

两个集合找出相同和不同元素?

数据结构常用排序算法-选择插入希尔

数据结构 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。(代

真子集和子集如何判断?

数据结构基础-Hash Table详解(转)