冒泡排序在双向循环链表中的一种体现

冒泡里面的换结点:

void bobble_sort_val(node *head)
{
    node *p = head->next;
    int len = 0;
    int i, j;
    while (p != head)
    {
        p = p->next;
        len++;
    }

    node *log = head->next;
    node *temp = head;

    for (i = 0; i < len - 1; i++)
    {
        //刷新一次位置
        log = head->next;   
        for (j = 0; j < len - i - 1; j++)
        {
            
            if (log->data > log->next->data)
            {
                //记录位置
                // log->prev log temp temp->next
                temp = log->next;

                //断开log节点
                log->prev->next = log->next;
                log->next->prev = log->prev;

                //连接log节点
                log->prev = temp;
                log->next = temp->next;
                temp->next->prev = log;
                temp->next = log;

                //回退位置,log比之前前进了一步
                log = log->prev;

            }
            //遍历节点
            log = log->next;
        }
        
    }
}

这里贴出写的全部代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
    int data;
    struct node *next;
    struct node *prev;
} node;

node *initList(void);
node *insert(node *head, int num);
node *insert_end(node *head, int num);
node *insert_sort(node *head, int num);
void display(node *head);
node *find_node(node *head, int find_data);
node *dele_node(node *head, int del_data);
node *modify_data(node *head, int data, int new_data);
void destroy(node *head);

node *deuion(node *head, int de_data);
void bobble_sort(node *head);
void bobble_sort_val(node *head);
void insert_p(node *head, node *new);

int main(void)
{
    char ch;
    int find_data, new_data, del_data, data;
    int num;
    node *head1, *head2, *head3;
    // head变量用于存储头节点地址
    node *head, *new, *find, *del;
    node *pos;
    head = initList();
    if (head == NULL)
        return -1;
    while (1)
    {
        printf("a)insert  d)delete  f)find  p)print  q)quit\n");
        // 在获取字符之前,缓冲区为空
        scanf("%c", &ch);
        if (ch == 'q')
            break;
        switch (ch)
        {
        case 'a':
            printf("enter your number:");
            scanf("%d", &num);
            pos = insert(head, num);
            if (pos == NULL)
            {
                break;
            }
            printf("new node adress:%p\n", pos);
            printf("insert sucess\n");
            break;

        case 'd':
            printf("enter your need to delete number:");
            scanf("%d", &del_data);
            del = dele_node(head, del_data);
            if (del == NULL)
            {
                printf("delate is failure\n");
            }
            else
            {
                printf("deltete sucess,node adress:%p\n", del);
            }
            break;

        case 'f':
            printf("enter you need find number:");
            scanf("%d", &find_data);

            find = find_node(head, find_data);
            if (find == NULL)
            {
                printf("non number\n");
            }
            else
            {
                printf("find sucess,node adress:%p\n", find);
            }
            break;

        case 'p':
            display(head);
            break;
        default:
            break;
        }
        // 循环清空缓冲区
        while (getchar() != '\n');
    }
    destroy(head);
    return 0;
}

node *initList(void)
{
    node *p = (node *)malloc(sizeof(node));
    if (p == NULL)
    {
        printf("out of space!\n");
    }
    p->next = p;
    p->prev = p;
    return p;
}

node *insert(node *head, int num)
{
    node *new = initList();
    if (new == NULL)
    {
        printf("out of space!\n");
        return NULL;
    }
    new->data = num;

    new->next = head->next;
    new->prev = head;
    head->next->prev = new;
    head->next = new;

    return new;
}

node *insert_end(node *head, int num)
{
    node *new = initList();
    if (new == NULL)
    {
        printf("out of space!\n");
        return NULL;
    }
    new->data = num;

    new->next = head;
    new->prev = head->prev;
    head->prev->next = new;
    head->prev = new;
    return new;
}

void display(node *head)
{
     //bobble_sort(head);
    bobble_sort_val(head);
    node *p = head->next;
    while (p != head)
    {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}

node *find_node(node *head, int find_data)
{
    node *p = head->next;
    while (p != head)
    {
        if (p->data == find_data)
        {
            return p;
        }
        else
        {
            p = p->next;
        }
    }
    return NULL;
}

node *dele_node(node *head, int del_data)
{
    node *del = find_node(head, del_data);
    node *p = del;

    del->next->prev = del->prev;
    del->prev->next = del->next;

    del->next = del;
    del->prev = del;
    free(del);
    return p;
}

node *modify_data(node *head, int data, int new_data)
{
    node *mod = find_node(head, data);
    if (mod == NULL)
    {
        return mod;
    }
    mod->data = new_data;
    return mod;
}

void destroy(node *head)
{
    node *p = head->next;
    node *temp = p->next;
    while (p != head)
    {
        free(p);
        p = temp;
        temp = p->next;
    }
    free(head);
}

node *insert_sort(node *head, int num)
{
    node *new = initList();
    node *node_1 = head->next;
    node *p = find_node(head, num);
    if (p == NULL)
    {
        printf("similar number!\n");
        return NULL;
    }
    while (node_1->data < num)
    {
        node_1 = node_1->next;
    }

    new->data = num;

    new->next = node_1;
    new->prev = node_1->prev;
    node_1->prev->next = new;
    node_1->prev = new;
    return new;
}

node *deuion(node *head, int de_data)
{
    node *del = find_node(head, de_data);

    del->next->prev = del->prev;
    del->prev->next = del->next;

    del->next = del;
    del->prev = del;
    return del;
}

void bobble_sort(node *head)
{
    node *p = head->next;
    int len = 0;
    int i, j;
    while (p != head)
    {
        p = p->next;
        len++;
    }

    node *log = head->next;
    node *tmp;

    for (i = 0; i < len - 1; i++)
    {
        log = head->next;
        for (j = 0; j < len - i - 1; j++)
        {
            if (log->data > log->next->data)
            {
                tmp = log->next;
                log = deuion(head, log->data);
                insert_p(tmp, log);
            }
            else
            {
                log = log->next;
            }
        }
    }
}

void bobble_sort_val(node *head)
{
    node *p = head->next;
    int len = 0;
    int i, j;
    while (p != head)
    {
        p = p->next;
        len++;
    }

    node *log = head->next;
    node *temp = head;

    for (i = 0; i < len - 1; i++)
    {
        //刷新一次位置
        log = head->next;   
        for (j = 0; j < len - i - 1; j++)
        {
            
            if (log->data > log->next->data)
            {
                //记录位置
                // log->prev log temp temp->next
                temp = log->next;

                //断开log节点
                log->prev->next = log->next;
                log->next->prev = log->prev;

                //连接log节点
                log->prev = temp;
                log->next = temp->next;
                temp->next->prev = log;
                temp->next = log;

                //回退位置,log比之前前进了一步
                log = log->prev;

            }
            //遍历节点
            log = log->next;
        }
        
    }
}
void insert_p(node * head, node * new)
{

    node *p = head->next;
    new->next = p;
    new->prev = head;
    p->prev = new;
    head->next = new;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值