我试图将bubble排序方法实现到链表数据结构中,但是当通过测试工具运行它时,它什么也做不了。有什么建议吗?
这是我的源代码:
void set_sort (set_t * the_set)
{
assert (the_set);
set_node_t *current;
current = the_set->head;
int sorted = 1;
int x;
for (x = 0; x < the_set->set_size; x++) {
//we dont do it if this is the last value
if (x + 1 == the_set->set_size) {
continue;
}
if (current->data > current->next->data) {
sorted = 0;
int temp = ¤t->next->data;
current->next->data = current->data;
current->data = temp;
}
current = current->next;
}
if (!sorted) {
set_sort (the_set);
}
}
用头文件编辑
#ifndef _set_h_
#define _set_h_
#include <stdbool.h>
#include "common.h"
/* Create a basic singly-linked list.*/
/*This code has been sourced from Mike Mcallistar, Assignment 5 Solutions*/
typedef struct _set_node_t {
test_type_t *data;
struct _set_node_t *next;
struct _set_node_t *below;
} set_node_t;
/* the set itself keeps track of the head and the tail of the linked list */
typedef struct {
int set_size;
bool ready;
set_node_t *head;
set_node_t *tail;
int set_level;
} set_t;
bool set_init(set_t *the_set);
void set_destroy(set_t *the_set);
bool set_add(set_t *the_set, test_type_t *item_to_add);
bool set_delete(set_t *the_set, test_type_t *item_to_remove);
bool set_find( set_t *the_set, test_type_t *item_to_find);
void set_sort(set_t *the_set);
void set_enumerate(set_t *the_set);
#endif
最佳答案
这件事似乎有点不对劲。
int temp = ¤t->next->data; // Assignes a pointer into temp
current->next->data = current->data; // Copies current into next
current->data = temp; // Copies the pointer into data
这不太可能一事无成。它很可能会损坏您的数据。
是否可以简单地将第一行更改为:
int temp = current->next->data;
编辑
稍微清理一下你的代码我会说:
void set_sort(set_t *the_set)
{
assert(the_set);
int sorted;
int x;
do {
set_node_t *current = the_set->head;
sorted = 1;
for( x = 0; x < the_set->set_size - 1; x++){
if(current->data > current->next->data){
sorted = 0;
int temp = current->next->data;
current->next->data = current->data;
current->data = temp;
}
current = current->next;
}
}
while (!sorted);
}
删除不必要的递归可以消除导致堆栈溢出的风险。删除continue使代码稍微快一些(我相信)。删除指针的虚假使用应该可以修复代码。
如果您的代码没有被修复,那么您将需要发布
set_node_t
的定义,这可能是您的比较不起作用(if (current->data > current->next->data)
)。编辑2
正如评论和更新问题现在指出的,您需要对数据本身执行比较,而不是对指向数据的指针执行比较。
if(*(current->data) > *(current->next->data)){
关于c - 冒泡排序方法不适用于C中的链接列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33511771/