冒泡排序方法不适用于C中的链接列表

时间:2015-11-04 00:37:29

标签: c

我正在尝试将冒泡排序方法实现到链表数据结构中,但是当通过测试工具运行它时,它并没有做任何事情。有什么建议吗?

这是我的源代码:

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

1 个答案:

答案 0 :(得分:1)

这似乎是非常错误的。

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);
}

删除使用不必要的递归可以消除导致堆栈溢出的风险。删除继续使代码稍微快一点(我相信)。删除指针的虚假使用应修复您的代码。

如果你的代码没有被修复,那么你需要发布set_node_t的定义,你的比较可能无效(if (current->data > current->next->data))。

修改2

正如评论和更新的问题现在指出你需要对数据本身进行比较而不是数据指针。

if(*(current->data) > *(current->next->data)){