链接列表按字母顺序插入

时间:2015-10-20 19:29:58

标签: c linked-list

我试图将节点插入到链表中,以便每个节点的数据中包含的字符串按字母顺序排序。如果输入重复的单词,则"计数"而是增加节点的整数。我给出了一个创建节点的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

2 个答案:

答案 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;
}

此代码不完整且不太好,但您可以从此开始。