【发布时间】:2018-10-29 20:47:44
【问题描述】:
为了完全理解它们,我一直在实现一些 C 数据结构。
这是我对字符串链表的定义:
typedef struct str_linked_list {
const char* data;
struct str_linked_list* next;
} str_linked_list;
这是删除列表第n个元素的函数的实现:
void str_remove_at(str_linked_list* list, int index) {
// Invalid index case
if (index < 0) {
fprintf(stderr, "Error, array index < 0\n");
return;
}
str_linked_list* to_delete; // Always gonna need this
// Delete head case
if ( index == 0 ) {
to_delete = list;
// If this node is not the last one save the reference to the remaining ones
if ( to_delete->next != NULL )
list = list->next;
//free(to_delete);
return;
}
// General case
int i = 0;
str_linked_list* buf = list;
for (i = 0; i != index-1; i++) {
if (buf->next != NULL){
buf = buf->next;
} else {
fprintf(stderr, "The list is not that long, aborting operation");
return;
}
}
to_delete = buf->next;
if ( to_delete->next != NULL )
buf->next = to_delete->next;
free(to_delete);
}
到目前为止,它运行良好,但我相信我称之为删除头部的方式是不可能的,这就是 free(head) 被评论的原因。我已经使用以下代码测试了此代码:
#include "LinkedList.h"
int main() {
str_linked_list l;
l.data = "Hello, World";
l.next = NULL;
str_remove_at(&l, 1);
str_print(&l);
printf("\n\n");
str_remove_at(&l, 0);
str_print(&l);
return 0;
}
我发现不将列表初始化为指针会使更改存储该变量的内存地址变得困难。我是否必须重新编码库才能将列表初始化为指针或有没有办法可以将变量的内存位置分配给另一个地址?
总结一下,我可以这样改变“i”的值吗?
#include "stdlib.h"
void change_value(int* i) {
int* new_alloc = malloc(sizeof(int));
*new_alloc = 1;
i = new_alloc;
}
int main() {
int i = 0;
change_value(&i);
return 0;
}
【问题讨论】:
-
你能进一步总结你的问题吗?您是在问类似的问题,例如,您可以更改
int i的地址吗? -
与你的分配方式保持一致,不会出现这样的问题。
-
就是这样,要改一下,谢谢。
-
与你的实际问题无关,看来
if ( to_delete->next != NULL )是错误的,无条件赋值buf->next = to_delete->next会达到正确的行为。
标签: c pointers memory-management data-structures