单链表增删改查C++

这个博客展示了如何使用C++实现一个简单的单链表数据结构,包括添加、按序添加、显示、更新、删除节点以及链表的反转和反向打印等功能。示例代码中创建了一个英雄节点类`HeroNode`和一个单链表类`SingelLinkList`,并提供了丰富的操作方法来演示链表的各种操作。
摘要由CSDN通过智能技术生成

class HeroNode
{
public:
    HeroNode(){}
    HeroNode(int number,string name,string nickname)
    {
        this->No = number;
        this->Name = name;
        this->nickName = nickname;
    }
    int No;
    string Name;
    string nickName;
    HeroNode *Next;
};
class SingelLinkList
{
public:
    HeroNode * getHead()
    {
        return head;
    }
    //添加节点
    void add(HeroNode *Hero)
    {
        Hero = new HeroNode(Hero->No,Hero->Name,Hero->nickName);
        HeroNode *temp=head;
        while (true)
        {
            if (temp->Next==nullptr)
            {
                break;
            }
            temp = temp->Next;
        }
        temp->Next = Hero;
    }

    void showList()
    {
        if (head->Next == nullptr)
        {
            cout << "链表为空" << endl;
            return;
        }
        HeroNode *temp = head;
        while (true)
        {
            if (temp->Next == nullptr)
            {
                break;
            }
            temp = temp->Next;
            cout << "序号:" << temp->No << "  姓名为:" << temp->Name << "   昵称为:" << temp->nickName << endl;
        }
    }

    void AddByOrder(HeroNode *Hero)
    {
        Hero = new HeroNode(Hero->No, Hero->Name, Hero->nickName);
        HeroNode *temp = head;
        bool flag = false;
        while (true)
        {
            if (temp->Next == nullptr)
            {
                break;
            }
            if (temp->Next->No > Hero->No)
            {
                break;
            }
            else if (temp->Next->No == Hero->No)
            {
                flag = true;
                break;
            }
            temp = temp->Next;
        }
        if (flag == true)
        {
            cout << "编号已存在,不能添加" << endl;
            return;
        }
        else
        {
            Hero->Next = temp->Next;
            temp->Next = Hero;
        }
    }

    void updata(HeroNode *newHero)
    {
        if (head->Next == nullptr)
        {
            cout << "链表为空,无法更新" << endl;
            return;
        }
        newHero = new HeroNode(newHero->No, newHero->Name, newHero->nickName);
        HeroNode *temp = head;
        bool flag = false;
        while (true)
        {
            if (temp== nullptr)
            {
                break;
            }
            if (temp->No == newHero->No)
            {
                flag = true;
                break;
            }
            temp = temp->Next;
        }
        if (flag == true)
        {
            temp->Name = newHero->Name;
            temp->nickName = newHero->nickName;
            delete newHero;
        }
        else
        {
            cout << "没有找到该序号" << endl;
            return;
        }
    }

    void deleList(int no)
    {
        if (head->Next == nullptr)
        {
            cout << "链表为空,无法删除" << endl;
            return;
        }
        HeroNode *temp = head;
        bool flag = false;
        while (true)
        {
            if (temp->Next == nullptr)
            {
                break;
            }
            if (temp->Next->No == no)
            {
                flag = true;
                break;
            }
            temp = temp->Next;
        }
        if (flag == true)
        {
            temp->Next = temp->Next->Next;
        }
        else
        {
            cout << "未找到要删除的结点" << endl;
            return;
        }
     }

    //获取节点个数
    int getNumber(HeroNode *head)
    {
        if (head->Next == nullptr)
        {
            cout << "链表为空" << endl;
            return 0;
        }
        int i = 0;
        HeroNode *temp = head->Next;
        while (temp != nullptr)
        {
            i++;
            temp = temp->Next;
        }
        return i;
    }

    //获得倒数第k个节点
    HeroNode* getIndex(HeroNode *head, int index)
    {
        if (head->Next == nullptr)
        {
            return nullptr;
        }
        int num = getNumber(head);
        HeroNode *temp = head;
        if (index <= 0 || index > num)
        {
            return nullptr;
        }
        for (int i = 0; i < num - index; i++)
        {
            temp = temp->Next;
        }
        return temp->Next;
    }

    //单链表反转
    void reverseList(HeroNode *head)
    {
        if (head->Next == nullptr || head->Next->Next == nullptr)
        {
            return;
        }
        HeroNode *cur = head->Next;
        HeroNode *next =nullptr;
        HeroNode *reverseHead = new HeroNode(0, "", "");
        while (cur != nullptr)
        {
            next = cur->Next;
            cur->Next = reverseHead->Next;
            reverseHead->Next = cur;
            cur = next;
        }
        head->Next = reverseHead->Next;
    }

    //反向打印链表
    void reversePrint(HeroNode *head)
    {
        if (head->Next == nullptr)
        {
            return;
        }
        HeroNode *cur = head->Next;
        while (cur != nullptr)
        {
            stack.push(cur);
            cur = cur->Next;
        }
        while (!stack.empty())
        {
            cout << "序号:" << stack.top()->No << "  姓名为:" << stack.top()->Name << "   昵称为:" << stack.top()->nickName << endl;
            stack.pop();
        }
    }
    stack<HeroNode*>stack;
private:
    //头节点
    HeroNode *head = new HeroNode(0,"","");
};

int main()
{
    HeroNode *tempNode;
    HeroNode *Hero1 = new HeroNode(1, "songjiang", "jishiyu");
    HeroNode *Hero2= new HeroNode(2, "nezha", "natuo");
    HeroNode *Hero3 = new HeroNode(3, "zhangfei", "feifie");
    HeroNode *Hero4 = new HeroNode(4, "erlangshen", "duyan");
    SingelLinkList List;
    List.AddByOrder(Hero4);
    List.AddByOrder(Hero3);
    List.AddByOrder(Hero2);
    List.AddByOrder(Hero1);
    List.showList();

    cout << "反转后:" << endl;
    List.reversePrint(List.getHead());
    /*
    List.reverseList(List.getHead());
    List.showList();*/
    /*int num = List.getNumber(List.getHead());
    cout << "链表节点个数为:" << num << endl;
    cout << "删除后:" << endl;
    List.deleList(2);
    List.showList();
    int num1 = List.getNumber(List.getHead());
    cout << "链表节点个数为:" << num1<< endl;
    tempNode = List.getIndex(List.getHead(),2);
    cout << "倒数第2个节点为: 序号为:" << tempNode->No << "  姓名为:" << tempNode->Name << "  昵称为:" << tempNode->nickName << endl;
    */
    system("pause");
    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表的操作包括增加节点、删除节点、修改节点和查找节点。下面是C语言实现单链表增删改查示例代码: ```c #include <stdio.h> #include <stdlib.h> // 节点结构体 typedef struct node { int data; // 数据元素 struct node* next; // 指向下一个节点的指针 } Node; // 在单链表末尾增加节点 void addNode(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (*head == NULL) { *head = newNode; } else { Node* current = *head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } // 在单链表指定位置插入节点 void insertNode(Node** head, int index, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; if (index == 0) { newNode->next = *head; *head = newNode; } else { Node* current = *head; for (int i = 0; i < index - 1 && current != NULL; i++) { current = current->next; } if (current != NULL) { newNode->next = current->next; current->next = newNode; } else { printf("Index out of range\n"); } } } // 在单链表指定位置删除节点 void deleteNode(Node** head, int index) { if (*head == NULL) { printf("List is empty\n"); return; } Node* current = *head; Node* previous = NULL; if (index == 0) { *head = current->next; free(current); } else { for (int i = 0; i < index && current != NULL; i++) { previous = current; current = current->next; } if (current != NULL) { previous->next = current->next; free(current); } else { printf("Index out of range\n"); } } } // 修改单链表指定位置节点的值 void modifyNode(Node* head, int index, int data) { if (head == NULL) { printf("List is empty\n"); return; } Node* current = head; for (int i = 0; i < index && current != NULL; i++) { current = current->next; } if (current != NULL) { current->data = data; } else { printf("Index out of range\n"); } } // 查找单链表指定位置节点的值 int searchNode(Node* head, int index) { if (head == NULL) { printf("List is empty\n"); return -1; } Node* current = head; for (int i = 0; i < index && current != NULL; i++) { current = current->next; } if (current != NULL) { return current->data; } else { printf("Index out of range\n"); return -1; } } // 打印单链表 void printList(Node* head) { if (head == NULL) { printf("List is empty\n"); return; } Node* current = head; printf("List: "); while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } int main() { Node* head = NULL; // 在单链表末尾增加节点 addNode(&head, 1); addNode(&head, 2); addNode(&head, 3); printList(head); // 在单链表指定位置插入节点 insertNode(&head, 1, 4); insertNode(&head, 0, 5); insertNode(&head, 6, 6); printList(head); // 在单链表指定位置删除节点 deleteNode(&head, 2); deleteNode(&head, 0); deleteNode(&head, 4); printList(head); // 修改单链表指定位置节点的值 modifyNode(head, 1, 7); modifyNode(head, 3, 8); modifyNode(head, 5, 9); printList(head); // 查找单链表指定位置节点的值 printf("Value at index 2: %d\n", searchNode(head, 2)); printf("Value at index 5: %d\n", searchNode(head, 5)); printf("Value at index 7: %d\n", searchNode(head, 7)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值