我试图将节点插入到链表中,以便每个节点的数据中包含的字符串按字母顺序排序。如果输入重复的单词,则"计数"而是增加节点的整数。我给出了一个创建节点的makeLnode()函数,一个比较两个字符串的isGreater()函数,以及一个返回每个节点的字符串的getLnodeValue()函数。
lnode insertWord(char * word, lnode head) {
/* Your code to insert a word in the linked list goes here */
lnode temp = makeLnode(word);
if(head == NULL) // if head is null, make head=temp
{
head = temp;
}
else if(isGreater(getLnodeValue(temp),getLnodeValue(head)) == -1) // if temp < head, place temp before head
{
temp->next = head;
head = temp;
}
else
{
lnode curr;
for(curr = head; curr; curr = curr->next) // loop through linked list
{
if(isGreater(getLnodeValue(temp),getLnodeValue(curr)) == 0) // if curr = temp, increment curr
{
curr->count++;
break;
}
else if(isGreater(getLnodeValue(temp),getLnodeValue(curr)) == -1) // if temp < curr, place temp before curr
{
temp->next = curr->next;
curr->next = temp;
break;
}
else if(curr->next == NULL) // if we reach the end of the list and temp > all other nodes, place temp at end of list
{
curr->next = temp;
break;
}
}
}
return head;
}
只有一些单词会增加,并且会有一些单词的倍数。我的输出如下:
1. - 2 - a
2. - 2 - is
3. - 1 - broadcasting
4. - 1 - emergency
5. - 1 - be
6. - 1 - for
7. - 2 - this
8. - 1 - system
9. - 1 - system
10. - 1 - the
11. - 1 - testing
12. - 1 - seconds
13. - 1 - sixty
14. - 1 - next
15. - 1 - the
16. - 1 - test
17. - 1 - only
18. - 1 - test
19. - 1 - well
答案 0 :(得分:0)
你说// if temp < curr, place temp before curr
,但实际上是把它放在:
temp->next = curr->next;
curr->next = temp;
如您所见,您的输出未被订购。
isGreater
也可能存在问题,并且还存在内存泄漏,但这应该是首先要解决的问题。
我不想在这里重构整个代码,因为它不是问题,请随时询问是否还有问题。
答案 1 :(得分:0)
首先,你甚至在检查是否需要创建一个节点之前创建一个节点:如果单词出现在列表中,你就不需要那个新节点。
然后,您应该浏览列表,直到找到更大的值或者到达目的地。然后插入您的节点。无需测试这三种情况。
例如:
// check for the following base cases : no node, one node, then :
lnode node = head;
while (node->next && (isGreater(word,getLnodeValue(node->next)) == 1))
{
node = node->next;
}
// check if the next node value is the same as your word and if it is, increment its count.
if (isGreater(word,getLnodeValue(node->next)) == 0)
{
node->next->count++;
}
// Else, create a node with the word and insert the new node after the current node :
else
{
lnode new_node = makeLnode(word);
new_node->next = node->next;
node->next = new_node;
}
此代码不完整且不太好,但您可以从此开始。