努力学习的阿信 2021-05-02 14:25 采纳率: 90%
浏览 18
已结题

数据结构类模板实现单链表

#include<iostream>
using namespace std;
template<class Type>
class LinkNode {
public:
	Type* next;
	Type data;
	LinkNode() 
	{
		next = NULL;
		data = 0;
	}
	LinkNode(Type* ptr, Type dat) 
	{
		next = ptr;
		data = dat;
	}
};
template<class Type>
class LinkList {
public:
	LinkList() {
		cout << "建立LinkList对象!" << endl;
	}
	void InitList(LinkNode<Type>* L);       //初始化链表,建立一个空的链表
	void CreateList(LinkNode<Type>* L, const Type a[], const int n);  //头插法建立链表
	void DestoryList(LinkNode<Type>* L);                         //销毁链表
	void DispList(LinkNode<Type>* L) const;
	bool ListEmpty(LinkNode<Type>* L);
	int ListLength(LinkNode<Type>* L);
	bool GetElem(LinkNode<Type>* L, const int i, Type &e);        //求链表的中某个元素值
	int LocateList(LinkNode<Type>* L, const Type& e);            //按照元素值查找链表
	bool InsertList(LinkNode<Type>* L, const int i, Type& e);     //将元素插入到链表中的某个位置
	bool DeleteList(LinkNode<Type>* L,const int i, const Type &e);              //删除某个元素值,并用e接收元素值
	~LinkList() {
		DestoryList(L);
		cout << "调用析构函数销毁LinkList对象!" << endl;
	}    //VS此处报错,显示L未找到标识符
};

template<class Type>
void LinkList<Type>::InitList(LinkNode<Type>* L) {
	L = new LinkNode();      //L = (LinkNode*)malloc(sizeof(LinkNode));
}

template<class Type>
void LinkList<Type>::CreateList(LinkNode<Type>* L, const Type a[], const int n) {
	LinkNode<Type>* p = L, * s;
	int i;
	for (i = 0;i < n;i++) {
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = a[i];
		s->next = p->next;
		p->next = s;
	}
	cout << "链表已建立完成!" << endl;
}

template<class Type>
void LinkList<Type>::DestoryList(LinkNode<Type>* L)
{
	LinkNode<Type>* pre = L->next;
	while (pre != NULL) {
		delete pre;        //删除节点pre
		pre = pre->next;   //移动到下一个节点
	}
	delete pre;
	cout << "链表销毁完毕!" << endl;
}

template<class Type>
void LinkList<Type>::DispList(LinkNode<Type>* L) const
{
	LinkNode<Type>* pre = L->next;
	while (pre != NULL) {
		cout << pre->data << "  ";
		pre = pre->next;              //移动到下一个位置
	}
	cout << endl;
	cout << "输出链表完毕!" << endl;
}

template<class Type>
bool LinkList<Type>::ListEmpty(LinkNode<Type>* L)
{
	return (L->next != NULL);
}

template<class Type>
int LinkList<Type>::ListLength(LinkNode<Type>* L)
{
	int length = 0;
	LinkNode<Type>* pre = L;
	while (pre->next != NULL) {
		length++;
		pre = pre->next;
	}
	return length;
}

template<class Type>
bool LinkList<Type>::GetElem(LinkNode<Type>* L, const int i, Type& e)
{
	LinkNode<Type>* pre = L;int j = 0;
	if (i < 0) return false;
	while (j < i - 1 && pre != NULL) {  //找到第i个位置之前的元素位置
		j++;
		pre = pre->next;    //后移一个节点
	}
	if (pre == NULL) {
		cout << "查询失败!" << endl;
		return false;
	}
	else
	{
		cout << "查询成功!" << endl;
		e = pre->data;
		return true;
	}
}

template<class Type>
int LinkList<Type>::LocateList(LinkNode<Type>* L, const Type& e)
{
	LinkNode<Type>* pre = L->next;
	int num = 1;
	while (pre != NULL && e != pre->data) {
		pre = pre->next;
		num++;
	}
	if (pre == NULL) {
		cout << "按照元素查询失败!" << endl;
		return (0);
	}
	else
	{
		cout << "按照元素查询成功!" << endl;
		return (1);
	}
}

template<class Type>
bool LinkList<Type>::InsertList(LinkNode<Type>* L, const int i, Type& e)
{
	LinkNode<Type>* pre = L->next, * s;int j = 0;
	if (i < 0)  return false;
	while (j < i - 1 && pre != NULL) {
		j++;
		pre = pre->next;
	}
	if (pre == NULL) {
		cout << "插入失败!" << endl;
		return false;
	}
	else
	{
		s = new LinkNode();
		s->data = e;
		s->data = pre->next;
		pre->next = s;
		cout << "插入成功!" << endl;
		return true;
	}
}

template<class Type>
bool LinkList<Type>::DeleteList(LinkNode<Type>* L, const int i, const Type& e)
{
	LinkNode<Type>* pre = L->next, * q;
	int j = 0;
	if (i < 0)  return false;             //判断输出的数值是否合法
	while (pre != NULL) {
		pre = pre->next;
		j++;
	}
	if (pre == NULL) {
		cout << "删除失败!" << endl;
		return false;
	}
	else
	{
		q = pre->next;
		if (q == NULL) {
			cout << "删除失败!" << endl;
			return false;
		}
		e = q->data;
		pre->next = q->next;
		delete pre;
		cout << "删除完成!" << endl;
		return true;
	}
}
int main() {
	using std::cout;
	using std::endl;
	LinkNode<int>* L;
	int arr[9] = { 23,41,8,15,46,7,10,20,9 };
	LinkList<int> object;
	object.InitList(L);
	object.DispList(L);
	cout << endl;


	return 0;
}

今天在实现数据结构的单链表的时候碰到了问题,第一个就是我在析构函数调用DestoryList函数时,VS2019报错显示:“L”:找不到标识符。 另一个错误就是在LinkList类声明结束的位置显示“message : 查看对正在编译的 类 模板 实例化“LinkList<Type>”的引用”,求各路大神解答,我都快哭了。。。。

  • 写回答

1条回答 默认 最新

  • 源代码大师 博客专家认证 2021-05-03 16:43
    关注

    C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?