单链表实验

这篇博客介绍了C++实现的单链表数据结构,包括构造、析构、获取链表长度、查找、插入、删除、打印链表及判空等基本操作。源代码展示了模板类`LinkList`的定义和实现,以及测试用例来验证链表功能的正确性。
摘要由CSDN通过智能技术生成

单链表

头文件

#pragma once
template<typename T>
struct Node {//链表结点
	T data;//数据域
	Node<T>* next;//指针域
};
template<typename T>
class LinkList
{
public:
	LinkList();//建立只有头结点的空链表
	LinkList(T a[], int n);//建立有n个元素的单链表,头插法
	LinkList(int n, T a[]);//建立有n个元素的单链表,尾插法
	~LinkList();//析构函数
	int length();//返回链表长度
	T get(int i);//获取第i个结点的元素值
	int locate(T x);//查找值为x的元素的序号
	void insert(int i, T x);//在第i个位置插入值为x的元素
	T del(int i);//删除第i个元素
	bool empty();//判空
	void printList();//打印表
private:
	Node<T>* head;//头指针
};

源文件

#include "LinkList.h"
#include<iostream>
using namespace std;
template<typename T>
void LinkList<T>::printList() {
	Node<T>* p = head->next;//暂存第一个结点的指针
	while (p != nullptr) {//遍历链表打印
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

template<typename T>
bool LinkList<T>::empty() {
	//有没有第一个结点,没有就是空链表
	if (head->next == nullptr)return true;
	return false;
}

template<typename T>
T LinkList<T>::del(int i) {
	T x;//暂存将要删除的元素
	Node<T>* p = head->next,*q = nullptr;
	int count = 0;//计数器
	while (p != nullptr && count < i - 1) {
		p = p->next;//走到第i-1位
		count++;
	}//链表没这么长可以删
	if (p = nullptr) {//
		throw"删除位置错误";
	}
	else {
		q = p->next;
		x = q->data;//暂存被删除结点
		p->next = q->next;//摘链,这里是重点
		delete q;//释放q指针占的空间
		return x;//返回查找的元素
	}

}

template<typename T>
int LinkList<T>::length() {
	Node<T>* p = head->next;//暂存第一个结点的指针
	int length = 0;//记录链表长度
	while (p != nullptr) {
		p = p->next;//遍历整个链表
		length++;
	}
	return length;//返回长度
}

template<typename T>
T LinkList<T>::get(int i) {
	Node<T>* p = head->next;//暂存第一个结点的指针
	int count = 0;//计数器
	while (p != nullptr && count < i) {
		p = p->next;//如果当前元素不为空且没有到达我们要查找的位置则往下走
		count++;
	}//链表没i这么长,
	if (p == nullptr)throw"查找位置错误";
	return p->data;//返回位置i的元素

}

template<typename T>
int LinkList<T>::locate(T x) {
	Node<T>* p = head->next;//暂存第一个结点的指针
	int index=0;//记录位置
	while (p != nullptr && p->data != x) {
		p = p->next;//如果当前结点部位空且不是我们要查找的元素就往下一个找
		index++;
	}//如果最后找到的结点为空,说明没有这个元素
	if (p == nullptr)return 0;
	return index;//返回查找元素的位置
}

template<typename T>
void LinkList<T>::insert(int i,T x) {
	Node<T>* p = head->next, * s = nullptr;
	int count = 0;//计数器
	while (p != nullptr && count < i-1) {
		p = p->next;//如果当前元素不为空且没有到达我们要查找的位置则往下走
		count++;
	}//链表没i这么长,
	if (p == nullptr)throw"插入位置错误";
	s = new Node<T>;s->data = x;//申请结点s,数据域位x
	s->next = p->next;//插入s结点,这里是重点
	p->next = s;
}

template<typename T>
LinkList<T>::LinkList(T a[],int n) {
	head = new Node<T>;//头结点,
	head->next = nullptr;//next为空
	for (int i = 0; i < n; i++) {
		Node<T>* s = nullptr;//申请结点s,数据域位a[i]
		s = new Node<T>; s->data = a[i];
		s->next = head->next;//头插法
		head->next = s;
	}
}

template<typename T>
LinkList<T>::LinkList(int n,T a[]) {
	head = new Node<T>;//头结点,
	Node<T>* r = head;//尾指针初始化
	for (int i = 0; i < n; i++) {
		Node<T>* s = nullptr;//申请结点s,数据域位a[i]
		s = new Node<T>; s->data = a[i];
		r->next = s;//尾插法
		r = s;
	}
	r->next = nullptr;//链表尾结点的next为空
}

template<typename T>
LinkList<T>::~LinkList() {
	Node<T>* p = head;
	//释放每一个结点
	while (head != nullptr) {
		head = head->next;//head指向被释放的下一个结点
		delete p;
		p = head;//工作指针后移
	}
}

测试测序

#include<iostream>
using namespace std;
#include"LinkList.h"
int main() {
    int r[5] = { 1,2,3,4,5 };
    LinkList<int> L(r, 5);//构造出线性表
    cout << "执行插入操作前数据为:" << endl;
    L.printList();
    try {
        L.insert(2, 3);//尝试在第二个位置插入值为3的元素
    }
    catch (char* s) {
        cout << s << endl;
    }
    cout << "执行插入操作后数据为:" << endl;
    L.printList();
    cout << "值为2的数据位置为:";
    cout << L.locate(2) << endl;//查找元素2并返回在表中的位置
    cout << "第二个位置上的元素值为:";
    cout << L.get(2) << endl;//查找元素2并返回在表中的位置
    cout << "执行删除操作前数据为:" << endl;
    L.printList();
    try {
        L.del(1);//尝试删除第一个元素
    }
    catch (char* s) {
        cout << s << endl;
    }
    cout << "执行删除操作后数据为:" << endl;
    L.printList();
    cout << "链表是否为空: " <<L.empty() ;
    cout << "现在链表长度是:  " <<L.length();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值