【问题标题】:Swapping structs by value (array of pointers)按值交换结构(指针数组)
【发布时间】:2020-05-26 04:08:24
【问题描述】:

我有这个结构(双向链表,信息表示为 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);
}

这是交换内容的正确方法吗?感觉不对。提前致谢。

【问题讨论】:

  • 代码不应使用strcpy。对于每个i,只需交换两个指针。还有this question 讨论了如何交换双向链表的元素。
  • @user3386109 谢谢,我做到了,但是如何释放多余的内存?如果我是正确的,我使用 malloc 3 次,用于 p1、p2 和临时数组。我应该能够释放一个数组,对吗?
  • 你根本不应该使用malloc。代码应该一次交换一个指针。所以应该有一个temp 变量声明为char *temp;

标签: c struct


【解决方案1】:

这是交换内容的正确方法吗?

如果你想交换数据部分(并且保持下一个/上一个指针不变),你只需要:

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){ ... }

【讨论】:

  • 没有必要交换内存,因为链表的全部意义在于移动指针(便宜)以避免移动内存(昂贵)。
  • @ManicDee OPs 的问题是“这是交换他们的内容的正确方法吗?”这就是这里的答案。不是好主意。
  • 问题最初问的是:“我必须交换任何两个元素。我尝试通过指针交换它们,但我真的找不到解决方案……”然后转向交换内容的世界。
【解决方案2】:

问题不是很清楚,但我假设您的函数正在接收指向两个列表成员元素的指针(可能是也可能不是同一个列表),并且您希望一个在其列表中占据另一个位置,反之亦然反之亦然。

如果是这样,那么您可以使用 memcpy 复制 arr(因为数组不能按值分配)并保持链接指针不变:

void swap_values(List *p1, List *p2) 
{
    List temp  = *p1;
    memcpy(&p1->arr, &p2->arr, sizeof p1->arr);
    memcpy(&p2->arr, &temp.arr, sizeof p2->arr);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多