使用C对链表进行排序



我试图排序链表,但不能做到这一点。下面是我的代码。有人能帮我吗?我也见过一些程序,它们对链表进行排序,它们的方法也是这样的。

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next;
};
int push(struct node **h, int x)
{
    struct node *temp = (struct node*)malloc(sizeof(struct node));
    temp->data = x;
    temp->next = *h;
*h = temp;
    return 0;
}
void print(struct node *head)
{
    struct node *temp = head;
    while(temp != NULL)
    {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("n");
}
void sort(struct node **h)
{
    int i,j,a;
    struct node *temp1;
    struct node *temp2;
    for(temp1=*h;temp1!=NULL;temp1=temp1->next)
    {
        for(temp2=temp1->next;temp2!=NULL;temp2=temp2->next)
        {
            a = temp1->data;
            temp1->data = temp2->data;
            temp2->data = a;
        }
    }
}
int main()
{
    struct node * head = NULL;
    push(&head,5);
    push(&head,4);
    push(&head,6);
    push(&head,2);
    push(&head,9);
    printf("List is : ");
    print(head);
    sort(&head);
    printf("after sorting list is : ");
    print(head);
    return 0;
}

下面是我得到的输出:

List is : 9 2 6 4 5 
after sorting list is : 5 4 6 2 9

无论如何都要切换元素。首先比较它们,如果temp2小于temp1,则交换它们:

void sort(struct node **h)
{
    int i,j,a;
    struct node *temp1;
    struct node *temp2;
    for(temp1=*h;temp1!=NULL;temp1=temp1->next)
      {
        for(temp2=temp1->next;temp2!=NULL;temp2=temp2->next)
          { 
            if(temp2->data < temp1->data)
              {
                a = temp1->data;
                temp1->data = temp2->data;
                temp2->data = a;
              }
           }
       }
}

在冒泡排序中,您忘记了交换条件。在我看来,我建议插入排序

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next;
};
int push(struct node **h, int x)
{
    struct node *temp = (struct node*)malloc(sizeof(struct node));
    temp->data = x;
    if (*h == NULL) {
        temp->next = *h;
        *h = temp;
    } else {
        struct node *tmp = *h;
        struct node *prev = NULL;
        while (1) {
            if (tmp == NULL || tmp->data >= temp->data)
                break;
            prev = tmp;
            tmp = tmp->next; 
        }
        temp->next = tmp;
        if (prev != NULL)
            prev->next = temp;
        else 
            *h = temp;
    }
    return 0;
}
void print(struct node *head)
{
    struct node *temp = head;
    while(temp != NULL)
    {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("n");
}
int main()
{
    struct node * head = NULL;
    push(&head,5);
    push(&head,4);
    push(&head,6);
    push(&head,2);
    push(&head,9);
    printf("List is : ");
    print(head);
    //sort(&head);
    printf("after sorting list is : ");
    print(head);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新