将链接列表复制到另一个链接列表

时间:2014-03-06 22:42:39

标签: c linked-list

我正在编写一个函数,它将获取已创建的链表并将该链表复制到另一个链表中。这就是我到目前为止所拥有的

/* defined types:
   AirportCode is an alias for a 4-char array
   Node is a linked list node (struct) for AirportCodes */
typedef char AirportCode[4];
typedef struct node {
    AirportCode airport;
    struct node *next;
} Node;

Node *copy(Node *list) {
/* REPLACE THIS NON-SOLUTION */
struct node *temp = (struct node *)malloc(sizeof(struct node));
temp->airport = list->airport;
temp->next = copy(list->next);
return(temp);

return NULL;
}

 /* test copy, and print the copy */
    list3 = copy(list1);
    printf("list3 copied from list1: "); printList(list3);

当我尝试使用gcc编译时,我收到错误:

airports.c:50:19: error: array type 'AirportCode' (aka 'char [4]') is not
      assignable
    temp->airport = list->airport;
    ~~~~~~~~~~~~~ ^
1 error generated.

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

显而易见的问题是编译器报告的问题:您无法复制char数组的内容,只需将其分配给另一个。如果它可以工作,它会将指向数组第一个位置的指针分配给另一个,这不是你想要的。

您必须按位置复制数组位置的内容,使用:

strcpy( temp->airport, list->airport );

(假设您可以在每个机场代码的末尾添加零,AirportCode数组为5,另一方面会浪费大量空间),或者更好地使用:

memcpy(temp->airport, list->airport, sizeof(AirportCode))

无论如何,这不能解决实际问题:您没有复制函数copy()中的列表。我将该功能重命名为copyNode()

Node *copyNode(Node *list)
{
    struct node *temp = (struct node *)malloc(sizeof(struct node));
    temp->airport = list->airport;
    temp->next = copy(list->next);
    return(temp);
}

现在,您可以创建一个真正的功能副本:

Node *copy(Node *list)
{
    Node * toret = NULL;
    Node * ptrList = list;

    while( ptrList != NULL ) {
        if ( toret == NULL ) {
            toret = copyNode( ptrList );
        } else {
            toret->next = copyNode( ptrList );
            toret = toret->next;
        }

        ptrList = ptrList->next;
    }

    return toret;
}

请注意,您的列表应该以NULL作为最后一个节点的下一个指针。

希望这有帮助。