我正在编写一个函数,它将获取已创建的链表并将该链表复制到另一个链表中。这就是我到目前为止所拥有的
/* 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.
有什么想法吗?
答案 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作为最后一个节点的下一个指针。
希望这有帮助。