繁体   English   中英

C 链表冒泡排序逻辑错误

[英]C Linked List Bubble Sort Logic Error

下面我有一个简单的 C 语言链表程序,它保存一个点及其与原点的距离。 我的问题是,调用排序函数时,排序不正确。 我花了很多时间用 gdb 调试,但没有运气。 我对 C 和处理指针比较陌生,所以如果有人能帮助我,我将不胜感激!

我打算发布输出的图像,但我似乎没有足够的声誉,所以输出看起来如下所示:

点:(3,1) - 距离:3.16228

点:(4,1) - 距离:4.12311

点:(1,1) - 距离:1.41421

点:(7,1) - 距离:7.07107

test.c 文件:

#include <stdlib.h>
#include <stdio.h>
#include "point.h"

typedef struct node
{
    Point p;
    double distance;
    struct node *next;
} node;

void insertAtFront(node **start, Point *ip);
void sort(node *start);
void swap(node *a, node *b);
void printList(node *start);

int main(int argc, char **argv)
{
    Point *insertPoint = malloc(sizeof(Point));
    node *head = NULL;

    point_set(insertPoint,7.0,1.0);
    insertAtFront(&head,insertPoint);

    point_set(insertPoint,1.0,1.0);
    insertAtFront(&head,insertPoint);

    point_set(insertPoint,4.0,1.0);
    insertAtFront(&head,insertPoint);

    point_set(insertPoint,3.0,1.0);
    insertAtFront(&head,insertPoint);

    sort(head);

    printList(head);
}

void insertAtFront(node **start, Point *ip)
{
    node *node1 = (node*)malloc(sizeof(node));
    node1->p = *ip;
    node1->next = *start;
    *start = node1;
}

void sort(node *start)
{
    Point *tp1 = malloc(sizeof(Point));
    Point *tp2 = malloc(sizeof(Point));
    int swapped;
    node *node1;
    node *node2 = NULL; 
    node *tempNode; 
    double d1;
    double d2;
    if(start == NULL)
        return;
    do
    {
        swapped = 0;
        node1 = start;
        *tp1 = node1->p;        
        tempNode = node1->next;     
        *tp2 = tempNode->p;     
        d1 = distanceFromOrigin(tp1);
        d2 = distanceFromOrigin(tp2);
        while(node1->next != node2)
        {
            if(d1 > d2)
            {
                swap(node1,node1->next);
                swapped = 1;
            }
            node1 = node1->next;
        }
        node2 = node1;
    }
    while(swapped);
}

void swap(node *a, node *b)
{
    Point *tp;
    *tp = a->p;
    a->p = b->p;
    b->p = *tp;
}

void printList(node *start)
{
    node *temp = start;
    Point *tp = malloc(sizeof(Point));
    printf("\n");
    while(temp != NULL)
    {
        *tp = temp->p;
        printf("Point: (%g,%g) - Distance: %g\n", point_getX(tp), point_getY(tp), distanceFromOrigin(tp));
        temp = temp->next;
    }
}

point.c 文件:

#include <stdio.h>
#include "point.h"
#include <math.h>

void point_translate(Point *p, double x, double y)
{
    point_set(p,(point_getX(p)+x),(point_getY(p)+y));
}

double point_distance(const Point *p1, const Point *p2)
{
    double temp1 = (point_getX(p1) - point_getX(p2));
    double temp2 = (point_getY(p1) - point_getY(p2));
    double temp3 = (temp1*temp1)+(temp2*temp2);
    double dist = sqrt(temp3);
    return dist;
}

double distanceFromOrigin(const Point *p1)
{
    double x = point_getX(p1);
    double y = point_getY(p1);
    double temp = (x*x)+(y*y);
    double dist = sqrt(temp);
    return dist;
}

点.h文件:

#ifndef _POINT_H_
#define _POINT_H_

typedef struct Point 
{
  double x;
  double y;
} Point;

void point_translate(Point *p, double x, double y);
double point_distance(const Point *p1, const Point *p2);
double distanceFromOrigin(const Point *p1);

static inline double point_getX(const Point *p)
{
  return p->x;
}
static inline double point_getY(const Point *p)
{
  return p->y;
}
static inline Point *point_set(Point *p, double x, double y)
{
  p->x = x; 
  p->y = y;
  return p;
}

#endif

“交换”函数中的局部变量 tp 未初始化。 你的编译器应该警告你这一点。 然后你无论如何都可以访问它,这是未定义的行为......

当node1和node1->next交换node1时,需要改变前一个节点指向node1的next指针,也可以交换node1和node1->next之间的数据,保持next指针不变。

如果您要交换指针,这是交换前的样子:

node0->next = node1, node1->next = node2, node2->next = node3

和交换后:

node0->next = node2, node2->next = node1, node1->next = node3

这仅适用于相邻节点。 如果节点不相邻,则在交换之前:

nodea->next = node1, node1->next = nodeb
nodec->next = node2, node2->next = noded

交换后

nodea->next = node2, node2->next = nodeb
nodec->next = node1, node1->next = noded

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM