-1

虽然我知道有很多对链表进行排序的示例,但它们是基于将排序抽象为一个单独的函数,该函数在生成列表后调用,遗憾的是这还不足以满足我的要求. 下面的代码是我尝试将键/词对插入到正确位置的链表中,以便在插入所有值后对列表进行排序,并且它适用于大多数情况,但似乎在第一次出现错误时扫描的项目也是列表中的第一个项目。

例如:0 ant 7 world 3 kodak 1 best 6 the 2 的输入是

产生链表:World -> best -> is -> kodak ->the ->world

但是,如果您将输入更改为: 7 world 0 ant 3 kodak 1 best 6 the 2 is

它产生链表:ant -> best->is->kodak->the->world

这是有问题的代码:

        while(fscanf(fp,"%d %s\n", &traversor->key, traversor->word) == 2){


            newnode =  malloc(sizeof(struct node_t));
            newnode->key = traversor->key;
            strcpy(newnode->word, traversor->word);

            traversor = dict_head;

            while(traversor->next!= tailnode){

                if(traversor->next->key > newnode->key){break;}

                traversor = traversor->next;
            }
            printf("Traversor is sitting on %s\n", traversor->word);
            newnode->next = traversor->next;
            traversor->next = newnode;
            traversor = dict_head;
            for(x = 0; x < list_size; x++)
            {
                printf("%d %s %d ->", traversor, traversor->word, traversor->key);
                traversor = traversor->next;
            }
            printf("%d %s %d",traversor->next, traversor->next->word, traversor->next->key);

            printf("\n");
            list_size++;
        }

任何可以提供的见解都将不胜感激,我仍在掌握指针,所以它很可能是一个非常基本的错误,但遗憾的是,经过几个小时的研究,我无法弄清楚这是什么。

编辑:

struct node_t{
    int key;
    char word[WORDLEN];
    struct node_t *next;
};

这是节点结构。

4

2 回答 2

1

我的解决方案...

首先改变你的While循环

while(traversor->next!= NULL)
{
    if(traversor->next->key > newnode->key)
    {
         break;
    }
    traversor = traversor->next;
}

第二:您第一次需要检查您的列表是否empty存在。

if(dict_head == NULL)
{
     dict_head = newnode;
     dict_head->next = NULL;
}

然后你的其他部分

else
{
    newnode->next = traversor->next;
    traversor->next = newnode;
}

我希望这能帮到您。

于 2013-08-30T11:04:29.413 回答
0

没有您分配到的地方dict_head,这似乎是一个错误。我猜它开始是其他东西,一旦插入第一个节点,就需要更改。

if如果您当前正在插入第一个节点,您可能需要一个特殊的测试。

于 2013-08-30T11:05:05.450 回答