鱼C论坛

 找回密码
 立即注册
查看: 1447|回复: 5

求助,简单程序改错

[复制链接]
发表于 2020-5-18 22:06:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于链表的功能实现的其中一个头文件


  1. #ifndef INC_9_7LINKEDLIST_LINKEDLIST_H
  2. #define INC_9_7LINKEDLIST_LINKEDLIST_H

  3. #include <iostream>
  4. #include <cassert>
  5. #include <cstdlib>
  6. #include "Node.h"
  7. using namespace std;

  8. template <class T>
  9. class LinkedList {
  10. private:
  11.     //数据成员:
  12.     Node<T>* front, * rear;                         //表头和表尾
  13.     Node<T>* prevPtr, * currPtr;                    //记录当前遍历位置的指针,由插入和删除操作更新
  14.     int size;                                     //表中的元素个数
  15.     int position;                                 //当前元素在表中的位置序号。由函数reset使用

  16.     //函数成员
  17.     //生成新结点,数据域为item,指针域为ptrNext
  18.     Node<T>* newNode(const T& item, Node<T>* ptrNext = NULL);

  19.     //释放结点
  20.         void freeNode(Node<T>* p);

  21.     //将链表L复制到当前表(假设当前表尾空)
  22.     //被复制构造函数和“operator=”调用
  23.     void copy(const LinkedList<T>& L);

  24. public:
  25.     LinkedList();                                 //构造函数
  26.     LinkedList(const LinkedList<T>& L);           //复制构造函数
  27.     ~LinkedList();                                //析构函数
  28.     LinkedList<T>& operator=(const LinkedList<T>& L);                 //重载运算符

  29.     int getSize() const;                          //返回链表中元素个数
  30.     bool isEmpty() const;                         //链表是否为空

  31.     void reset(int pos = 0);                      //初始化游标位置
  32.     void next();                        //使游标移动到下一个结点
  33.     bool endOfList() const;                       //游标是否到了表尾
  34.     int currentPosition() const;                  //返回游标当前位置

  35.     void insertFront(const T& item);              //在表头插入结点
  36.     void insertRear(const T& item);               //在表尾添加结点
  37.     void insertAt(const T& item);                 //在当前结点之前插入结点
  38.     void insertAfter(const T& item);              //在当前结点之后插入结点

  39.     T deleteFront();                              //删除头结点
  40.     void deleteCurrent(void);                     //删除当前结点

  41.     T& data();                                    //返回对当前结点成员数据的引用
  42.     const T& data() const;                       //返回对当前结点成员数据的常引用

  43.     //清空链表:释放所有结点的内存空间。被析构函数和“operator="调用
  44.     void clear(void);
  45. };


  46. template <class T> Node<T>* LinkedList<T>::newNode(const T& item, Node<T>* ptrNext)
  47. {
  48.         Node<T>* p;
  49.         p = newNode<T>(item, ptrNext);
  50.         if (p == NULL)
  51.         {
  52.                 cout << "Memory allocation failure!" << endl;
  53.                 exit(1);
  54.         }
  55.         return p;
  56. }

  57. /*释放节点*/
  58. template <class T> void LinkedList<T>::freeNode(Node<T>* p)
  59. {
  60.         delete p;
  61. }

  62. /*复制链表*/
  63. template <class T> void LinkedList<T>::copy(const LinkedList<T>& L)
  64. {
  65.         nextNode<T>* p = L.front;  //p用来遍历L
  66.         int pos;
  67.         while (p != NULL)  //将L中的每一个元素插入到当前连接表最后
  68.         {
  69.                 InsertRear(p->data);
  70.                 p = p->NextNode();
  71.         }
  72.         if (position == -1) //如果链表为空,则返回
  73.                 return;
  74.         //在新链表中重新设置prevPtr和currptr
  75.         prevPtr = NULL;
  76.         currPtr = front;
  77.         for (pos = 0; pos != position; pos++)
  78.         {
  79.                 prevPtr = currPtr;
  80.                 currPtr = currPtr->NextNode();
  81.         }
  82. }

  83. /*构造函数,构造新链表,size为0,positon为-1*/
  84. template <class T> LinkedList<T>::LinkedList() :front(NULL), rear(NULL), prevPtr(NULL), currPtr(NULL), size(0), position(-1) {}

  85. /*拷贝构造函数*/
  86. template <class T>LinkedList<T>::LinkedList(const LinkedList<T>& L)
  87. {
  88.         front = rear = NULL;
  89.         prevPtr = currPtr = NULL;
  90.         size = 0;
  91.         position = -1;
  92.         Copy(L);
  93. }

  94. /*析构函数*/
  95. template <class T> LinkedList<T>::~LinkedList()
  96. {
  97.         clear();
  98. }

  99. /*重载赋值运算符*/
  100. template <class T> LinkedList<T>& LinkedList<T>::operator=(const LinkedList<T>& L)
  101. {
  102.         if (this == &L)  //不能将链表赋值给它自身
  103.                 return *this;
  104.         clear();
  105.         copy(L);
  106.         return *this;
  107. }

  108. /*获取链表的大小*/
  109. template <class T> int LinkedList<T>::getSize()const
  110. {
  111.         return size;
  112. }

  113. /*判断链表是否为空*/
  114. template <class T> bool LinkedList<T>::isEmpty()const
  115. {
  116.         return size == 0;
  117. }

  118. /*将链表当前位置设置为pos*/
  119. template <class T> void LinkedList<T>::reset(int pos)
  120. {
  121.         int startPos;
  122.         if (front == NULL) //如果链表为空
  123.                 return;
  124.         if (pos<0 || pos>size - 1)  //如果指定位置不合法,返回
  125.         {
  126.                 cerr << "ReSet:Invalid list position: " << pos << endl;
  127.                 return;
  128.         }
  129.         //设置与链表有关的成员
  130.         if (pos == 0)  //如果pos为0,将指针重新设置到表头
  131.         {
  132.                 prevPtr = NULL;
  133.                 currPtr = front;
  134.                 position = 0;
  135.         }
  136.         else  //否则重新设置currPtr,prevPtr,position
  137.         {
  138.                 currPtr = front->NextNode();
  139.                 prevPtr = front;
  140.                 startPos = 1;
  141.                 for (position = startPos; position != pos; position++)
  142.                 {
  143.                         prevPtr = currPtr;
  144.                         currPtr = currPtr->NextNode();
  145.                 }
  146.         }
  147. }

  148. /*将prevPtr和currPtr先前移动一个结点*/
  149. template <class T> void LinkedList<T>::next()
  150. {
  151.         if (currPtr != NULL)
  152.         {
  153.                 prevPtr = currPtr;
  154.                 currPtr = currPtr->NextNode();
  155.                 position++;
  156.         }
  157. }

  158. /*判断是否已到达链表尾*/
  159. template <class T> bool LinkedList<T>::endOfList()const
  160. {
  161.         return currPtr == NULL;
  162. }

  163. /*返回当前节点的位置*/
  164. template <class T> int LinkedList<T>::currentPosition()const
  165. {
  166.         return position;
  167. }

  168. /*将item插入在表头*/
  169. template <class T> void LinkedList<T>::insertFront(const T& item)
  170. {
  171.         if (front != NULL)  //如果链表不为空,则调用ReSet()
  172.                 reset();
  173.         InsertAt(item);  //在表头插入
  174. }

  175. /*在表尾插入结点*/
  176. template <class T> void LinkedList<T>::insertRear(const T& item)
  177. {
  178. Node<T>* nNode;
  179.         prevPtr = rear;
  180.         nNode = newNode(item);  //创建新节点
  181.         if (rear == NULL)  //如果表为空,则插入在表头
  182.                 front = rear = nNode;
  183.         else
  184.         {
  185.                 rear->insertAfter(nNode);
  186.                 rear = nNode;
  187.         }
  188.         currPtr = rear;
  189.         position = size;
  190.         size++;
  191. }

  192. /*将item插入在当前位置之前*/
  193. template <class T> void LinkedList<T>::insertAt(const T& item)
  194. {
  195.         cNode<T>* nNode;
  196.         if (prevPtr == NULL)  //插入在链表头,包括将结点插入到空表中
  197.         {
  198.                 nNode = newNode(item, front);
  199.                 front = nNode;
  200.         }
  201.         else  //插入到链表之中,将结点置于prevPtr之后
  202.         {
  203.                 nNode = newNode(item);
  204.                 prevPtr->insertAfter(nNode);
  205.         }
  206.         if (prevPtr == rear)//正在向空表中插入,或者是插入到非空表的表尾
  207.         {
  208.                 rear = nNode;  //更新rear
  209.                 position = size;   //更新position
  210.         }
  211.         currPtr = nNode;  //更新currPtr
  212.         size++;  //更新szie
  213. }

  214. /*将item插入到当前位置之后*/
  215. template <class T>void LinkedList<T>::insertAfter(const T& item)
  216. {
  217.         cNode<T>* p;
  218.         p = newNode(item);
  219.         if (front == NULL)  //向空链表中插入
  220.         {
  221.                 front = currPtr = rear = p;
  222.                 position = 0;
  223.         }
  224.         else  //插入到
  225.         {
  226.                 if (currPtr == NULL)
  227.                         currPtr = prevPtr;
  228.                 currPtr->InsertAfter(p);
  229.                 if (currPtr == rear)
  230.                 {
  231.                         rear = p;
  232.                         position = size;
  233.                 }
  234.                 else
  235.                         position++;
  236.                 prevPtr = currPtr;
  237.                 currPtr = p;
  238.         }
  239.         size++;  //更新链表长度
  240. }

  241. /*删除表头结点*/
  242. template <class T> T LinkedList<T>::deleteFront()
  243. {
  244.         T item;
  245.         reset();
  246.         if (front == NULL)
  247.         {
  248.                 cerr << "Invalid deletion!" << endl;
  249.                 exit(1);
  250.         }
  251.         item = currPtr->data;
  252.         deleteCurrent();
  253.         return item;
  254. }

  255. /*删除链表当前位置的结点*/
  256. template <class T> void LinkedList<T>::deleteCurrent()
  257. {
  258.         cNode<T>* p;
  259.         if (currPtr == NULL)//如果链表为空或者到达表尾
  260.         {
  261.                 cerr << "Invalid deletion!" << endl;
  262.                 exit(1);
  263.         }
  264.         if (prevPtr == NULL) //删除操作发生在表头或者表中
  265.         {
  266.                 p = front;  //保存头结点地址
  267.                 front = front->NextNode();  //将其从链表分离
  268.         }
  269.         else  //分离prevPtr之后的一个内部结点,保存其地址
  270.         {
  271.                 p = prevPtr->deleteAfter();
  272.         }
  273.         if (p == rear)  //如果尾节点被删除
  274.         {
  275.                 rear = prevPtr;  //新的表尾是prevPtr
  276.                 position--;  //position回退一步
  277.         }
  278.         currPtr = p->NextNode();  //使currPtr越过被删除的结点
  279.         freeNode(p);  //释放节点,并使链表长度减-
  280.         size--;
  281. }

  282. //返回一个当前节点的数值引用
  283. template <class T>T& LinkedList<T>::data()
  284. {
  285.         if (size == 0 || currPtr == NULL) //如果链表为空,或者到达链表尾
  286.         {
  287.                 cerr << "Data:invalid reference!" << endl;
  288.                 exit(1);
  289.         }
  290.         return currPtr->data;
  291. }

  292. /*清空链表*/
  293. template <class T> void LinkedList<T>::clear()
  294. {
  295.         cNode<T>* currPosition, * nextPosition;
  296.         currPosition = front;
  297.         while (currPosition != NULL)
  298.         {
  299.                 nextPosition = currPosition->NextNode(); //取得下一个结点的地址
  300.                 FreeNode(currPosition);//删除当前节点
  301.                 currPosition = nextPosition;  //当前指针移到下一个结点
  302.         }
  303.         front = rear = NULL;
  304.         prevPtr = currPtr = NULL;
  305.         size = 0;
  306.         position = -1;
  307. }
  308. #endif
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-18 22:25:01 | 显示全部楼层
看起来可是一点也不简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-18 22:43:27 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-18 22:25
看起来可是一点也不简单

确实代码比较多,原理应该比较简单吧,可是我作为小白,真的觉得好难搞懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 22:55:06 | 显示全部楼层
哪些地方出错了呢?错误提示是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-18 23:04:18 | 显示全部楼层
chxchxkkk 发表于 2020-5-18 22:55
哪些地方出错了呢?错误提示是啥

错误就是: 许多“nextNode”: 找不到标识符;
                 许多  “p”: 找不到标识符;
                 许多 “nNode”: 找不到标识符;
                 许多 “cNode”: 找不到标识符;       
                 许多 “currPosition”: 找不到标识符;
                 许多 “nextPosition”: 找不到标识符;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-19 08:58:55 | 显示全部楼层
不知道你自己写的Node.h中都定义了什么
反正你的这段程序中没有看到 nextNode,Node,cNode的定义。所以你声明的这几种类型的变量p,currPosition,nextPosition都是无效的。
先检查一下#include引入的那个自己写的头文件Node.h吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 04:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表