单链表的排序操作333

一道链表的排序操作,想了很久想不出来,求解答*#¥……%&!

img

img

仔细看题目中给出的《单链表的冒泡排序思想》,就差把伪代码都写给你了,你就一句一句的把中文翻译成c语言就行了,不用你想什么
你要是连语法都不会,那除了回去复习没有什么好办法

供参考:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

void CreateList(LinkList* L)
{
    int n , i;
    LinkList pL, pT;
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    pL = (*L);
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        pT = (LNode*)malloc(sizeof(LNode));
        pT->next = NULL;
        scanf("%d", &pT->data);
        pL->next = pT;
        pL = pT;
    }
}

void print(LinkList L)
{
    LinkList p = L;
    while (p->next){
        printf("%d ", p->next->data);
        p = p->next;
    }
    printf("\n");
}

void BubbleSort(LinkList L)//对链表进行冒泡排序
{
    LinkList pre, p,tail;
    tail = NULL;
    while (L->next != tail)
    {
        print(L);    //每循环一次,输出链表的结点移动变化
        pre = L;     //当前结点的前一个结点
        p = L->next; //当前结点
        while (p->next!=tail)//当前结点的下一个结点
        {
            if (p->data > p->next->data)
            {  //当前结点的值与下一个结点的值比较
                pre->next = p->next;
                p->next = pre->next->next;
                pre->next->next = p;
            }
            else
                p = p->next;
            pre = pre->next;
        }
        tail = p;//当前指针赋值给尾指针
    }
}

int main()
{
    LinkList L = NULL;
    CreateList(&L);
    BubbleSort(L);
    return 0;
}

非标准答案,仅供参考!谢谢!

img

img

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

typedef int ElemType;
typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;
} LNode, *LinkList;

void bubsort(LinkList head);
LinkList madeNode(ElemType data);
void insert(LinkList head, LinkList L);

int main()
{
    // 初创建头结点
    LNode *head = malloc(sizeof(LNode));
    if (!head)
        return -1;

    int n, data;

    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        scanf("%d", &data);
        // 创建结点
        LNode *p = madeNode(data);
        // 插入结点 尾部插入 
        insert(head, p);
    }

    fputc('\n', stdout);
    // 原链表遍历输出
    print(head);
    fputc('\n', stdout);
    // 排序以及分步输出
    bubsort(head);
    return 0;
}

// 输出链表
void print(LinkList head)
{
    LinkList p = head->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}

// 创建结点 
LinkList madeNode(ElemType data)
{
    LinkList tmp = malloc(sizeof(LNode));
    if (!tmp)
        return NULL;
    tmp->data = data;
    tmp->next = NULL;
    return tmp;
}


// 插入结点 尾部插入
void insert(LNode * head, LNode * L)
{
    LNode *p = head;
    while (p->next)
    {
        p = p->next;
    }
    p->next = L;
}

// 冒泡排序以及分步输出
void bubsort(LinkList head)
{
    if (!head)
        return;

    LinkList p1 = head, p2 = head, p0 = head;
    while (p2->next)
    {
        p2 = p2->next;
    }

    int flag = 1, tmp;
    for (; p1 != p2 && flag == 1; p1 = p1->next)
    {

        flag = 0;

        for (p0 = head; p0 != p2 && p0->next != NULL; p0 = p0->next)
        {
            if ((p0->next)->data < p0->data)
            {
                tmp = (p0->next)->data;
                (p0->next)->data = p0->data;
                p0->data = tmp;
                flag = 1;
            }
        }

        if (flag == 0)
            break;
        else
        {
            print(head);
            fputc('\n', stdout);
        }
    }
}