我有一个问题与链接列表的气泡排序。几个小时后,我还没有在我的简单代码中发现错误。你可以看看吗?链接列表和(字母)气泡排序
int listSort(node_t ** _list)
{
int size = listSize(_list);
for(int i = 0; i < size; i++)
{
node_t *pointer = *_list;
for(int j = 0 ; j < size - 1; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
pointer = pointer->next;
}
}
return 0;
}
和这里的交换功能(但它似乎很好地工作,因为我测试了手动将所有边界情况):
int listSwapWithNext(node_t **_list, size_t first)
{
node_t *pointer = *_list;
node_t *ptr_b;
node_t *ptr_c;
node_t *ptr_d;
if(!first)
ptr_b = pointer;
for(size_t i = 0; pointer->next->next; i++, pointer = pointer->next)
{
if(i == first - 1 || first == 0)
{
if(first)
ptr_b = pointer->next;
ptr_c = ptr_b->next;
ptr_d = ptr_c->next;
if(first)
pointer->next = ptr_c;
else
*_list = ptr_c;
ptr_c->next = ptr_b;
ptr_b->next = ptr_d;
break;
}
}
return 0;
}
它会导致此崩溃(上线229):
当我在分类功能中将内环的限制修改为:
for(int j = 0; j < size - 1 && pointer->next; j++)
为防止读取不好的地址,我注意到奇怪的事情。内部循环的运行时间比它应该少一次。
谢谢!
编辑: 这里的修改排序功能的版本与内环(()与printf的制作)防止病情和我的调试指标:
int listSort(node_t ** _list)
{
int size = listSize(_list);
int i;
for(i = 0; i < size; i++)
{
node_t *pointer = *_list;
int j;
for(j = 0 ; j < size - 1 && pointer->next; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
printf("# %d %d\n", i, j);
pointer = pointer->next;
}
printf("\n");
}
return 0;
}
这里的结果控制台。看,它并不是每个周期都做,所以它给了不好的排序。
EDIT2: 这里的问题essention。 http://pastebin.com/e5K6C1A2
仍无法解决此问题。
一个明显的问题是'ptr_c'使用未初始化的'ptr_d = ptr_c->未来;'。首先,你能成功遍历列表吗?接下来,这是一个“头部/尾部”还是“圆形”链表? (从代码看来,它似乎是一个“圆形”列表)。接下来,看看你的内部循环为'bubble-sort','j'通常从'j = i'运行而不是'j = 0'(然而,这是实现定义的)。发布一个可以编译的示例输入的可验证示例。另外,请确保您正在编译**警告**(例如至少使用“-Wall -Wextra”)。最后,不需要截图 - 我们知道什么是崩溃。 – 2014-11-23 02:35:22
ptr_c在上面进行初始化。是的,我可以在每个排序时刻遍历列表(正确的节点数)。我实现了一个简单的带有不变边界的冒泡排序的例子,它应该可以工作目前我编辑帖子并添加了带有控制台结果的小样本代码。现在我正在为您准备可编译的基本代码。 – Madras 2014-11-23 02:58:10
我不知道什么是链接列表的类型。这是我自己想法的实现。可能是循环的。 – Madras 2014-11-23 03:16:06