双向链表的实现

#include<stdio.h>
#include<stdlib.h>
//数据结点
typedef struct binode
{
    int data;
    struct binode* next;//指向下一个
    struct binode* prev;//指向前一个
}BiNode;

//头结点
typedef struct bilist
{
    BiNode* first;
    BiNode* last;
}BiList;

void Insert_List(BiList* L,BiNode* q);

//基本操作:增、删、改、查

//创建一个带头结点的双向链表

/*
    一、创建一个双向链表的头结点
            空链表,没有数据结点
        返回值:
            返回双向链表头结点的指针
*/
BiList* create_bilist(void)
{
    BiList* L=(BiList*)malloc(sizeof(BiList));
    L->first=NULL;
    L->last=NULL;
    return L;
}

/*
    Create_List:创建一个单链表
    @L:双向链表的头结点
    返回值:
        无
*/
void Create_List(BiList* L)
{
    int data;
    while (1)
    {
        scanf("%d",&data);
        if(data == 999)
        {
            break;
        }
        BiNode* s=(BiNode*)malloc(sizeof(BiNode));
        s->data=data;
        s->next=NULL;
        s->prev=NULL;
        if(L->first == NULL)
        {
            L->first=s;
            L->last=s;
        }
        else
        {
            s->prev = L->last;
            L->last->next = s;
            L->last = s;
             //Insert_List(L,s);
        }
    }   
}


/*
    Insert_List:在升序双向链表中插入一个数,仍然是升序。
    @L:双向链表的头结点
    @q:想要插入的结点
    返回值:
        无
*/
void Insert_List(BiList* L,BiNode* q)
{
    if(L->first == NULL)
    {
        return;
    }
    BiNode* p = L->first;
    while (p)
    {
        if(p->data>q->data)
        {
            break;
        }
        p=p->next;
    }
    if(p == NULL)
    {
        L->last->next = q;
        q->prev = L->last;
        L->last = q;
    }
    else
    {
        if(L->first==p)//第一个就是要插入的位置
        {
            p->prev = q;
            q->next = p;
            L->first =q;
        }
        else
        {
            q->next = p;
            p->prev->next = q;
            q->prev =p->prev;
            p->prev = q;
        }
    }
    
}


/*
    输出双向链表每个结点的值
*/
void Printf_BiList(BiList* L)
{
    BiNode* p=L->first;
    while (p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

/*
    Delete_List_data:删除一个双向链表的结点
    @L:要操作的双链表
    @data:要删除结点的值
    返回值:
        无
*/
void Delete_List_data(BiList* L,int data)
{
    if(L->first == NULL)
    {
        return;
    }
    BiNode* pk = L->first;
    while (pk)
    {
        if(pk->data == data)
        {
            break;
        }
        pk = pk->next;
    }
    if(pk == NULL)//要删除的结点在尾结点
    {
        printf("No\n");
        return;
    }
    else
    {
        if(pk == L->first)
        {
            L->first = pk->next;//要删除的结点在最前面
            pk->next = NULL;
        }
        else if(pk==L->last)
        {
            pk->prev->next =pk->next;
            L->last = pk->prev;
        }
        else
        {
            pk->prev->next =pk->next;
            pk->next->prev =pk->prev;
            pk->next = NULL;
        }
        free(pk);
    }
}
/*
    Delete_List:删除整个双向链表的结点(销毁链表)
    @L:要销毁的链表的头结点
    返回值:
        无
*/
void Delete_List(BiList* L)
{
    BiNode* pk = L->first;
    if(pk == NULL)
    {
        return;
    }
    while (pk)
    {
        L->first =L->first->next;
        pk->next = NULL;
        pk->prev = NULL;
        free(pk);
        pk=L->first;
    }
    printf("Delete success\n");
}

/*
    elete_All_data:删除整个链表中的data
    @L:双向链表的头结点
    @data:要删除的数据
    返回值:
        无
*/
void Delete_All_data(BiList* L,int data)
{
    BiNode* pk = L->first;
    while (L->first && pk->data == data)
    {
        L->first = L->first->next;
        pk->next = NULL;
        free(pk);
        pk = L->first;
    }
    while (pk)
    {
        if(pk->data == data)
        {
            if(pk->next == NULL)
            {
                pk->prev->next = pk->next;
                break;
            }
            BiNode* p;
            pk->prev->next = pk->next;
            pk->next->prev = pk->prev;
            p = pk->next;
            pk->next = NULL;
            free(pk);
            pk = p;
            continue;
        }
        pk = pk->next;
    }
}
int main()
{
    // int data;
    // printf("Input:\n");
    // scanf("%d",&data);
    BiList* L=create_bilist();
    Create_List(L);
    //Delete_All_data(L,data);
    Delete_List(L);
    Printf_BiList(L);
    return 0;
}
posted @   风恬月淡时  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示