结点类与链表类模板

在复习C++模板时,在课本上发现了这个结点类模板,记下来,以后可能会用着,注释在代码上。

链表的结点包括数据和指针域,是链表的基本构件。节点的数据域用于存放群体中元素的内容,既可以是若干个基本类型的数据,也可以是自定义类型的数据,甚至是内嵌对象。结点的指针域用于存放链表中另一个结点的地址。

//结点类模板
template <class T>
class Node
{
private:
	Node<T>* next;      //指向后继结点的指针
public:
	T data;      //数据域
	Node(const T& data, Node<T>* next = 0); //构造函数
	void insertAfter(Node<T>* p);           //在本结点之后插入一个同类结点p
	Node<T>* deleteAfter();                 //删除本结点的后继结点,并返回其地址
	Node<T>* nextNode();                     //获取后继结点的地址	
	const Node<T>* nextNode() const;        //获取后继结点的地址
};

//类的实现部分
//构造函数,初始化数据和指针成员
template <class T>
Node<T>::Node(const T & data, Node<T> * next) : data(data), next(next) {};

//返回后继结点的指针
template <class T>
Node<T> * Node<T>::nextNode() 
{
    return next;
}

//返回后继结点的指针
template <class T>
const Node<T>* Node<T>::nextNode() const
{
	return next;
}

//在当前结点之后插入一个结点P
template <class T>
void Node<T>::insertAfter(Node<T>* p)
{
	p->next = next;       //p结点指针域指向当前结点的后继结点
	next = p;             //当前结点的指针域指向p
}
	
//删除当前结点的后继结点,并返回其地址
template <class T>
Node<T>* Node<T>::deleteAfter()
{
	Node<T>* tempPtr = next;    //将欲删除的结点地址存储到tempPtr中
	if (next == 0)              //如果当前结点没有后继结点,则返回空指针
		return 0;
	next = tempPtr->next;       //使当前结点的指针域指向tempPtr的后继结点
	return tempPtr;             //返回被删除的结点的地址
}

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	Node<int> n1(1, NULL);
	Node<int> n2(2, &n1);
	cout << n2.nextNode()->data << endl;

	return 0;
}

 根据结点类模板,可以继续编写链表类模板

#include <iostream>

// 链表结点类
template <typename T>
class Node {
public:
    T data;
    Node<T>* next;

    Node(T val, Node<T>* n = nullptr) : data(val), next(n) {}
};

// 链表类
template <typename T>
class LinkedList {
private:
    Node<T>* head;
    Node<T>* tail;

public:
    LinkedList() : head(nullptr), tail(nullptr) {}

    // 在链表尾部插入元素
    void append(T value) {
        Node<T>* newNode = new Node<T>(value);
        if (head == nullptr) {
            head = tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }
    }

    // 获取链表头结点
    Node<T>* getHead() {
        return head;
    }

    // 遍历并打印链表
    void print() {
        Node<T>* curr = head;
        while (curr != nullptr) {
            std::cout << curr->data << " ";
            curr = curr->next;
        }
        std::cout << std::endl;
    }
};

int main() {
    // 声明两个 int 类型的链表
    LinkedList<int> a, b;

    // 向 a 和 b 中插入 5 个元素
    for (int i = 1; i <= 5; i++) {
        a.append(i);
        b.append(i * 10);
    }

    // 打印 a 和 b 的元素
    std::cout << "List a: ";
    a.print();
    std::cout << "List b: ";
    b.print();

    // 将 b 中的元素加入 a 的尾部
    Node<int>* curr = b.getHead();
    while (curr != nullptr) {
        a.append(curr->data);
        curr = curr->next;
    }

    // 打印合并后的 a
    std::cout << "List a after merging: ";
    a.print();

    return 0;
}

--选自C++语言程序设计(第五版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值