首页 > 其他分享 >循环双向链表,精简代码秒懂!(C语言)

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

时间:2024-03-14 13:00:45浏览次数:19  
标签:Node tmp head return index next 链表 精简 C语言

#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));
}

标签:Node,tmp,head,return,index,next,链表,精简,C语言
From: https://blog.csdn.net/qq_63456518/article/details/136707165

相关文章

  • L2-002 链表去重(25分)
    代码真的好烂啊。一个元素加入之前,修改集合中(va,vb)最后一个元素的下一个地址为当前元素的地址。然后我是把(元素地址,下一个地址)和(元素的值)拆开放到两个集合了,放一个里面有点麻烦不太会处理。#include<bits/stdc++.h>usingnamespacestd;intvis[10010];//是否已经来过ve......
  • c语言 线性搜索算法
            线性搜索被定义为一种顺序搜索算法,从一端开始,遍历列表中的每个元素,直到找到所需的元素,否则搜索将继续,直到数据集的末尾。 线性搜索算法 线性搜索算法如何工作?在线性搜索算法中:        1、每个元素都被视为该键的潜在匹配项并进行相同检查。 ......
  • C语言项目--**客户信息管理系统
    C语言项目–客户信息管理系统实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。1.1需求说明1.1.1主菜单进入系统,展示主菜单,输入各功能对应的数字编号选择要进行的操作,如下图:1.1.2添加客户输入1,进入“添加客户”界面,需要填写姓名、性......
  • 实验1 C语言输入输出和简单程序编写
    #include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");printf("o\n");printf("<H>\n");printf("II\n");return0;......
  • C语言学习
    导言C语言是一门编译型语言,是目前在国际上十分通用的语言,有它的国际标准比如C89,C90,C99,C11截至目前使用最多的是C89,C90;第一个C语言程序1.怎么写?a.创建一个项目b.创建一个源文件c.写代码d.编译代码【注(a,b)方法已在发表的第一篇文章中提到,不了解的可以去浏览】c.想写......
  • 链表中的经典问题——移除链表元素I
    移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。 题解一,迭代法:解题思路:    1.首先需要考虑,链表为空或head节点的值等于val的情况,这里可以引入一个虚拟的哑节点dummy_node,该......
  • leetcode 24.两两交换链表中的节点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]提......
  • leetcode206. 反转链表
    一、链表(LinkedList)链表,是线性表的链式存储结构。一个链表中有若干个结点,每个结点都包含数据域和地址域两部分。数据域用于存储元素,地址域用于存储前驱或后继的地址。单链表:每个结点只有一个地址域的线性链表;双链表:每个结点都有两个地址域,分别指向前驱结点和后继结点。 ......
  • 【华为OD】C卷真题 100分:堆内存申请 C语言代码实现[思路+代码]
     C++、python、java代码:【华为OD】C卷真题100分:堆内存申请C/C++代码实现[思路+代码]-CSDN博客【华为OD】C卷真题100分:堆内存申请Python代码实现[思路+代码]-CSDN博客【华为OD】C卷真题100分:堆内存申请Java代码实现[思路+代码]_有一个总空间为100字节的堆,现要从中新......
  • 实验一_C语言输入输出和简单程序应用编程实验报告
    实验任务一task1_1 1#include<stdio.h>2#include<stdlib.h>3intmain()4{5printf("0\n");6printf("<H>\n");7printf("II\n");8printf("0\n");9printf(&qu......