链表之C++实现

本文详细介绍了单链表的各种操作实现,包括节点的创建、插入、删除、查找以及打印等功能,通过具体的C++代码示例,帮助读者深入理解单链表的数据结构及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Slist.hpp

#include<iostream>
using namespace std;
typedef struct Node{
  struct Node* next;
  int data;
}Node;
class Slist{
public:
  Slist()
    :head(nullptr){}
  Node* BuySlistNode(const int data){
    Node* pNewNode = new Node;
    pNewNode->data = data;
    pNewNode->next = nullptr;
    return pNewNode;
  }
  //尾插
  void SlistPushBack(Slist* s,int data){
    Node* pNewNode = BuySlistNode(data);
    if(s->head == nullptr){
      s->head = pNewNode;
    }else{
      Node* pCur = s->head;
      while(pCur->next){
        pCur = pCur->next;
      }
      pCur->next = pNewNode;
    }
  }
  //尾删
  void SlistPopBack(Slist* s){
    if(s->head == nullptr)
      return;
    else{
      Node* pPre = nullptr;
      Node* pCur = s->head;
      while(pCur->next){
        pPre = pCur;
        pCur = pCur->next;
      }
      pPre->next = pCur->next;
      delete pCur;
      pCur = nullptr;
    }
  }
  //头插
  void SlistPushFront(Slist* s,int data){
    Node* pNewNode = BuySlistNode(data);
    if(s->head == nullptr)
      s->head = pNewNode;
    else{
      pNewNode->next = s->head;
      s->head = pNewNode;
    }
  }
  //头删
  void SlistPopFront(Slist* s){
    if(s->head == nullptr)
      return;
    else{
      Node* pDelNode = s->head;
      s->head = pDelNode->next;
      delete pDelNode;
      pDelNode = nullptr;
    }
  }
  //任意位置插入
  void SlistInsert(Node* pos,int data){
    if(pos == nullptr)
      return;
    Node* pNewNode = BuySlistNode(data);
    pNewNode->next = pos->next;
    pos->next = pNewNode;
  }
  //任意位置删除
  void SlistErase(Slist* s,Node* pos){
    if(pos == nullptr||s->head == nullptr){
      return;
    }
    if(s->head == pos){
      s->head = pos->next;
    }else{
      Node* pPrePos = s->head;
      while(pPrePos&&pPrePos->next!=pos){
        pPrePos = pPrePos->next;
      }
      if(pPrePos){
        pPrePos->next = pos->next;
      }
    }
    delete pos;
    pos = pos->next;
  }
  //找某个元素
  Node* SlistFind(Slist* s,int data){
    if(s->head == nullptr)
      return nullptr;
    Node* pCur = s->head;
    while(pCur){
      if(pCur->data == data){
        return pCur;
      }
      pCur = pCur->next;
    }
    return nullptr;
  }
  void SlistPrint(Slist* s){
    Node* pCur = s->head;
    while(pCur){
      cout<<pCur->data<<"->";
      pCur = pCur->next;
    }
    cout<<"nullptr"<<endl;
  }
  ~Slist(){
    if(head){
      head = nullptr;
    }
  }
private:
  Node* head;
};

Slist.cpp

#include"Slist.hpp"
int main(){
  Test();
  return 0;
}

测试部分

void Test(){
  Slist s;
  s.SlistPushBack(&s,1);
  s.SlistPushBack(&s,2);
  s.SlistPushBack(&s,3);
  s.SlistPushBack(&s,4);
  s.SlistPushBack(&s,5);
  s.SlistPrint(&s);
  s.SlistPopBack(&s);
  s.SlistPrint(&s);
  s.SlistPushFront(&s,0);
  s.SlistPushFront(&s,-1);
  s.SlistPrint(&s);
  s.SlistPopFront(&s);
  s.SlistPrint(&s);
  s.SlistInsert((s.SlistFind(&s,2)),10);
  s.SlistPrint(&s);
  s.SlistErase(&s,(s.SlistFind(&s,10)));
  s.SlistPrint(&s);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值