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