试图理解链表插入函数的代码

时间:2014-02-27 00:20:29

标签: c

我不了解这个功能的某些部分。我在一条线上写了一些评论,我不理解它。

// perform an ordered insertion of an item into a list
boolean insert( List *list, char *new_string )
{
   boolean rc = true;
   Node *newNode = NULL;
   Node *curr;
   Node *prev;

   newNode = (Node *)malloc( sizeof( Node ) );
   newNode->string = new_string;

   curr = list->top;
   prev = NULL;
   // upto here everything is fine

   //from here 
   // what does this does here? curr->string, new_string < 0 
   // and the if and else statements after that
   while ( NULL != curr && strcmp( curr->string, new_string ) < 0 ) 
   {
      prev = curr;
      curr = curr->next;
   }
   if ( prev == NULL ) 
   {
      newNode->next = list->top;
      list->top = newNode;
   } 
   else 
   {
      newNode->next = curr;
      prev->next = newNode;
   }

  // note that we need to have space for the string as well!
   newNode->string = (char *)malloc( strlen( new_string ) + 1 );
   strcpy( newNode->string, new_string );
   // to here I do not understand
   return rc;
}

2 个答案:

答案 0 :(得分:2)

while ( NULL != curr && strcmp( curr->string, new_string ) < 0 ) 
{
   prev = curr;
   curr = curr->next;
}

此代码块在整个列表中搜索小于给定字符串的第一个节点。因为在循环结束时,curr被设置为curr-&gt;下一个;最后,当curr-&gt; next == null时,你将到达列表的末尾,你的循环将结束。

下一个if-block:if ( prev == NULL )。处理你的循环从不运行的情况,或者仍然是定义的prev,或者是NULL。

关联的else块通过设置newNode->prev = prevnewNode->curr在上一个节点和下一个节点之间插入新节点,但您还需要设置prev->next = newNodecurr->prev = newNode

有关strcmp()的详情,请访问:http://www.cplusplus.com/reference/cstring/strcmp/

strcmp(str1,str2)的关键点: 零值表示两个字符串相等。 大于零的值表示不匹配的第一个字符在str1中的值大于在str2中的值;小于零的值表示相反。

答案 1 :(得分:2)

这个循环:

while ( NULL != curr && strcmp( curr->string, new_string ) < 0 )
{
  prev = curr;
  curr = curr->next;
}

表示“在列表中前进 curr为NULL(即我们已到达列表的末尾),我们已经走了只需要插入新节点的位置“。

如果我们在第一个节点上遇到这个条件(因此prev仍为NULL),则新节点属于头部:

if ( prev == NULL ) 
{
  newNode->next = list->top;
  list->top = newNode;
}

否则将它拼接在 达到该条件的地方:

newNode->next = curr;
prev->next = newNode;

修改

P.S。这一点:

newNode->string = (char *)malloc( strlen( new_string ) + 1 );
strcpy( newNode->string, new_string );

new_string复制到新节点,但这不应该是神秘的。