双向循环链表的插入与删除

122 篇文章 1 订阅
31 篇文章 1 订阅

关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧


//双向循环链表的插入与删除

typedef struct node{
    int data;
    struct node *prev, *next;
}DNode, *DLinkList;


//在带有头结点双向循环链表中第1个数据域内容为x的结点右边插入一个数据信息为item的新结点
void insert(DLinkList list, int x, int data)
{
    DNode *p = list->next, *q = NULL;//首先将q指向头结点后面的那个结点


    if (NULL == list) {
return ;
    }


    while (p != list && p->data != x) //寻找第一个满足条件的结点
    {
        p = p->next;
    } 
    
    if (p == list) //如果不存在满足插入条件的结点,则返回
    {
        printf( "there is no x element in the list" );
        return ; 
    } 


    q = (DNode *)malloc(sizeof(DNode)); //申请一个新的结点
    if (q == NULL) //判断内存分配是否成功
    {
        printf( "malloc error!" );
        return ; 
    }
    memset(q, 0, sizeof(q));
    
    q->data = data;
    q->prev = p; //插入新的结点
    q->next = p->next;
    p->next->prev = q;
    p->next = q;
}


2、从带有头结点双向循环链表中删除第1个数据域内容为x的结点
void delete(DLinkList list, int x)
{
    DNode *q = list->next;///首先q指向头结点后面的那个结点
    
    if (NULL == list) {
   return ;
    }
    
    while (q != list && q->data != x) //找到要删除的结点
    {
        q = q->next;
    } 
    
    if (q == list) //如果不存在满足条件的结点,返回-1
    {
        printf( "there is no matched element in the list" );
        return ;
    }


    q->prev->next = q->next; //删除结点
    q->next->prev = q->prev;
    
    free(q); //释放结点的内存空间
    q = NULL;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值