双向循环链表

来源:互联网 发布:电商软件开发价格 编辑:程序博客网 时间:2024/06/06 14:08
//双向循环链表#include <stdio.h>#include <stdlib.h>#include <stdbool.h>typedef int datatype;typedef struct doublelist{    datatype data;    struct doublelist *next,*prev;//多了个*prev}double_list,*double_plist;extern void doublelist_init(double_plist *H);extern void doublelist_insert_head(double_plist p,double_plist new);extern void doublelist_insert_tail(double_plist p,double_plist new);extern void doublelist_del(double_plist p);extern void doublelist_del_head(double_plist h);extern void doublelist_del_tail(double_plist h);extern bool is_empty_doublelist(double_plist h);extern void doublelist_show(double_plist h);extern void doublelist_sort(double_plist h);extern void doublelist_create(double_plist h);int main(void){    double_plist h;    doublelist_init(&h);    doublelist_create(h);    doublelist_sort(h);    return 0;}//初始化,传入指针的指针void doublelist_init(double_plist *H){    *H = (double_plist)malloc(sizeof(double_list));    if(NULL == *H)    {        perror("malloc failed");        exit(1);    }    (*H)->prev = *H;//指向自身    (*H)->next = *H;}   //插入在头结点后面/即表头void doublelist_insert_head(double_plist p,double_plist new){    new->next = p->next;    p->next->prev = new;    p->next = new;    new->prev = p;}//插入在头结点前面/即表尾void doublelist_insert_tail(double_plist p,double_plist new){    new->prev = p->prev;    p->prev->next = new;    p->prev = new;    new->next = p;}//删除自己void doublelist_del(double_plist p){    p->next->prev = p->prev;    p->prev->next = p->next;}//删除表头void doublelist_del_head(double_plist h){    doublelist_del(h->next);}//删除表尾void doublelist_del_tail(double_plist h){    doublelist_del(h->prev);}//判断空bool is_empty_doubelist(double_plist h){    if(h->next == h)        return true;    else        return false;}//遍历(双向循环链表)void doublelist_show(double_plist h){    double_plist t;    printf("|_|");    for(t=h->next;t!=h;t=t->next)//移动t        printf("----->%d",t->data);    printf("\n");}void doublelist_create(double_plist h){    int n,i;    double_plist new;    printf("请输入你要创建的个数:");    scanf("%d",&n);    for(i=0;i<n;i++)    {        new = (double_plist)malloc(sizeof(double_list));        if(NULL == new)        {            perror("malloc failed");            exit(1);        }        printf("请输入一个数据:");        scanf("%d",&new->data);//输入新结点数据        doublelist_insert_tail(h,new);//将新结点插入到表尾        doublelist_show(h);    }}void doublelist_sort(double_plist h){    double_plist p,t;    p = h->prev;    while(p != h)    {        if(p->data%2 == 1)            p = p->prev;//奇数不动        else        {            t = p;            p = p->prev;            doublelist_del(t);//剪切当前结点            doublelist_insert_tail(h,t);//插入到表尾            printf("-----after 升奇降偶-----\n");            doublelist_show(h);        }    }}
原创粉丝点击