C - 如何遍历ADT结构?

时间:2018-03-09 15:19:30

标签: c struct abstract-data-type

我正在为学校作业制定一套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;
}

1 个答案:

答案 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()