您的位置 首页 5G

调集交差并三种操作的C完成

这段时间一直在看C++相关的数据结构,感觉STL库的出现确实给C++实现一些基本的数据结构更加的方便,特别是map、list、set、vector的灵活

这段时刻一向在看C++相关的数据结构,感觉STL库的呈现的确给C++完结一些根本的数据结构愈加的便利,特别是map、list、set、vector的灵活运用能完结许多强壮的数据结构,记住在一本书中从前读到过“C++中算法的重要性没有C言语中那么显着,而是规划办法的问题”这句话的正确性有待于进一步的调查,可是面向目标中的更多的是依托承继多态性完结多目标编程,而在C言语中更多的事依托算法和数据结构。花了一晚上选用C言语完结了一个简略的调集操作,支撑调集的创立,元素的查询,删去,支撑调集的交集、差集、并集核算。

首要阐明一下调集的ADT,必定有包含根本的创立、删去操作。以及某一个元素的刺进和删去操作。调集的一个重要特征便是元素的不重复性。这种方法我在完结的进程中经过链表办理一个调集,依照元素的巨细进行摆放,之所以摆放首要是为了便利删去、查找元素的操作。实质上调集对元素的次序是没有要求的。
调集的交集:是指两个调集元素相同的部分构成的调集。
调集的差集:是指其间一个调集中除掉另一个调集相同元素今后剩下的元素构成的调集。
调集的并集:是指两个调集的一切元素构成的调集。

其间需求留意的便是调集的元素是不能重复的,原本我计划选用二叉查找树的方法完结,由于这种树型结构便于快速的查询,可是我选用元素的升序排序就能防止调集中漫无目的的查询操作。究竟完结二叉查找树也增加了一个指针成员,并且还需求许多的操作。

扼要的阐明一下我的进程:
根本的调集结构体:

typedef struct linknode
{
struct linknode *next;
int value;
}Node_t, *Node_handle_t;

typedef struct set
{
unsigned int size;
Node_handle_t head;
}Set;

调集的创立,该函数的完结是调集完结的最杂乱的一个函数,之所以这么杂乱是由于许多的操作都是根据该函数完结的,当然也能够选用更精密的函数来完结,我开端的主意是将元素刺进和创立操作兼并,都根据一个函数进行操作,可是写完今后发现函数太长,并且比较烂,不行必将仍是完结了一些根本的操作。选用了升序存储的方法,首要是为了后续的查找操作,留意链表的更新操作。

bool create_set(Set **sets, int data)
{
Set * temp = (Set *)malloc(sizeof(Set)/sizeof(char));
Node_t *node = NULL;
Node_t *head = NULL;

if(*sets == NULL)
{
temp->size = 0;
temp->head = NULL;
*sets = temp;
node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));
if(node != NULL)
{
node->next = NULL;
node->value = data;
/*更新调集指针*/
temp->head = node;
temp->size ++;
*sets = temp;

temp = NULL;
return true;
}
}
else/*现已存在部分调集*/
{
/******************************
选用次序存储的方法刺进新的元素
首要查找是否存在值,有不做任何操作
不存在,则按值巨细找到适宜的方位
******************************/

/*遍历*/
if((*sets)->head != NULL)
{
/*更新表头*/
if((*sets)->head->value > data)
{
node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));
if(node == NULL)
return false;
node->next = (*sets)->head;
node->value = data;
(*sets)->head = node;
(*sets)->size ++;

return true;
}
else if((*sets)->head->value == data)
{
return true;
}

/*从下一个节点开端*/
head = (*sets)->head;
node = head;

while(head->next != NULL)
{
/*现已存在*/
if(head->next->value == data)
{
return true;
}
/*找到适宜的方位,并刺进*/
else if(head->next->value > data)
{
node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));
if(node == NULL)
return false;
node->value = data;
node->next = head->next;
head->next = node;
(*sets)->size ++;

return true;
}
else
{
head = head->next;
}
}
/*阐明以上不存在该值*/
node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));
if(node == NULL)
return false;
node->value = data;
node->next = NULL;
head->next = node;
(*sets)->size ++;
return true;
}
else
{
node = (Node_t *)malloc(sizeof(Node_t)/sizeof(char));
if(node == NULL)
return false;
node->value = data;
node->next = NULL;
(*sets)->head = node;
(*sets)->size ++;
return true;
}
}
return false;
}

查找、删去元素操作,充分利用了前面的升序存储联系。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/317765.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部