C++实现单链表

最近面试的时候发现自己手写代码的能力极差。握住笔之后整个脑子都是木的,什么都写不出来。于是准备重新整理一下基础数据结构的实现。

定义LinkList.h文件

#ifndef LIST_LINKLIST_H
#define LIST_LINKLIST_H

#endif //LIST_LINKLIST_H
// 定义链表节点和方法
#include<string>
using namespace std;


typedef int DataType;

//定义节点
class Node
{
public:
    int value;
    Node* next;
};

//定义单链表
class LinkList {
public:
    //构建单链表
    LinkList();
    //销毁单链表
    ~LinkList();
    //创建一个单链表
    void CreateLinkList(int n);
    //打印链表
    void Print();
    //获取线性表长度
    int GetLength();
    //判断单链表是否为空
    bool IsEmpty();
    //查找节点
    Node *FindNode(DataType data);
    //在链表尾部插入指定元素
    void InsertElemAtEnd(DataType data);
    //在链表指定位置插入指定元素
    void InsertElemAtIndex(DataType data, int n);
    //在链表头部插入指定元素
    void InsertElemAtHead(DataType data);
    //删除尾部元素
    void DeleteElemAtEnd();
    //删除指定元素
    void DeleteElemAtIndex(DataType data);
    //删除头部元素
    void DeleteElemAtHead();

private:
    Node* head;
};

linklist.cpp

#include "linklist.h"
#include <iostream>
#define MaxSize 100000
using namespace std;

//单链表构造函数
LinkList::LinkList() {
    head = new Node;
    head->value = 0;
    head->next = NULL;
}

//单链表析构函数
LinkList::~LinkList() {
    delete head;
}

//创建单链表
void LinkList::CreateLinkList(int n) {
    Node *p,*temp;
    temp = head;
    if(n<0 || n>MaxSize){
        cout<<"结点个数有误"<<endl;
    }
    cout<<"输入元素"<<endl;
    for(int i=0;i<n;i++){
        p= new Node;
        cin>>p->value;
        p->next = NULL;
        temp->next = p;
        temp = p;
    }
}

//打印链表
void LinkList::Print() {
    if (head == NULL || head->next == NULL) {
        std::cout << "链表为空表" << std::endl;
    }
    cout << "链表中的数据依次为:";
    Node *p = head->next;
    while (p != NULL) {
        cout << p->value << " ";
        p = p->next;
    }
}

//获取线性表长度
int LinkList::GetLength()
{
    int count = 0;
    Node *p = head->next;
    while (p != NULL)
    {
        count++;
        p = p->next;
    }
    return count;
}

//判断单链表是否为空
bool LinkList::IsEmpty()
{
    if (head->next == NULL)
        return true;
    else
        return false;
}

//查找结点
Node *LinkList::FindNode(DataType data) {
    Node *p = head->next;
    if(p==NULL){
        cout<<"链表为空"<<endl;
        return NULL;
    }else{
        while(p!=NULL){
            if(p->value == data){
                return p;
            }
            p=p->next;
        }
        return NULL;
    }
}

//在链表尾部插入元素
void LinkList::InsertElemAtEnd(DataType data) {
    Node *newNode = new Node;
    newNode->value = data;
    Node *p=head;
    if(head->next == NULL){
        head->next = newNode;
        newNode->next = NULL;
    }else {
        while (p->next != NULL) {
            p = p->next;
        }
        p->next = newNode;
        newNode->next=NULL;
    }
}

//在头部插入元素
void LinkList::InsertElemAtHead(DataType data) {
    Node *newNode = new Node;
    newNode->value = data;
    Node *p = head;
    newNode ->next = p->next;
    p->next = newNode;
}

//在链表指定位置插入元素
void LinkList::InsertElemAtIndex(DataType data, int n) {
    if(n<0||n>GetLength()){
        cout<<"插入位置错误"<<endl;
    }else{
        Node *newNode = new Node;
        newNode->value=data;
        Node *p =head;
        int i=1;
        while(n>i){
            p = p->next;
            i++;
        }
        newNode->next = p->next;
        p->next = newNode;
    }
}

//删除尾部元素
void LinkList::DeleteElemAtEnd() {
    Node *p = head;
    Node *temp = NULL;
    if(head == NULL){
        cout<<"链表为空"<<endl;
    }else{
        while(p->next != NULL){
            temp = p;
            p=p->next;
        }
        delete p;
        p =NULL;
        temp ->next = NULL;
    }
}

//删除头部元素
void LinkList::DeleteElemAtHead() {
    Node *p=head;
    if(p ==NULL || p->next ==NULL){
        cout<<"链表为空"<<endl;
    }else{
        Node *temp = NULL;
        p = p->next;
        temp = p->next;
        delete p;
        p = NULL;
        head->next = temp;
    }
}

//删除指定元素
void LinkList::DeleteElemAtIndex(DataType data) {
    Node *temp = FindNode(data);
    if(temp == head->next){
        DeleteElemAtHead();
    }else{
        Node *p = head;
        while (p->next != temp){
            p = p->next;
        }
        p->next= temp->next;
        delete temp;
        temp = NULL;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值