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

  • CreateLinkList(int size) 创建大小为size的链表
  • TravelLinkList() 遍历链表
  • InsertLinkList(Node *data,int n) 将data节点插入链表第n个位置
  • DeleteLinkList(int n) 删除链表第n个位置的节点
  • CircleLinkList() 将单链表改造为循环链表

LinkList类用到了new/delete(构造函数用new,析构使用了delete)来初始化head节点,默认head节点是(0,null)

#include<bits/stdc++.h>
using namespace std;

typedef int datatype;

class Node{
    
             //节点类
    public:
        datatype data;
        Node *next;
};

class LinkList{
    
         //链表类
    public:
        LinkList();
        ~LinkList();
        void CreateLinkList(int size);
        int TravelLinkList();
        int InsertLinkList(Node *data,int n);
        int DeleteLinkList(int n);
        int CircleLinkList();
        int size;
        Node *head;
};

LinkList::LinkList(){
    
      //内存管理
    head=new Node;
    head->data=0;
    head->next=NULL;
    size=0;
}

LinkList::~LinkList(){
    
    
    delete head;
}

void LinkList::CreateLinkList(int size){
    
    
    Node *ptemp=NULL;  
    Node *pnew=NULL;    

    this->size=size;
    ptemp=this->head;

    for(int i=0;i<size;++i){
    
    
        pnew=new Node;  
        pnew->next=NULL;
        cout<<"输入第"<<i+1<<"个节点值:"<<endl;
        cin>>pnew->data;
        ptemp->next=pnew;
        ptemp=pnew;
    }
    cout<<"创建完成";
}

int LinkList::TravelLinkList(){
    
      //遍历链表
    Node *ptemp=this->head->next;
    if(this->head==NULL){
    
    
        cout<<"链表为空";
        return 0;
    }
    while(ptemp){
    
    
        cout<<ptemp->data<<"->";
        ptemp=ptemp->next;
    }
    cout<<endl;
    return 0;
}

int LinkList::InsertLinkList(Node *data, int n){
    
       //在第i个位置插入data
    Node *ptemp;
    if(this->head==NULL){
    
    
        cout<<"链表为空"<<endl;
        return -1;
    }
    if(data==NULL){
    
    
        cout<<"插入节点为空"<<endl;
        return -1;
    }
    if(n<2){
    
            //链表头插
        Node *pnew=new Node;
        pnew->data=data->data;
        pnew->next=this->head->next;
        this->head->next=pnew;
        this->size++;
        return 0;
    }
    if(n>this->size){
    
      //链表尾插
        ptemp=this->head;
        while(ptemp->next!=NULL){
    
    
            ptemp=ptemp->next;
        }
        Node *pnew=new Node;
        pnew->data=data->data;
        pnew->next=NULL;
        ptemp->next=pnew;
        this->size++;
        return 0;
    }
    else{
    
         //链表中间插入
        ptemp=this->head;
        for(int i=1;i<n;++i)
            ptemp=ptemp->next;
        Node *pnew =new Node;
        pnew->data=data->data;
        pnew->next=ptemp->next;
        ptemp->next=pnew;
        this->size++;
        return 0;
    }
}

int LinkList::DeleteLinkList(int n){
    
    
    Node *ptemp;
    Node *ptemp2;
    if(n<2){
    
        //删除头节点
        ptemp=this->head->next;
        this->head->next=ptemp->next;
        free(ptemp);
        this->size--;
        return 0;
    }
    if(n==this->size){
    
         //删除尾节点
        ptemp=this->head;
        for(int i=1;i<this->size;++i){
    
    
            ptemp=ptemp->next;
        }
        ptemp2=ptemp->next;
        ptemp->next=NULL;
        free(ptemp2);
        this->size--;
        return 0;
    }
    else{
    
               //删除中间节点
        ptemp=this->head;
        for(int i=1;i<n;++i){
    
    
            ptemp=ptemp->next;
        }
        ptemp2=ptemp->next;
        ptemp->next=ptemp2->next;
        free(ptemp2);
        this->size--;
        return 0;
    }
}

int LinkList::CircleLinkList(){
    
         //将链表改为循环链表
    Node *ptemp;
    ptemp=this->head;
    while(ptemp->next!=NULL){
    
    
        ptemp=ptemp->next;
    }
    ptemp->next=this->head->next;   //将链表最后一位的next指针指向第一个元素位置
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43477024/article/details/109607173