双向链表的实现

发布时间 2023-07-22 15:30:09作者: 风恬月淡时
// 带头节点的双链表

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

typedef struct DNode
{
    int data;
    struct DNode *prior;
    struct DNode *next;
}DNode;

// 初始化头结点

DNode *Init_DLinkList()
{
    DNode* L;
    L=(DNode*)malloc(sizeof(DNode));
    L->data=0;
    L->prior=NULL;       //头置零
    L->next=NULL;       //尾置零,暂时还没后续结点
}

//打印列表的函数

void Print_List(DNode* p)
{
    DNode* node = p->next;
    while (node)
    {
        printf("%d ",node->data);
        node=node->next;
    }
    
}

//双链表的建立
void Bulid_DLinkList(DNode* p)
{
    int data;
    scanf("%d",&data);//输入要存储的数据
    DNode *s,*r;
    r=p;
    while (data!=999)
    {
        s=(DNode*)malloc(sizeof(DNode));//开辟一个新的结点
        s->data=data;
        s->next=NULL;//(NULL)
        s->prior=p;
        p->next=s;
        p=s;
        scanf("%d",&data);
    }
}

//双链表的插入
int Insert_List(DNode* p,int i,int data)//在双链表的第i个元素插入data
{
    DNode* s=(DNode*)malloc(sizeof(DNode));//待插入的结点
    DNode* q;
    q=p;//先将头结点的地址保存。
    for(int j=0;((j<i-1)&&(q->next!=NULL));j++)//循环找到第i-1个结点
    {
        q=q->next;

    }
    if((i==0)) //不满足条件
    {
        return 0;
    }
    else
    {
        s->data=data;
        s->next=q->next;//将s的后继指向原来的i节点
        q->next=s;
        s->prior=q;
        s=q;
    }
}


//双链表的删除

void Delete_List(DNode* p,int i)//将第i个结点删除
{
    DNode* q;
    q=p;
    for(int j=0;j<i-1;j++)
    {
        q=q->next;
    }
    DNode* s;//零时保存要删除的结点
    s=q->next;
    q->next=s->next;
    s->next->prior=q;
    free(s);
    
}

int main()
{
    DNode* L=Init_DLinkList();
    Bulid_DLinkList(L);
    Insert_List(L,1,50);
    Delete_List(L,3);
    Print_List(L);
    return 0;

}