C 列表类程序

标签 c list loops object

我需要用C来模拟一类链表。 我的问题是保存创建的每个“对象”的信息,例如列表长度、头、最后一个节点和平均值。 含义

List *A = ctor()
addItem(A, 0)

并检查 A 的列表长度将返回 2。 但如果我创建另一个名为 B 的列表,并添加另外两个项目,它将显示 3。 我不允许在任何函数中使用循环(不包括析构函数 - 也没有递归和 goto) 老实说,我想不出一种方法来保存每个“对象”的信息(现在缺少另一个词) 有什么建议么? 一切都在C语言中 我不想使用简单的全局变量,因为我仍然需要为每个实例保存不同的信息(找到这个词)

编辑:

结构包含:

int value
List *next
List *previous

并且不能包含更多值

编辑2

我可以向结构添加更多字段

要求是: 不要使用循环、递归、goto

列出函数:

1)构造-创建一个新列表

2) Destruct - 删除所有节点(可以在该函数中使用循环)

3)添加节点

4)删除节点 - 给定指向该节点的指针

5) 返回列表的长度

6) 返回指向第一个节点的指针

7) 返回指向最后一个节点的指针

8) 返回指向下一个节点的指针(给定指向当前节点的指针)

9) 返回指向前一个节点的指针(给定指向当前节点的指针)

10) 节点的返回值(给定指向该节点的指针)

11) 返回列表中值的平均值

就是这样,功能非常基本,但说明并非如此

限制性

不知道有没有帮助

最佳答案

免责声明:我假设您的函数只能与节点一起操作,这就是为什么我向调用者隐藏了列表结构,导致 API 困惑。

<小时/>

好吧,这将赢得最差 API 奖,但这里有一个可能的解决方案:

struct node;

struct list {
  int sum;
  size_t count;
  struct node * head, * end;

struct node {
  struct node * next, * previous;
  struct list * list;
  int value;
};

struct node * allocate_list(void) {
  struct node * sentinel = malloc(sizeof(*sentinel));
  struct list * list = malloc(sizeof(*list));
  sentinel->previous = sentinel->next = NULL;
  list->head = list->end = sentinel;
  list->sum = 0;
  list->count = 0;
  sentinel->list = list;
  return sentinel;
}

void free_list(struct node * n) {
  struct list * list = n->list;
  n = list->head;
  while (n != list->end) {
    n = n->next;
    free(n->previous);
  }
  free(n);
  free(list);
}

void add_item(struct node * n, int value) {
  struct node * new = malloc(sizeof(*new));
  new->previous = n->previous;
  n->previous = new;
  new->next = n;
  new->value = value;
  new->list = n->list;
  if (new->previous == NULL) {
    new->list->head = new;
  }
  ++(new->list->count);
  new->list->sum += value;
}

其余的函数应该是微不足道的,并且不一定不需要任何循环或递归。

关键思想是将整个列表共享的数据的指针存储到每个节点。因此,可以从任何节点访问和修改这些共享数据。

关于C 列表类程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760038/

相关文章:

javascript - 如何从 ng-repeat 内的对象中删除元素?

c - 黄金链接器问题

c - 确定当前用户帐户属于哪个组?

python - 在没有循环的情况下在 python 中返回列表索引的优雅方法是什么?

list - groovy 中的 [c 类

javascript - 在 vanilla javascript 中将对象列表打印为链接

javascript - 颜色变化Javascript

c - 如何在支持gnu99的gcc中处理 "warning: inline function ` *stat6 4` declared but never defined"

转换为文件指针

python - 合并列表字典中具有相同值的键