如何通过对结构中的名称使用 strcmp 将节点添加到列表中?
How could I add nodes to a list by using strcmp on the names in the struct?
我正在开发一个节点列表,我可以在其中执行诸如添加到前端或末尾以及从前端或末尾删除之类的操作,但我也希望能够制作一个订单列表。所以我有一个 method/function 其中我命名为 add_inorder..
到目前为止,这就是我所拥有的
// the struct:
typedef struct node
{
int id;
char* name;
struct node* next;
} node;
void add_inorder(node** head, node* new_node) {
node* previous = *head;
if (!*head) {
*head = new_node;
}
else if (strcmp((*head)->name, new_node->name) > 0) {
new_node->next = *head;
*head = new_node;
}
else {
node* it = (*head)->next;
while (it) {
if (strcmp(it->name, new_node->name) > 0) {
new_node->next = it;
previous->next = new_node;
break;
}
previous = it;
it = it->next;
if (previous->next == NULL) {
previous->next = new_node;
break;
}
}
}
}
屏幕转储:
General stuff ...
--------------------------------------------------
Memory used to date : 0
node size : 24
List length now is : 0
Memory used to date : 0
Print List :
--------------------------------------------------
Add Inorder / Remove Inorder ...
--------------------------------------------------
Adding node : {0, Jill}
List length now is : 1
Memory used to date : 29
Print List :
{0, Jill}
Adding node : {1, Jane}
List length now is : 2
Memory used to date : 58
Print List :
{1, Jane}
{0, Jill}
Adding node : {2, Jeff}
List length now is : 3
Memory used to date : 87
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}
Adding node : {3, Jz}
List length now is : 4
Memory used to date : 114
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}
{3, Jz}
已编辑:现在的问题是,我认为我的代码有点错误,但当我稍作休息时它仍然有效,您建议我如何修复它?
考虑递归调用 add_inorder()
,这样您将为列表中的每个节点重用 if()
和 else if()
分支。
如果这些检查失败,则重试下一个节点:
else
{
add_inorder(&previous->next, new_node);
}
不利的一面是,它会根据列表的大小使用更多的堆栈内存。
我正在开发一个节点列表,我可以在其中执行诸如添加到前端或末尾以及从前端或末尾删除之类的操作,但我也希望能够制作一个订单列表。所以我有一个 method/function 其中我命名为 add_inorder..
到目前为止,这就是我所拥有的
// the struct:
typedef struct node
{
int id;
char* name;
struct node* next;
} node;
void add_inorder(node** head, node* new_node) {
node* previous = *head;
if (!*head) {
*head = new_node;
}
else if (strcmp((*head)->name, new_node->name) > 0) {
new_node->next = *head;
*head = new_node;
}
else {
node* it = (*head)->next;
while (it) {
if (strcmp(it->name, new_node->name) > 0) {
new_node->next = it;
previous->next = new_node;
break;
}
previous = it;
it = it->next;
if (previous->next == NULL) {
previous->next = new_node;
break;
}
}
}
}
屏幕转储:
General stuff ...
--------------------------------------------------
Memory used to date : 0
node size : 24
List length now is : 0
Memory used to date : 0
Print List :
--------------------------------------------------
Add Inorder / Remove Inorder ...
--------------------------------------------------
Adding node : {0, Jill}
List length now is : 1
Memory used to date : 29
Print List :
{0, Jill}
Adding node : {1, Jane}
List length now is : 2
Memory used to date : 58
Print List :
{1, Jane}
{0, Jill}
Adding node : {2, Jeff}
List length now is : 3
Memory used to date : 87
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}
Adding node : {3, Jz}
List length now is : 4
Memory used to date : 114
Print List :
{1, Jane}
{2, Jeff}
{0, Jill}
{3, Jz}
已编辑:现在的问题是,我认为我的代码有点错误,但当我稍作休息时它仍然有效,您建议我如何修复它?
考虑递归调用 add_inorder()
,这样您将为列表中的每个节点重用 if()
和 else if()
分支。
如果这些检查失败,则重试下一个节点:
else
{
add_inorder(&previous->next, new_node);
}
不利的一面是,它会根据列表的大小使用更多的堆栈内存。