第十七天

//练习了双向循环链表的头插,尾插,中间插入(前、后), 释放链表,节点,边插入边排序,插入节点的功能

 

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

struct dnode
{
    int num;

    struct dnode * next;
    struct dnode * prior;
};

typedef struct dnode Dnode;
typedef struct dnode * Link;

void is_malloc_ok(Link node)
{
    if(node == NULL)
    {
        printf("malloc error!\n");
        exit(-1);
    }
}

void create_node(Link * node)
{
    *node = (Link)malloc(sizeof(Dnode));

    is_malloc_ok(*node);
}

void create_head(Link * head)
{
    create_node(head);

    (*head)->next = (*head)->prior = *head;
}

void insert_node_head(Link head, Link new_node)
{
    Link p;
    p = head;

    new_node->prior = p;
    new_node->next = p->next;
    p->next = new_node;
    new_node->next->prior = new_node;
}

void insert_node_tail(Link head, Link new_node)
{
    Link p;
    p = head;

    new_node->prior = p->prior;
    new_node->next = p;
    p->prior->next = new_node;
    p->prior = new_node;
}

void insert_midh(Link head, int m, Link new_node)     //n:数
{
    Link p;
    p = head->next;

    while(p != head && p->num != m)    //插在p前面
    {
        p = p->next;
    }

    new_node->next = p;
    new_node->prior = p->prior;
    p->prior->next = new_node;
    p->prior = new_node;
}


void insert_midt(Link head, int m, Link new_node)     //n:数
{
    Link p;
    p = head;

    while(p->next != head && p->num != m)    //插在p后面
    {
        p = p->next;
    }

    new_node->next = p->next;
    new_node->prior = p;
    p->next->prior = new_node;
    p->next = new_node;
}

void insert_sort(Link head, Link new_node)
{
    Link p;
    p = head->next;

    while(p != head && new_node->num > p->num)   //插在p前面   
    {
        p = p->next;
    }

    new_node->next = p;
    new_node->prior = p->prior;
    p->prior->next = new_node;
    p->prior = new_node;
}

void delete_node(Link head, int k)
{
    Link p;
    p = head->next;

    while(p != head && p->num != k)
    {
        p = p->next;
    }

    p->prior->next = p->next;
    p->next->prior = p->prior;
}



void display_link(Link head)
{
    Link p;

    if(head == NULL)
    {
        printf("link is empty!\n");
        return;
    }
    p = head->next;

    while(p != head)
    {
        printf("%d\n", p->num);
        p = p->next;
    }
}

void release_node(Link head)
{
    Link p;
    Link q;
    p = head->next;
    q = p;


    while(p != head)
    {
        q = p->next;
        p->next->prior = p->prior;
        p->prior->next = p->next;
        free(p);
        p = q;
    }
}

void release_link(Link * head)
{
    Link p;
    p = *head;

    release_node(*head);

    (*head)->next = NULL;
    *head = (*head)->next;

    free(p);
}

int main()
{

    srand((unsigned)time(NULL));
    int i;
    //int m, n;
    int k;
    Link head = NULL;
    Link new_node = NULL;

    create_head(&head);

    for(i = 0; i < 10; i++)
    {
        create_node(&new_node);

        new_node->num = i + 1;
        new_node->num = rand() % 100;

        //insert_node_head(head, new_node);//前插
        //insert_node_tail(head, new_node);//后插
        insert_sort(head, new_node);
    }

    display_link(head);

    /*printf("输入要插入的数和插入位置:");
    scanf("%d%d", &n, &m);

    create_node(&new_node);
    new_node->num = n;
    insert_midt(head, m, new_node);

    display_link(head);
    */

    printf("选择要删除的数:");
    scanf("%d", &k);

    delete_node(head, k);
    
    display_link(head);

    release_link(&head);

    display_link(head);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值