数据结构 - 链式存储结构-双向链表

AreayGK 2019-11-05

链式存储结构-双向链表

//duolist.c
#include <stdlib.h>
#include <stdio.h>
//[email protected]
//
//类型
typedef struct node{
    int data;
    struct node * front;
    struct node * next;
}duolist_t;
//
//创建
duolist_t* create_duolist()
{
    duolist_t* list=malloc(sizeof(duolist_t));

    list->front=NULL;
    list->next=malloc(sizeof(duolist_t));

    list->next->front=list;
    list->next->next=NULL;

    return list;
}
//判空
int isnull(duolist_t* list)
{
    if(list==NULL)
        return 0;

    return list->next->next==NULL;
}
//插入
int insert_duolist(duolist_t* list,int data)
{
    //1
    if(list==NULL)
        return -1;

    //2
    duolist_t* newnode=malloc(sizeof(duolist_t));
    newnode->data=data;

    //3
    newnode->front=list;
    newnode->next=list->next;

    //4
    newnode->front->next=newnode;
    newnode->next->front=newnode;

    return 0;
}
//删除
//
int delete_duolist(duolist_t* list)
{
    //1
    if(list==NULL||isnull(list))
        return -1;

    //2
    duolist_t* temp=list->next;

    //3
    temp->front->next=temp->next;
    temp->next->front=temp->front;

    //4
    free(temp);

    return 0;
}
//查找  返回查找到节点的 地址 (非前一个  )  可以使用   ->front 来定位前一个
duolist_t* locate_duolist(duolist_t* list,int data)
{
    if(list==NULL||isnull(list))
        return NULL;

    while(list->next->next!=NULL)
    {
        if(list->next->data==data)
            return list->next;

        list=list->next;
    }

    return NULL;
}
//
int change_duolist(duolist_t* list, int data)
{
    if(list==NULL)
        return -1;

    list->data=data;
    return 0;
}
//打印
int print_duolist(duolist_t* list)
{
    if(list==NULL||isnull(list))
        return -1;

    while(list->next->next!=NULL)
    {
        printf("%3d ",list->next->data);
        list=list->next;
    }
    printf("\n");

    return 0;
}
//逆打印
int reprint_duolist(duolist_t* list)
{
    if(list==NULL||isnull(list))
        return -1;

    while(list->next->next!=NULL)
    {
    
        list=list->next;
    }
    // 在尾节点  前一个节点
    list=list->next;
    
    while(list->front->front!=NULL)
    {
        printf("%3d ",list->front->data);
        list=list->front;
    }
    printf("\n");

    return 0;
}
//长度
int length_duolsit(duolist_t* list)
{
    if(list==NULL||isnull(list))
        return 0;

    int sum=0;

    while(list->next->next!=NULL)
    {
        sum++;
        list=list->next;
    }

    return sum;
}
//清空
int clear_duolist(duolist_t* list)
{
    if(list==NULL||isnull(list))
        return -1;
    

    while(!isnull(list))
    {
        delete_duolist(list);
        
    }

    return 0;
}
//销毁
int destroy_duolist(duolist_t* list)
{
    if(list==NULL)
        return -1;

    if(!isnull(list))
        clear_duolist(list);

    free(list->next);
    free(list);
    return 0;
}

int main(int argc, const char *argv[])
{
    duolist_t* list=create_duolist();

    int i;

    for(i=1;i<=20;i++)
    {
        insert_duolist(list,i);
        print_duolist(list);
    
    }
    change_duolist(locate_duolist(list,15),250);
    print_duolist(list);

    insert_duolist(locate_duolist(list,250)->front,15);
    print_duolist(list);

    delete_duolist(locate_duolist(list,250)->front);
    print_duolist(list);

    reprint_duolist(list);

    printf("length_duolsit:%d\n",length_duolsit(list));
    clear_duolist(list);
    
    printf("length_duolsit:%d\n",length_duolsit(list));

    destroy_duolist(list);

#if 0
    for(i=1;i<=20;i++)
    {
        delete_duolist(list);
        print_duolist(list);
    }
#endif
    return 0;
}