c - 按值交换结构(指针数组)
问题描述
我有这个结构(双向链表,信息表示为 37 个指针的数组):
typedef struct list {
struct list* next;
struct list* prev;
char *arr[37];
} List;
我必须交换任何两个元素。我尝试通过指针交换它们,但我真的找不到解决方案(所以如果你能帮助我,我会很高兴)。所以我想出了这个我从一开始就害怕的解决方案:
void swap_values(List *p1, List *p2) {
char **temparr = malloc(37 * sizeof(char*));
for (int i = 0; i < 37; i++) {
*(temparr + i) = malloc(sizeof(p1 -> arr[i]));
strcpy(temparr[i], p1 -> arr[i]);
}
for (int i = 0; i < 37; i++) {
strcpy(p1 -> arr[i], p2 -> arr[i]);
}
for (int i = 0; i < 37; i++) {
strcpy(p2 -> arr[i], temparr[i]);
free(*(temparr + i));
}
free(temparr);
}
这是交换内容的正确方法吗?感觉不对。提前致谢。
解决方案
这是交换内容的正确方法吗?
如果您想交换数据部分(并保持下一个/上一个指针不变),您只需要:
void swap_values(List *p1, List *p2)
{
char* tmp;
for (int i = 0; i < 37; i++)
{
tmp = p1->arr[i];
p1->arr[i] = p2->arr[i];
p2->arr[i] = tmp;
}
}
另一种方法可能是:
void swap_values(List *p1, List *p2)
{
char *tmp[37];
memcpy(tmp, p1->arr, 37 * sizeof(char*));
memcpy(p1->arr, p2->arr, 37 * sizeof(char*));
memcpy(p2->arr, tmp, 37 * sizeof(char*));
}
如果要交换节点(而不是内部的数据),则需要另一个函数原型。这是因为被交换的节点可能是第一个和/或最后一个节点。在这种情况下,head
和/或tail
指针将改变。
大概是这样的:
void swap_values(List *p1, List *p2, List **head, List **tail){ ... }
推荐阅读
- javascript - 如何重写 HTML 页面以获得完全相同的字段?
- flutter - 如何在模型中拥有对象的 ArrayList
- javascript - 如何在firebase中获取新创建用户的用户ID
- system-verilog - 如何用系统verilog中的所有枚举值制作一个数组?
- tizen - 如何覆盖或添加 genlist 项目样式?
- boolean-logic - 简化布尔表达式 A'BC + AB'C + ABC'
- ios - 找不到 -lMailCore-ios 的库
- postgresql - heroku-postgresql 更新破坏了我的应用程序,我可以恢复自动发布以便保存发布之前存储的数据库中的数据吗?
- ajax - 使用 AJAX 更新视图中的数据不起作用
- java - 如何从 Genicam 参考实现中获取 PayloadSize?