【数据结构/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;
}
相关推荐
用户805533698034 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK16 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境1 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境1 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴2 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
刘马想放假3 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠4 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
卷无止境4 天前
C++ 的Eigen 库全解析
c++
卷无止境4 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴4 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake