我不了解这个功能的某些部分。我在一条线上写了一些评论,我不理解它。
// 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;
}
答案 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 = prev
和newNode->curr
在上一个节点和下一个节点之间插入新节点,但您还需要设置prev->next = newNode
和curr->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
复制到新节点,但这不应该是神秘的。