线性表——双向链表(C语言)

本文详细介绍了如何使用C语言实现双向链表的插入和删除操作,包括初始化、插入指定位置节点以及删除指定索引节点的函数实现和示例应用。
摘要由CSDN通过智能技术生成
# include <stdio.h>
# include <stdlib.h>
 typedef int E;

 /**
  * 双向链表增删
  * @return
  */

 struct ListNode{
     E e;
     struct ListNode * next;  //指向下一节点的指针
     struct ListNode * prev;  //指向上一节点的指针
 };

 typedef struct ListNode * Node;

 //指针初始化
 void initNode(Node head){
     head -> next = head -> prev = NULL;
 }

 //插入操作
 _Bool insertNode(Node head,E e,int index){
     if(index < 1) return 0;
     while(--index){
         head = head -> next;
         if(head == NULL) return 0;
     }
     //此时head为其前驱节点

     Node node = malloc(sizeof(struct ListNode)); //创捷一个新的节点,并为其分配内存
     //处理请求失败
     if(node == NULL) return 0;
     node -> e = e;
     //首先处理后继节点
     if(head -> next){  //如果后继节点存在,则按流程
         node -> next = head -> next;
         head -> next -> prev = node;
     }else{  //如果后继节点不存在,则直接将新节点的后继指针置为NULL
         node -> next = NULL;
     }
     head -> next = node;
     node -> prev = head;

     return 1;

 }

 //删除操作
 _Bool deleteNode(Node head,int index){
     if(index < 1) return 0;
     //寻找前驱节点
     while(--index){
         head = head -> next;
         if(head == NULL) return 0;
     }
     //此时head为前驱节点

     //不能删除不存在的节点
     if(head -> next == NULL) return 0;

     if(head -> next -> next){  //待删除节点不是末尾节点
         head ->next = head -> next -> next;
         head -> next -> prev = head;
     }else{  //待删除节点是末尾节点
         head -> next = NULL;
     }

     return 1;

 }

 //打印链表
 void printNode(Node head){
     while(head -> next){
         head = head -> next;
         printf("%d ",head -> e);
     }
     printf("\n");
 }
 int main(){

     int n,m,e,k;
     struct ListNode head;

     initNode(&head);

     //插入n个节点
     scanf("%d",&n);
     for(int i = 0;i < n;i++){
         insertNode(&head,(i+1)*10,i+1);
     }
     printNode(&head);

     //在第m个位置插入e
     scanf("%d%d",&m,&e);
     insertNode(&head,e,m);
     printNode(&head);

     //删除第k个节点
     scanf("%d",&k);
     deleteNode(&head,k);
     printNode(&head);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值