当前位置: 首页 > news >正文

数据结构-双向链表

头文件

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
enum passble{SUCCESS,FALSE=-1};
typedef char datatype;
//双向链表节点结构体
typedef struct Node
{//数据域: 数据元素
datatype data;
//指针域: 上一个节点的地址
struct Node *prev;
//指针域:下一个节点的地址
struct Node *next;
}*Doublelink;

Doublelink create_node();
Doublelink insert_head(datatype element,Doublelink head);
void output(Doublelink head,int n);
Doublelink head_delete(Doublelink head);
Doublelink insert_rear(Doublelink head,datatype element);
doublelink rear_delete(doublelink head,datatype element);

#endif
~        

1双向链表

#include "head.h"
//创建新节点
Doublelink create_node()
{
                Doublelink s=(Doublelink)malloc(sizeof(struct Node));
        if(NULL==s)
        {
                return NULL;
        }
        //新节点的数据与初始化
        s->data=0;
        //新节点的两个指针域
        s->next=s->prev=NULL;
        return s;
}
//头插
Doublelink insert_head(datatype element,Doublelink head)
{
        //创建一个新节点
        Doublelink s=create_node();
        s->data=element;
        //1.链表为空
        if(NULL==head)
        head=s;
        else
        {//2.链表存在多个节点>=1
        s->next=head;
        head->prev=s;
        head=s;
        return head;
        }
}
//打印
void output(Doublelink head,int n)
{
        //1.判断链表是否为空
        if(NULL==head)
        return;
        //2.正向遍历

                Doublelink p=head;
        if(n==1)
        {
                while(p->next!=NULL)//最后一个节点的数据域不打印
                {
                        printf("%c",p->data);
                        p=p->next;
                }
                        printf("%c\n",p->data);
        }
        else
        {
                //逆向遍历
                while(p!=NULL)
                {
                        printf("%c",p->data);
                        p=p->prev;
                        putchar(10);
                }
        }
}
//头删
Doublelink head_delete(Doublelink head)
{
    if(NULL==head)
    {
        return head;
    }
    Doublelink del=head;
    head=head->next;
    free(del);
    del=NULL;
    return head;
}//尾删
doublelink rear_delete(doublelink head)
{
    if(NULL == head) {
        return head;
    }
    if (head->next=head->prev) { // 只有一个节点的情况
        free(head);
        return NULL;
    }
    Doublelink p = head;
    while (p->next->next != head) { // 找到尾节点的前一个节点
        p = p->next;
    }
    doublelink s=p->next;
    p->next=NULL; 
    s=s->next; // 将倒数第二个节点的 next 置为 NULL
    free(s); // 释放尾节点
    return head;
}


2双向循环链表

#include "head.h"
//创建新节点
Doublelink create_node()
{
                Doublelink s=(Doublelink)malloc(sizeof(struct Node));
        if(NULL==s)
        {
                return NULL;
        }
        //新节点的数据与初始化
        s->data=0;
        //新节点的两个指针域
        s->next=s->prev=s;
        return s;
}
Doublelink insert_head(datatype element,Doublelink head)
{
        //创建一个新节点
        Doublelink s=create_node();
        s->data=element;
        //1.链表为空
        if(NULL==head)
        head=s;
        else
        {//2.链表存在多个节点>=1
        Doublelink rear=head->prev;
        s->next=head;
        head->prev=s;
        rear->next=s;
        s->prev=rear;
        head=s;
        return head;
        }
}
void output(Doublelink head,int n)
{
        //1.判断链表是否为空
        if(NULL==head)
        return;
        //2.正向遍历

                Doublelink p=head;
        if(n==1)
        {
                do//最后一个节点的数据域不打印
                {
                        printf("%c\n",p->data);
                        p=p->next;
                }
        }while(p->next!=p);//最后一个节点的数据域不打印
        else
        {
                //逆向遍历
                do
                {
                        printf("%c",p->data);
                        p=p->prev;
                        putchar(10);
                }while(p!=p);
        }
}
Doublelink head_delete(Doublelink head)
{
    if(NULL==head)
    {
        return head;
    }
    Doublelink del=head;
    Doublelink s=head->prev;
    head=head->next;
    head->prev=s;
    s->next=head;
    free(del);
    del=NULL;
    return head;
}
Doublelink insert_rear(Doublelink head,datatype element)
{
        Doublelink s=create_node();
        if(head==NULL)
        {
                head=s;
        }
        else
        {
                Doublelink p=head->prev;
                p->next=s;
                s->prev=p;
                s->next=head;
                head->prev=s;
        }
                return head;
}
//尾删
doublelink rear_delete(doublelink head)
{
    if(NULL == head) {
        return head;
    }
    if (head->next=head->prev) { // 只有一个节点的情况
        free(head);
        return NULL;
    }
    Doublelink p= head->prev->prev;
    Doublelink s=p->next;
    p->next=head;
    head->prev=p; // 将倒数第二个节点的 next 置为 NULL
    free(s); // 释放尾节点
    s=NULL;
    return head;
}

相关文章:

  • 面试题之Vuex,sessionStorage,localStorage的区别
  • Qt常用控件之按钮QPushButton
  • 解决 `pip is configured with locations that require TLS/SSL` 错误
  • 使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(数据分析篇)
  • RabbitMQ 3.12.2:单节点与集群部署实战指南
  • lab3 CSAPP:AttackLab
  • PosgreSQL比MySQL更优秀吗?
  • nlp|微调大语言模型初探索(2),训练自己的聊天机器人
  • 算法与数据结构(最小栈)
  • Python Cookbook-1.21 在Unicode和普通字符串之间转换
  • 【Python 语法】Python 正则表达式(regular expressions, regex)
  • 代码随想录 第一章 数组 977.有序数组的平方
  • 【拒绝算法PUA】LeetCode 1287. 有序数组中出现次数超过25%的元素
  • 30填学习自制操作系统第二天
  • 从MySQL迁移到PostgreSQL的完整指南
  • 【Elasticsearch】硬件资源优化
  • 下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
  • Git Pull 报错解决方案:fatal: Need to specify how to reconcile divergent branches
  • PHP是如何并行异步处理HTTP请求的?
  • CSS基础入门——盒模型与布局
  • 央媒聚焦文明交流互鉴中的“上博现象” :跨越山海,抒写自信
  • 种植耐旱作物、启动备用水源,甘肃各地多举措应对旱情
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿元
  • 俄外长与美国务卿通电话,讨论俄美接触等问题
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 中国物流集团等10家央企11名领导人员职务任免