gpt4 book ai didi

C 列表类程序

转载 作者:行者123 更新时间:2023-11-30 19:13:14 24 4
gpt4 key购买 nike

我需要用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com