我试图将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 = &current->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 = &current->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/

10-09 01:43