复制链接列表并返回指向新列表的指针

时间:2014-03-06 07:33:52

标签: c struct linked-list

我目前的结构是:

typedef char AirportCode[4];
typedef struct node{
  AirportCode airport;
  struct node *next;
}Node;

我对这个函数应该如何开始的想法是这样的:

Node *copy(Node *list) {
int count = 0;
  while (list != NULL){
   count++;
   list = list->next;
}
}

现在我们知道原始列表有多长,但我之所以难以理解是因为我不知道如何为每个我们必须复制到第二个列表的单个节点分别分配内存。

2 个答案:

答案 0 :(得分:0)

您使用malloc分配新节点:

Node* newNode = malloc(sizeof(Node));

然后您可以使用

更改新节点内的内容
newNode->airport = <blah blah blah>
newNode->next = <other node, etc etc>

如果使用循环,可能更容易使用递归而不是循环进行克隆,除非您喜欢执行大量指针操作并一次跟踪多个节点(类似于reversing a linked list in place),使用堆栈。

所以它会是这样的:

Node* cloneList(Node* head){
    if (!head)
        return NULL;//done
    Node* n = malloc(sizeof(Node));
    n->airport = head->airport;
    n->next = cloneList(head->next);
    return n;
}

答案 1 :(得分:0)

我还没有测试过,但这应该可以胜任:

Node *copy(Node *list) {
  int count = 0;
  Node *previous = NULL ;
  Node *firstnode = NULL ;

  while (list != NULL){
   Node *newnode = malloc(sizeof(node)) ;

   if (firstnode == NULL)
     firstnode = newnode ;

   memcopy(newnode, list, sizeof(Node)) ;
   newnode->next = NULL ;

   if (previous != NULL)
     previous->next = newnode ;

   previous = newnode ;
   count++;
   list = list->next;
  }

  return firstnode ;
}