我对C中的链表还很陌生,我很确定我走在了正确的轨道上,但我一直被困在这个问题上,因为我不知道是什么导致了这个输出。这会导致问题,因为在搜索节点时,由于字符串格式的奇怪行为,我无法匹配字符串。
我试过做node->title[strcspn(node->title, "n")] = 0;
,但当我在insert方法中使用它时,它并没有完成我想要它做的事情。例如,我们有Title: [HARDWAREn]
并调用(strcspn(,它会导致
[Title: [HARDWARE
代替Title: [HARDWARE]
附言:我只是用括号来解释字符串中多余的无关字符,这样我就可以用strcmp((来比较它们。
有人知道怎么解决这个问题吗?
Enter title:
HARDWARE
TITLE to search for: [HARDWARE]
Current: []
]urrent: [ELECTRONICS
]urrent: [OUTSIDE GARDEN
]urrent: [INDOOR GARDEN
]urrent: [MILLWORK
]urrent: [LUMBER
]urrent: [APPLIANCES
]urrent: [HARDWARE
...
这是打印curr->标题后使用以上任何一行。我唯一做的另一件事是在我的主菜单中,在打印列表下面列出一个菜单,用于其他功能,但这是与填充链表中的节点相关的逻辑。
您的代码无效。
例如,函数insertSortedList
(作为函数search
(产生若干内存泄漏,并且还具有未定义的行为。
这些内存分配
node = (node *) malloc(sizeof(node));
curr = (node *) malloc(sizeof(node));
没有道理。分配的内存未被使用,将丢失。
节点head
通常可以等于NULL
。因此,例如访问数据成员next
以获取空指针会调用未定义的行为。
除此之外,指向头节点的指针在函数内不会更改,因为它是通过引用传递给函数的。
我将展示如何编写函数。尝试自己更新其他功能。
int insertSortedList( node **head,
const char *title,
const char *category,
double time)
{
node *node = malloc( sizeof( node ) );
int success = node != NULL;
if ( success )
{
strcpy( node->title, title );
node->title[ strcspn( node->title, "n" ) ] = ' ';
strcpy( node->category, category );
node->category[ strcspn( node->category, "n" ) ] = ' ';
node->time = time;
while ( *head != NULL && !( strcmp( node->title, ( *head )->title ) < 0 ) )
{
head = &( *head )->next;
}
node->next = *head;
*head = node;
}
return success;
}
该函数至少可以像一样调用
insertSortedList(&head, title, category, time);
^^^^^
如果您使用的系统将从具有两个符号'r'
和'n'
的文件中读取的字符串附加在一起,则可以使用以下strcspn
调用
node->title[ strcspn( node->title, "rn" ) ] = ' ';