【数据结构/C++】线性表_双链表基本操作

cpp 复制代码
#include <iostream>
using namespace std;
typedef int ElemType;
// 3. 双链表
typedef struct DNode
{
  ElemType data;
  struct DNode *prior, *next;
} DNode, *DLinkList;
// 初始化带头结点
bool InitDNodeList(DLinkList &L)
{
  L = (DNode *)malloc(sizeof(DNode));
  if (L == NULL)
  {
    return false;
  }
  L->prior = NULL;
  L->next = NULL;
  return true;
}
// 在第 i 个位置插入元素 e
bool InsertDNodeList(DLinkList &L, int i, ElemType e)
{
  DNode *p = L, *s;
  int j = 0;
  while (p != NULL && j < i - 1)
  {
    p = p->next;
    j++;
  }
  if (p == NULL)
  {
    cout << "插入位置不合法" << endl;
    return false;
  }
  s = (DNode *)malloc(sizeof(DNode));
  s->data = e;
  // 判断是否在空表中插入
  if (p->next == NULL)
  {
    s->next = NULL;
    s->prior = p;
    p->next = s;
    return true;
  }
  else
  {
    s->next = p->next;
    s->prior = p;
    p->next->prior = s;
    p->next = s;
    return true;
  }
}
// 删除第 i 个元素,并返回元素 e
bool DeleteDNodeList(DLinkList &L, int i, ElemType &e)
{
  DNode *p = L, *q;
  int j = 0;
  while (p != NULL && j < i - 1)
  {
    p = p->next;
    j++;
  }
  if (p == NULL)
  {
    cout << "删除位置不合法" << endl;
    return false;
  }
  q = p->next;
  e = q->data;
  p->next = q->next;
  q->next->prior = p;
  free(q);
  return true;
}
// 遍历双链表
void TraverseDNodeList(DLinkList L)
{
  DNode *p = L->next;
  while (p != NULL)
  {
    cout << p->data << " ";
    p = p->next;
  }
  cout << endl;
}
int main()
{
  DLinkList L;
  ElemType e;
  InitDNodeList(L);
  InsertDNodeList(L, 1, 1);
  InsertDNodeList(L, 2, 2);
  InsertDNodeList(L, 3, 3);
  TraverseDNodeList(L);
  DeleteDNodeList(L, 2, e);
  cout << "删除元素为:" << e << endl;
  TraverseDNodeList(L);
  return 0;
}
相关推荐
lee_tianbai5 分钟前
Java SSM 电影票预定系统|完整前后端项目,开箱即用(源码分享)
java·开发语言·数据库
All for pursuit.38 分钟前
【并查集-2】399.除法求值
数据结构·c++·算法·leetcode
迪丽热爱43 分钟前
一、C语言概述与程序结构
c语言·开发语言·算法
HUIBUR科技1 小时前
AI中枢:打破数据孤岛与流程孤岛双重困境
开发语言·ai
鱼宵1 小时前
LangChain4j 结构化输出:让模型吐出 Java 对象,JSON 不再手写解析
java·开发语言·json·langchain4j
w2sfot1 小时前
【JS加密在线】jsjiami.online(让JavaScript 更安全!)
开发语言·javascript·安全
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所2 小时前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人2 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr