C++ 模板循环链表练习

abacabcc 2017-11-24 09:58:24
初学C++ 刚看了模板的视频,自己把以前写的一个循环链表改成模板,添加的节点的那个函数死活编不过去,求大神帮看看

#include <iostream>
#include <cstring>//memset
using namespace std;

template<typename T>
struct Node
{
T List_data;
Node *List_pPre;
Node *List_pNext;
};

template<typename T>
Node<T>* NewHead(const T data)
{
Node<T>* listHead = new Node<T>;
memset(listHead,0,sizeof(Node<T>));

listHead->List_data = data;
listHead->List_pNext = listHead;
listHead->List_pPre = listHead;

return listHead;
}

template<typename T>
void AddNod(Node<T>* listHead,const T data)
{
Node<T>* ptemp = listHead;

while(ptemp->List_pNext != listHead)
{
ptemp = ptemp->List_pNext;
}

Node<T>* m_Node = new Node<T>;
memset(m_Node,0,sizeof(Node<T>));

m_Node->List_data = data;
m_Node->List_pNext = listHead;
m_Node->List_pPre = ptemp;
ptemp->List_pNext = m_Node;
listHead->List_pPre = m_Node;

cout << "add data = " << data << " success!" << endl;
}

template<typename T>
void ListDis(const Node<T>* listHead)
{
Node<T>* ptemp = listHead->List_pNext;
int i = 1;

cout << "head" << " = " << listHead->List_data << endl;
while(ptemp!= listHead)
{
cout << "Node" << i << " = " << ptemp->List_data << endl;
ptemp = ptemp->List_pNext;
i++;
}
}

//加入a个节点后最多只能删a个节点,不能删除头节点
template<typename T>
void List_Delete_Node(Node<T>* listHead,T nNode)
{
int m_count = 0;

Node<T>* ptemp = listHead;
while(ptemp->List_pNext != listHead)
{
m_count++;
ptemp = ptemp->List_pNext;
}
if(0 >= nNode || m_count < nNode)
{
cout << "delete error!" << endl;
return;
}

ptemp = listHead;
m_count = nNode;
while(m_count != 0)
{
m_count--;
ptemp = ptemp->List_pNext;
}
ptemp->List_pNext->List_pPre = ptemp->List_pPre;
ptemp->List_pPre->List_pNext = ptemp->List_pNext;
delete ptemp;
cout << "delete Node " << nNode << "success!" << endl;
}
template<typename T>
void List_Delete_All(Node<T>* listHead)
{
Node<T>* ptemp = listHead;

while(ptemp->List_pNext != listHead)
{
ptemp = ptemp->List_pNext;
delete ptemp->List_pPre;
}
delete ptemp;
cout << "delete all list success!" << endl;
}
int main()
{
Node<int>* listHead;

listHead = NewHead(0);
AddNode(listHead,6); //E:\main.cpp:111: error: 'AddNode' was not declared in this scope
AddNode(listHead,a);
AddNode(listHead,9);
AddNode(listHead,10);
AddNode(listHead,11);
AddNode(listHead,12);
cout << "---------------------" << endl;

ListDis(listHead);
cout << "---------------------" << endl;

List_Delete_Node(listHead,2);
ListDis(listHead);
cout << "---------------------" << endl;

List_Delete_Node(listHead,2);
ListDis(listHead);
cout << "---------------------" << endl;
List_Delete_All(listHead);
return 0;
}

...全文
179 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2017-11-24
  • 打赏
  • 举报
回复
其次,AddNode(listHead, a);这句里的a你并没有定义,不知是什么
paschen 版主 2017-11-24
  • 打赏
  • 举报
回复
template<typename T> void AddNod(Node<T>* listHead, const T data) 改成: template<typename T> void AddNode(Node<T>* listHead, const T data) 注意函数名的拼写
heronism 2017-11-24
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
你申明的是 AddNod
高手,正解
真相重于对错 2017-11-24
  • 打赏
  • 举报
回复
你申明的是 AddNod
内容概要:本文档《CCF GESP C++ 五级核心算法模板代码集》系统整理了面向CCF GESP(中国计算机学会编程能力等级认证)C++五级考试所需的核心算法与数据结构知识,涵盖初等数论(最大公约数、素数判断、质因数分解、埃氏筛与线性筛)、高精度运算(加减乘除的数组模拟实现)、链表操作(单链表、双链表、循环链表检测)、查找算法(二分查找及其变种、二分答案)、排序算法(归并排序、快速排序)、贪心算法(活动安排、硬币找零、分糖果、游戏奖励最大化)、分治算法(归并排序、快速排序、最大子数组和)、递归算法(斐波那契、汉诺塔、字符串反转、阶乘)以及算法复杂度分析工具(操作计数、测试数据生成)。每个算法均提供可运行的C++代码模板,注释清晰,注重效率优化与边界处理。; 适合人群:准备参加CCF GESP C++五级考试的中小学生,以及希望巩固基础算法与编程能力的初学者和青少年程序员;需具备基本的C++语法基础和程序设计思维。; 使用场景及目标:①用于备考GESP五级考试,掌握高频考点算法的实现方式;②作为日常算法练习的代码参考模板,提升编码熟练度与调试能力;③通过阅读标准实现理解各类经典算法的核心思想与应用场景,如贪心选择、分治策略、双指针、模拟实现等;④辅助进行算法复杂度分析与性能测试。; 阅读建议:建议结合实际编程环境边学边练,逐行理解代码逻辑,重点关注算法边界条件、时间优化技巧(如避免溢出、剪枝)和内存管理细节;对于递归与分治类算法,可通过添加打印语句或调试工具追踪执行流程;同时应尝试对模板代码进行变形训练以增强灵活应用能力。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧