C++单链表增删查找的基本操作

#include<iostream>
using namespace std;

typedef int DataType;

class Node {
public:
    int data;
    Node * next;
};

class LinkList {
public:
    LinkList();
    ~LinkList();
    //创建一个单链表
    void createLinkList(int n);
    //遍历线性链表
    void travalLinkList();
    //获取链表长度
    int getLinkListLength();
    //判断单链表是否为空
    bool isEmpty();
    //寻找链表节点
    Node *findNode(DataType data);

    //尾部插入指定值
    void insertLinkListAtEnd(DataType data);
    //在指定位置插入值
    void insertLinkListAtIndex(DataType data, int index);
    //在头部插入数值
    void insertLinkListAtHead(DataType data);
    //删除尾部数据库
    void deleteLinkListAtEnd();
    //删除所有数据
    void deleteLinkListAll();
    //删除指定数据
    void deleteLinkListAtPoint(DataType data);
    //在指定位置删除数据
    void deleteLinkListAtIndex(int index);
    //删除头部位置的数据
    void deleteLinkListAtHead();

    //翻转链表所有的数据
    void reverseLinkList();

private:
    Node * head;
};


LinkList::LinkList() {
    head = new Node;
    head->data = 0;
    head->next = NULL;
}

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

void LinkList::createLinkList(int n) {
    Node *pnew, *ptemp;
    ptemp = head;
    if (n < 0) {
        cout << "输入的节点个数有误" << endl;
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < n; i++) {
        pnew = new Node;
        cout << "请输入第" << i + 1 << "个值: ";
        cin >> pnew->data;
        pnew->next = NULL;
        ptemp->next = pnew;
        ptemp = pnew;

    }
}

void LinkList::travalLinkList() {
    if (head == NULL || head->next == NULL) {
        cout << "链表为空表" << endl;
    }

    Node *ptemp = head;
    while (ptemp->next != NULL) {
        ptemp = ptemp->next;
        cout << ptemp->data << " ";
    }
    cout << endl;
}

//获取链表的长度
int LinkList::getLinkListLength() {
    int count = 0;
    Node *ptemp = head;
    while (ptemp->next != NULL) {
        ptemp = ptemp->next;
        count++;
    }
    return count;
}

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


Node* LinkList::findNode(DataType data) {
    Node *ptemp = head;
    if (ptemp == NULL) {
        cout << "此链表为空链表" << endl;
        return NULL;
    }

    while (ptemp->next != NULL)
    {
        if (ptemp->data == data) {
            return ptemp;
        }
        ptemp = ptemp->next;

    }

    return NULL;

}


//在链表尾部插入数据
void LinkList::insertLinkListAtEnd(DataType data) {
    Node *newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;

    Node *ptemp = head;
    if (head == NULL) {
        head = newNode;
    }
    else {
        while (ptemp->next != NULL)
        {
            ptemp = ptemp->next;
        }
        ptemp->next = newNode;
    }
}

//在链表指定位置插入数据
void LinkList::insertLinkListAtIndex(DataType data, int index) {
    if (index < 1 || index> getLinkListLength()){
        cout << "输入的值错误" << endl;
    }
    Node * newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;

    Node *ptemp = head;
    int i = 1;
    while (i < index) {
        ptemp = ptemp->next;
        i++;
    }
    newNode->next = ptemp->next;

    ptemp->next = newNode;
}

//在链表头部后面插入数据
void LinkList::insertLinkListAtHead(DataType data) {
    Node *newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    if (head == NULL) {
        head = newNode;
    }

    Node *ptemp = head;
    newNode->next = ptemp->next;
    ptemp->next = newNode;
}

//在尾部删除数据
void LinkList::deleteLinkListAtEnd() {
    Node *p = head;
    Node *ptemp = NULL;
    if (p == NULL || p->next == NULL) {
        cout << "单链表空" << endl;
    }
    else {
        while (p->next != NULL) {
            ptemp = p;
            p = p->next;
        }
        delete p;
        p = NULL;
        ptemp->next = NULL;
    }
}


//删除所有的数据
void LinkList::deleteLinkListAll(){
    Node * p = head->next;
    Node *ptemp = new Node;
    while (p != NULL){
        ptemp = p;
        p = p->next;
        head->next = p;
        ptemp->next = NULL;
        delete ptemp;
    }
    head->next = NULL;

}

//删除指定数据
void LinkList::deleteLinkListAtPoint(DataType data){
    Node *ptemp = findNode(data);
    if (ptemp == head->next){
        deleteLinkListAll();
    }
    else{
        Node *p = head;
        while (p->next != ptemp)
        {
            p = p->next;
        }
        p->next = ptemp->next;
        delete ptemp;
        ptemp = NULL;
    }
}

//在头部删除数据
void LinkList::deleteLinkListAtHead(){
    Node *p = head;
    if (p == NULL || p->next == NULL){
        cout << "该链表为空表" << endl;
    }
    else{
        Node *ptemp = NULL;
        p = p->next;
        ptemp = p->next;
        delete p;
        p = NULL;
        head->next = ptemp;
    }
}

//在指定位置删除数据
void LinkList::deleteLinkListAtIndex(int index){
    if (index <1 || index > getLinkListLength()){
        cout << "输入的删除位置错误" << endl;
    }
    Node *p = head;
    if (p ==NULL || p->next == NULL){
        cout << "链表为空" << endl;
    }
    int i = 0;
    Node *ptemp = NULL;
    while (i < index) {
        ptemp = p;
        p = p->next;
        i++;
    }

    ptemp->next = p->next;
    delete p;
    p = NULL;
    
}

/*
//翻转链表
Node* LinkList::reverseLinkList(){
    Node *p = head;
    if (p == NULL || p->next == NULL){
        cout << "链表为空" << endl;
    }

    Node *reverseList = new Node;
    reverseList->next = NULL;
    reverseList->data = 0;
    
    Node *ptemp = NULL;
    while (p != NULL){
        ptemp = p->next;

        //reverseList前插入数据
        p->next = reverseList->next;
        reverseList->next = p;
        p = ptemp;
    }
    return reverseList;
    
}
*/

int main(){
    LinkList linklist = LinkList();
    int i;
    cout << "1.创建单链表   2.遍历单链表\n"; 
    cout << "3.获取单链表的长度    4.判断单链表是否为空\n";
    cout << "5.获取节点   6.在尾部插入指定元素\n";
    cout << "7.在指定位置插入指定元素   8.在头部插入指定元素\n";
    cout << "9.在尾部删除元素    10.删除所有元素\n";
    cout << "11.删除指定元素    12.在头部删除元素\n";
    cout << "13.删除指定位置的数据    0.退出" << endl;

    do{
        cout << "请输入要执行的操作: ";
        cin >> i;
        switch (i)
        {
        case 1:
            int n;
            cout << "请输入链表的长度" << endl;
            cin >> n;
            linklist.createLinkList(n);
            break;
        case 2:
            linklist.travalLinkList();
            break;
        case 3:
            cout << "链表的长度:" << linklist.getLinkListLength() << endl;
            break;
        case 4:
            if (linklist.isEmpty()){
                cout << "该单链表是空表" << endl;
            }
            else
            {
                cout << "该单链表不是空表" << endl;
            }
            break;
        case 5:
            int data;
            cout << "请输入要获取节点的值: ";
            cin >> data;
            cout << "该节点的值为:" << linklist.findNode(data)->data << endl;
            break;
        case 6:
            int endData;
            cout << "请输入要在尾部插入的值: ";
            cin >> endData;
            linklist.insertLinkListAtEnd(endData);
            break;
        case 7:
            DataType pointData;
            int index;
            cout << "请输出要插入的值" << endl;
            cin >> pointData;
            cout << "请输出要插入值的位置" << endl;
            cin >> index;
            linklist.insertLinkListAtIndex(pointData, index);
            break;
        case 8:
            DataType headData;
            cout << "请输出在头部要插入的值" << endl;
            cin >> headData;
            linklist.insertLinkListAtHead(headData);
            break;
        case 9:
            linklist.deleteLinkListAtEnd();
            cout << "尾部删除数据操作完成"<< endl;
            break;
        case 10:
            linklist.deleteLinkListAll();
            cout << "删除所有数据操作完成" << endl;
            break;
        case 11:
            DataType pointDeleteData;
            cout << "请输出要删除的指定值" << endl;
            cin >> pointDeleteData;
            linklist.deleteLinkListAtPoint(pointDeleteData);
            break;
        case 12:
            linklist.deleteLinkListAtHead();
            cout << "删除头部数据操作完成" << endl;
            break;
        case 13:
            int deleteIndex;
            cout << "请输出要删除值的位置" << endl;
            cin >> deleteIndex;
            linklist.deleteLinkListAtIndex(deleteIndex);
            break;
        default:
            break;
        }
    } while (i != 0);

    system("pause");
    return 0;
}

原文链接:https://www.cnblogs.com/KGvito/p/8111047.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值