c++单链表的基本操作(全)

简介: 俩个基本插入方法

俩个基本插入方法

image.png

#include <bits/stdc++.h>
using namespace std;
typedef struct LNode
{ 
  int date;     //节点的数据域 
  struct LNode *next;   //节点的指针域  
}LNode,*LinkList;        // LinkList 为指向结构体LNode的指针类型
bool Initlist_L(LinkList &L)       //构造一个空的单链表L 
{
  L = new LNode;                 //生成新的节点作为头结点,用头指针L指向头结点 
  if(!L)
     return false;               //生成结点失败 
  L->next = NULL;              // 头结点指针域置空 
  return true;
}
void CreateList_H(LinkList &L)  //前插法创造单链表  (是逆序建表) 
{
  //输入n个元素,建立到头结点的单链表
    int n ;
  LinkList s; //定义一个指针变量
  L = new LNode;
  L ->next = NULL;  //先建立一个带头结点的空链表
  while(n--)
  { 
    s = new LNode ;       //生成新结点s
    cin>>s->date;          //输入元素赋值给新结点的数据域
    s->next = L->next;
    L->next = s;           //将新结点s插入头结点之后 
    }
}
void CreateList_R(LinkList &L)   //尾插法创建单链表 (尾插法是正序建表) 
{
    //输入n个元素,建立到头结点的单链表
    int n ;
    LinkList  s, r;
    L = new LNode;
  L->next = NULL;  //先建立一个带头结点的空链表 
  r = L;           //尾指针r指向头结点  (就他自己)
    cout<<"请输入元素个数 n: "<<endl;
  cin>>n;
  cout<<"请依次输入n个元素:"<<endl;
  cout<<"前插法创建单链表..."<<endl;
  while(n--)
  { 
    s = new LNode ;       //生成新结点s
    cin>>s->date;          //输入元素赋值给新结点的数据域
      s->next = NULL;
      r->next = s;           //将新结点插s插入尾结点*r之后
    r = s;                 //r指向新的尾结点s 
    }
}
bool GetELem_L(LinkList L,int i, int &e)   //单链表的取值(按第几位查找) 
{
  //在头节点的单链表L中查找第i个元素
    //用e记录L中第i个数据元素的值
  int j;
  LinkList p;
  p = L-> next; //p指向第一个结点
  j = 1;        //j相当于计数器
    while(j < i && p)  //顺链域向后扫描,直到p指向第i个元素或者p为空
  {
      p = p->next;  //p指向下一个结点
    j ++; 
  } 
  if(!p || j > i)
   return false;    //i不合法i>n或 i <= 0;
  e = p -> date;   //取第i个结点的数据域
  return true; 
} 
bool LocatELem_L(LinkList L ,int e)  //按值查找
{
  //在头节点的单链表l中查找值为e的元素
  LinkList p ;
  p = L-> next;
  while(p && p->date != e)
      p = p->next;          //p指向下一个结点 
  if(!p)
      return false;         //查找失败p为NULL 
  return true; 
}   
bool ListInsert_L(LinkList &L,int i,int e)   //单链表的插入
{
  int j;
  LinkList p,s;
  p = L;
  j = 0;
  while(p && j < i - 1)      //查找第i-1个结点,p指向该结点 
  {
    p = p->next;
    j++;
  } 
  if(!p || j > i - 1)  // i > n+ 1或者 i < 1
      return false ;
    s = new LNode;         //生成新的节点 
    s->date = e;           //将新的节点指针域置为e 
    s->next = p->next;
    p->next = s;
  return true; 
} 
bool ListDelete_L(LinkList &L,int i)  //单链表的删除
{
  LinkList p,q;
  int j = 0;
  p = L; 
  while((p->next) && (j< i -1))  //p的下一个结点存在才能删除 
  {
    p = p->next;
    j ++;
  }
  if(!(p->next) || (j > i - 1))  //当i > n 或i < 1时删除位置不合理 
      return false; 
    q = p->next;;
    p->next = q->next;
    delete q;
    return true;
} 
void listprint_L(LinkList L)  //单链表的输出 
{
  LinkList p;
  p = L->next;
  while(p)
  {
    cout<<p->date<<"\t";
    p = p->next;
  } 
  cout<<endl;
}

如何用数组模拟链表呢?

int e[N],ne[N],idx,head;
void init()      //初始化
{
    head  = -1;
}
void int_to_head(int x)    //在头节点后插入
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}
void add(int k,int x)       //在第k个结点后面操作
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++;
}
void remove(int k)         //删除第k个结点
{
    ne[k]=ne[ne[k]];
}
相关文章
|
7月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
399 2
|
7月前
|
C++
【链表】还不会用C++实现链表?一文教会你各种链表的实现
【链表】还不会用C++实现链表?一文教会你各种链表的实现
267 0
|
5月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
6月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
7月前
|
算法 C++
c++算法学习笔记 (13) 链表
c++算法学习笔记 (13) 链表
|
6月前
|
C++ Python
UE C++ 链表
UE C++ 链表
|
6月前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
61 0
|
7月前
|
C语言 C++
【c++】用c++实现带头双向循环链表
【c++】用c++实现带头双向循环链表
|
7月前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
115 0
|
7月前
|
存储 算法 C语言
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
137 0