虽然我知道有很多对链表进行排序的例子,但它们都是基于将排序抽象为一个单独的函数,该函数在生成列表后调用,遗憾的是,它不足以满足要求。我想做。下面的代码是我尝试将键/单词对插入到正确位置的链表中,这样当插入所有值时,列表就会被排序,并且它适用于大多数情况但似乎在第一个时出现错误扫描的项目也是列表中的第一项。
例如,输入: 0蚂蚁 7个世界 3柯达 1最好的 6 2是
生成链表: 世界 - >最好的 - >是 - >柯达 - > - >世界
然而,如果您将输入更改为: 7个世界 0蚂蚁 3柯达 1最好的 6 2是
它生成链表: 蚂蚁 - > BEST-&GT是 - > kodak-> the->世界
以下是有问题的代码:
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;
};
这是节点结构。
答案 0 :(得分: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;
}
我希望这会对你有所帮助。
答案 1 :(得分:0)
您没有分配给dict_head
的地方,这似乎是一个错误。我猜它是在插入第一个节点后需要更改的其他内容开始的。
如果您当前正在插入第一个节点,则可能需要一个特殊的if
来测试。