排序

冒泡排序

  • 单链表实现并且为交点交换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include<stdio.h>
    #include<malloc.h>
    //结点def
    typedef struct node {
    int data;
    struct node *next;
    } Node,*Linklist;
    //构建链表头
    void IniList(Linklist *L) {
    *L=(Linklist)malloc(sizeof(Node));
    (*L)->next=NULL;
    }
    //读入数据进链表
    void CreList(Linklist *L) {
    int i,n,t;
    Linklist r,s;
    IniList(L);
    r=*L;
    scanf("%d",&n);
    for(i=1; i<=n; i++) {
    scanf("%d",&t);
    s=(Linklist)malloc(sizeof(Node));
    s->data=t;
    s->next=r->next;
    r->next=s;
    r=s;
    }

    }
    //对链表进行排序
    void maopao(Linklist L) {
    //排序中没有修改头节点指针值,只是修改指针内容head->next的值
    Linklist pre, p, tail, temp;
    tail=NULL;
    pre=L;
    Linklist head = L;
    while((head->next->next)!=tail) { //(head->next)!=tail同样适用 ,多执行最后一个步比较
    p=head->next;
    pre=head;
    while(p->next!=tail) {
    if((p->data)>(p->next->data)) {
    /* pre->next=p->next; //交换节点方法一
    p->next = p->next->next;
    pre->next->next = p;
    p = pre->next; */

    pre->next=p->next; //交换节点方法二
    temp=p->next->next;
    p->next->next=p;
    p->next=temp;
    p=pre->next; //p回退一个节点

    }
    p=p->next; //p再前进一个节点
    pre=pre->next;
    }
    tail=p;
    }
    }
    //打印链表
    void PriList(Linklist L) {
    Linklist p=L->next;
    while(p) {
    printf("%d ",p->data);
    p=p->next;
    }

    }
    int main() {
    Linklist L;
    CreList(&L); //创建链表
    maopao(L); //你要填的排序
    printf("\n");
    PriList(L); //输出
    return 0;
    }
------ The Happy Ending ------