纯C++语言实现单链表,定义Node类和Linklist类。

“classnode.hpp”:

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include <ctime>
#include <iostream>
using namespace std;

class Node
{
    friend class Linklist;
    
public:
    Node();
    Node(int data);
    Node(Node* old);



private:
    int data;
    Node* next;

};

Node::Node()
{
    this->data = 0;
    this->next = NULL;

}

Node::Node(int data)
{
    this->data = data;
    this->next - NULL;
}

Node::Node(Node* old)
{
    this->data = rand() % 10;
    this->next = old;
}

class Linklist
{

public:
    //初始化
    Linklist();
    Linklist(Node* first);

    
    void InitList(int len);
    void HeadInsert_Init();

    void printlist();

    Node& search_from_i(int i);
    Node& search_elem(int elem_data);


    void Insert_after_pre(Node*p,Node* pre);
    Node& delete_after_pre(Node* pre);



private:
    Node* first;
    friend class Node;
    int length=0;
};

Linklist::Linklist()
{

}

Linklist::Linklist(Node* first)
{
    this->first = first;
}

void Linklist::HeadInsert_Init()
{
    Node* n = new Node(this->first->next);
    this->first->next = n;
    this->length++;
}

void Linklist::InitList(int len)//头插法建立单链表
{
    for (int i = 0; i < len; i++)
    {
        this->HeadInsert_Init();//在同一个函数内部无法在循环内对同一个变量初始化不同的存储空间
                                //我们采取封装函数,让循环体中变量作为另一个函数的局部变量出现,就可以实现以上需求
    }
}

void Linklist::printlist()
{
    Node* p = this->first->next;
    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << "当前表长为:" << this->length << endl;
}

Node& Linklist::search_from_i(int i)
{
    Node* p(this->first);
    while (i != 0)
    {
        if (p == NULL)
        {
            cout << "链表不存在第" << i << "个结点";
            return *p;
        }
        p = p->next;
        i--;
    }
    return *p;
}

Node& Linklist::search_elem(int elem_data)
{
    Node* p = this->first->next;
    int num = 1;
    while (p != NULL)
    {
        if (p->data == elem_data)
        {
            cout << "第一个值为" << elem_data << "的结点在第" << num << "个位置上" << endl;
            return *p;
        }
        p = p->next;
        num++;
    }
    cout << "没有值为" << elem_data << "的结点" << endl;
    return *p;
}

void Linklist::Insert_after_pre(Node* p,Node* pre)
{
    //Node* n=new Node(pre->next);
    p->next = pre->next;
    pre->next =p;
    this->length++;
}

Node& Linklist::delete_after_pre(Node* pre)
{
    Node* p = pre->next;
    pre->next = pre->next->next;
    this->length--;
    return *p;

}

源文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include "classnode.hpp"

int main()
{

    srand((unsigned)time(NULL));

    Linklist L(new Node());//定义一个带头节点的单链表,
    int len;
    cout << "请输入您定义的单链表长度:";
    cin >> len;

    L.InitList(len);
    L.printlist();

    Node n(3);//定义一个data域为3的Node结点

    L.Insert_after_pre(&n,&L.search_from_i(3));//在线性表的3位置之后插入结点n
    L.printlist();

    L.delete_after_pre(&L.search_from_i(3));//删除线性表的3位置后的结点
    L.printlist();
    L.search_elem(3);//查找链表中第一个3出现的位置

    system("pause");
    return 0;
}

实验结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
单链表实现中,`PNode`和`Linklist`是两个不同的概念。 `PNode`通常是用来表示链表的节点(Node)的指针型,也可以称为链表节点指针。每个节点包含数据域和指针域,`PNode`指向一个具体的节点。 `Linklist`是链表List)的型,通常是一个结构体或者一个指针型。它包含一个指向链表首节点的指针(通常称为头指针或者头节点),作为整个链表的入口。 下面是一个示例代码,演示了`PNode`和`Linklist`的使用: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表的节点结构体 struct Node { int data; struct Node* next; }; // 定义链表型 typedef struct Node* Linklist; // 初始化链表 void initialize(Linklist* llist) { *llist = NULL; } // 在链表末尾插入节点 void insertAtEnd(Linklist* llist, int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; if (*llist == NULL) { *llist = newNode; } else { struct Node* current = *llist; while (current->next != NULL) { current = current->next; } current->next = newNode; } } // 打印链表 void printList(Linklist llist) { struct Node* current = llist; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } int main() { Linklist llist; initialize(&llist); insertAtEnd(&llist, 1); insertAtEnd(&llist, 2); insertAtEnd(&llist, 3); printf("Linked List: "); printList(llist); return 0; } ``` 在上述示例中,`struct Node*`被定义为`PNode`,它是指向链表节点的指针型。而`typedef struct Node* Linklist`将`struct Node*`定义为`Linklist`,它是链表型。 这样,我们可以使用`PNode`来表示链表节点的指针,使用`Linklist`来表示整个链表型。在函数中,我们可以通过传递`Linklist*`型的参数来修改链表的头指针,实现链表的操作。 需要注意的是,这里的命名约定可能会有所不同,不同的开发者可能会使用不同的名称来表示链表节点指针和链表型。重要的是理解它们之间的关系和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值