循环双向链表,精简代码秒懂!(C语言)

本文详细介绍了如何在C语言中实现一个循环双链表,包括链表的初始化、插入元素、删除元素、查询链表长度以及相关函数的实现和使用示例。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
typedef int E;

/**
 * 循环双链表
 * 初始化
 * 插入元素
 * 删除元素
 * 求链表总长
 * @return
 */

struct ArrayNode{
    E e;
    struct ArrayNode * prev;
    struct ArrayNode * next;
};

typedef struct ArrayNode * Node;

//初始化
_Bool initNode(Node head){
    head -> next = head -> prev = head;
    return 1;
}

//插入链表
_Bool insertNode(Node head,E e,int index){
    if(index < 1) return 0;
    Node tmp = head;  //作为结束标志
    //寻找前驱节点
    while(--index){
        head = head -> next;
        if(head == tmp) return 0;
    }
    Node newNode = malloc(sizeof(struct ArrayNode));
    if(newNode == NULL) return 0;
    newNode -> e = e;
    newNode -> next = head -> next;
    head -> next -> prev = newNode;
    head -> next = newNode;
    newNode -> prev = head;
    return 1;
}

//删除第index位置的链表
_Bool deleteNode(Node head,int index){
    if(index < 1) return 0;
    //寻找前驱节点
    Node tmp = head;
    while(--index){
        head = head -> next;
        if(head == tmp) return 0;
    }
    if(head -> next == tmp) return 0;
    Node node = head -> next;
    head -> next -> next -> prev = head;
    head -> next = head -> next -> next;
    free(node);
    return 1;
}

//打印链表第n个位置的前后驱节点
void getNodeE(Node head,int index){
    if(index < 1) printf("ERROR");
    Node tmp = head;
    while(--index){
        head = head -> next;
        if(head == tmp) printf("ERROR");
    }
    head = head -> next;
    //此时的head是该位置的节点
    printf("改位置的前驱节点元素:%d;后驱节点元素:%d\n",head -> prev -> e,head -> next -> e);
}

//求链表总长
int longNode(Node head){
    int count = 0;
    Node tmp = head->next;  // 从头节点的下一个节点开始遍历
    while (tmp != head) {  // 判断是否回到了头节点
        count++;
        tmp = tmp->next;
    }
    return count;
}

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

int main(){
    struct ArrayNode head;
    initNode(&head);
    for(int i = 0; i < 10;i++){
        insertNode(&head,(i+1)*10,i+1);
    }
    printNode(&head);
    printf("链表总长:%d\n",longNode(&head));
    getNodeE(&head,9);
    deleteNode(&head,7);
    printNode(&head);
    printf("链表总长:%d\n",longNode(&head));
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值