首页 > 解决方案 > 按值交换结构(指针数组)

问题描述

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

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

标签: cstruct

解决方案


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

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

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

推荐阅读