c - 在链表上应用冒泡排序会在 c 中给出错误的输出

标签 c algorithm sorting data-structures linked-list

我正在尝试使用冒泡排序对链表进行排序。但它给出了分段问题

我这样做的逻辑如下:

注意:请注意,我必须在每个地方仅使用引用传递(没有返回和节点的全局声明)

void bubble_sort(node * * List, int size) 
{
    int i, j, temp;
    node * first;
    node * second;
    node * final;
    final=*List

    for (i = 0; i < size - 1; i++)
    {
      first =final;
      second = first -> link;
        for (j = 0; j < size; j++) 
        {

            if (first -> data < second -> data)
            {
                temp = first -> data;
                first -> data = second -> data;
                second -> data = temp;
            }
            first = first -> link;
        }
    } * List = first;
}

它的函数调用是:

bubble_sort(&start,val);

有人可以帮我纠正一下逻辑吗?

编辑:我的完整代码:

  #include <stdio.h>
//#include <conio.h>
#include <malloc.h>

/* structure containing a data part and link part */
struct node 
{
    int data;
    struct node * link;
};
typedef struct node node;
node * start, * visit, * newnode;
//start=NULL
///////////////////////////////// Function declaration  ///////////////////
void append(node * * q, int num);
void displaylist(node * start);
void bubble_sort(node * * List, int val);
//////////////////////////////////////////////////////////////////////////////////////////
void append(node * * q, int num)
 {
    node * temp, * temp2;
    temp = * q;
    //temp= (node* )malloc(sizeof (node));
    if (temp == NULL) /* if the list is empty, create first node */
    {
        temp = (node * ) malloc(sizeof(struct node)); * q = temp;
    } else
    {
        temp2 = * q;
        while (temp2 -> link != NULL) 
        {
            temp2 = temp2 -> link;
        }
        temp = (node * ) malloc(sizeof(struct node));
        temp2 -> link = temp;
    }
    temp -> data = num;
    temp -> link = NULL;
}
///////////////////////////////////////////////////////////////////////
void displaylist(node * start) 
{
    visit = start;
    /* traverse the entire linked list */
    while (visit != NULL) 
    {
        printf("%d ", visit -> data);
        visit = visit -> link;
    }
}
/////////////////////////////////////////////////////////////////////////////////

/*
void bubble_sort(node **List,int size)
{
int i,j,temp;
node*first;
node*second;
node*final;
final=*List;
for(i=0;i<size-1;i++)
{
first=final;
second=first->link;
for(j=1;j<size;j++)
{

   if( first->data<second->data)
   {
        temp=first->data;
        first->data=second->data;
        second->data=temp;   
    }
   first=first->link;
   }
}
*List=first;
}   */
//////////////////////////////////////////////////////////////////////////////////////
void bubble_sort(node * * List, int size)
 {
    int i, j, temp;
    node * first;
    node * second;
    node * final;
    for (i = 0; i < size; i++) 
    {
        first = * List;
        for (j = 0; j < size - 1; j++) 
        {
            if (first -> data < first -> link -> data) 
            {
                temp = first -> data;
                first -> data = first -> link -> data;
                first -> link -> data = temp;
            }
            first = first -> link;
        }
    }

}

////////////////////////////////////////////////////////////////////////////////////////////
main() 
{
    start = NULL;
    int val, n, size;
    char ch;
    struct node * new;
    new = NULL;
    printf("\nEnter the size desired size of Linked list: \n");
    scanf("%d", & size);
    for (ch = 0; ch < size; ch++) 
    {
        printf("\nEnter a value: ");
        scanf("%d", & val);
        append( & new, val);
    }
    start = new;
    displaylist(start);
    printf("\nApplying Bubble sort on Linked list: \n");
    bubble_sort( & start, val);
    displaylist(start);
    printf("\n");
}

最佳答案

假设 Val 是列表中的节点数,您实际上不是对链表进行排序,而是将值从一个节点交换到另一个节点以对其进行排序。

bubble_sort( &start, size); change this as well should fix it(pass size not val)

试试这个。

void bubble_sort(node **List, int val)
{
int i,j,temp;
node *first;
node *second;
node *final;
for(i = 0; i < val; i++)
{
 first = *list
 for(j = 0; j < val-1; j++)
    {
        if(first->data < first->link->data)
        {
            temp = first->data;
            first->data = first->link->data;
            first->link->data = temp;    
        }
        first = first->link;
    }
}

}

关于c - 在链表上应用冒泡排序会在 c 中给出错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177399/

相关文章:

algorithm - 找到所有局部最大值的优化算法

R:计算两个顶点之间的单条最短路径

c - 如何在 printf 中隐藏前导零

c - 正则表达式匹配行(换行符除外)(FLEX、BISON)

ruby - 生成适合 Ruby 中概率分布的数字数组?

sorting - 对数字子字段的 GNU `sort(1)` 感到困惑

c - 按升序对堆栈进行排序?

javascript - 禁用 jQuery DataTables 中特定列的排序

c - 如何将模块化集成到我的 C 代码中?

C 初学者 : Can't use delay() in a simple C program