我正在为学校作业制定一套ADT,而且我已接近完成。但是我在如何迭代结构中的各个项目时遇到了一些困难:
"元素"必不可少。 set结构的成员是一个void指针,如果它是int类型,我可以set->element[i]
。对替代品的任何建议?
struct set
{
void *element;
int size;
cmpfunc_t cmpfunc;
set_t *start;
set_t *next;
};
int set_contains(set_t *set, void *elem)
{
for(int i = 0;i<set->size;++i)
if(set->element[i] == elem)
return 1;
return 0;
}
答案 0 :(得分:2)
你的ADT结构并没有多大意义;它看起来像你试图交叉繁殖不同的设计模式,那些是使用数组来保存集合元素,以及使用链表来保存集合。
我冒昧地修改结构,使其与任何一种模式更加一致。首先,elemSize
隐藏信息 - &gt;尽可能避免使用它们。
第一种模式:使用元素数组
int set_contains(struct set *pSet, void *elem) {
for (int i = 0; i < pSet->nElem; ++i) {
if (pSet->cmpFunc(pSet->elements[i], elem))
return 1;
}
return 0;
}
struct node {
void *data; /* element data */
struct node *next; /* next node in list */
};
struct set{
struct node *head; /* first element */
size_t elemSize; /* size of data type */
int(*cmpFunc)(void*, void*); /* equality comparison */
};
字段用于在不知道其数据类型的情况下分配和复制新元素。这对于两种模式和通用ADT都是常见的。要迭代此集合,请使用:
set
第二种模式:使用链接列表来表示集合
node
元素大小和比较函数是给定集合的属性,而不是该集合中包含的数据,因此它们在int set_contains(struct set *pSet, void *elem) {
struct node *head = pSet->head;
while(head) {
if (pSet->cmpFunc(head->data, elem))
return 1;
head = head->next;
}
return 0;
}
结构上定义,而不是midleft
结构,仅限topleft
结构定义数据和相关链接。要迭代此集合,请使用:
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
FONT = pg.font.Font(None, 42)
text_surface = FONT.render('text', True, pg.Color('dodgerblue1'))
text_rect = text_surface.get_rect()
text_rect.midleft = (screen.get_width()-50, 38)
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
screen.fill((30, 30, 30))
screen.blit(text_surface, text_rect)
pg.display.flip()
clock.tick(30)
pg.quit()