greenwooo 2022-03-15 16:22 采纳率: 66.7%
浏览 53
已结题

c++单链表一直报错,如何解决

没学过c++,写完也不知错哪里,编译器一直报错,怎么去解决?


#include <iostream>




 //定义线性表类型List

 template <class T>

 class List {

      void clear();

      bool isEmpty();

      bool insert(const int p, const T value);

      bool delete1(const int p);

      bool getPos(int& p, const T value);

      bool getValue(const int p, T & value);

      bool setValue(const int p, const T value);

    
};



 //定义单链表结点类型

 template <class T>

 class Link {

 public:

      T data;

      Link<T> *next;

    
};



 //定义单链表类型lnkList

 template <class T>

 class lnkList : public List<T>
 {

 private:

     Link<T>* head, * tail;

     //头指针、尾指针



             //返回单链表第p个元素的地址(p=-1返回头结点地址,0返回第1结点地址,不存在返回NULL)

     Link<T>* setPos(const int p) {

         if (p == -1) return head;  //p为-1则返回头结点地址

         int count = 0;

         Link<T>* tmp = head->next;   //c指向第1个结点   head->头结点   c->第1结点

         while (tmp != NULL && count < p) {    //head->头结点->第1结点->c第2结点->第3结点NULL 
             count++;

             tmp = tmp->next;     //c指向下一结点(指针传递技术)   


         }

         return tmp;


     }

     //c指向尾结点的条件:c->next==NULL

         //c指向倒数第二个结点的条件: c->next->next==NULL

 public:

     //构造函数:构造一个只有头结点的空链表

     lnkList() {

         head = tail = new Link<T>;

         head->next = NULL;


     }

     //析构函数:删除所有结点

     ~lnkList() {

         Link<T>* tmp;

         while (head != NULL) {

             tmp = head;    //tmp指向头结点

             head = head->next;  //head指向下一结点

             delete tmp;    //释放头结点


         }


     }
     //1.清除
     bool clear()
     {
         Link<T>* tmp;
         tmp = head->next;
         while (tmp != NULL)
         {
             head->next = tmp->next;
             delete tmp
                 tmp = head->next;
         }
         return true;
     }





     //2.显示

     bool display() {

         Link<T>* tmp = head->next; //tmp指向第1结点

         if (tmp == NULL) cout << "空表\n";

         else {

             while (tmp != NULL) {

                 cout << tmp->data << "  ";

                 tmp = tmp->next;  //tmp指向下一结点


             }

             cout << endl;


         }

         return true;


     }

     //3.求表长

     bool length(int& i) {

         i = 0;

         Link<T>* p = head->next; //p指向第1结点

         while (p != NULL) {

             i++;

             p = p->next;


         }

         return true;


     }
     // 4.插入
     bool insert(const int p, const T value)
     {
         Link<T>* tmp, * q;
         if ((tmp = setPos(p - 1)) == NULL)
         {
             cout << "非法插入点" << end1;
             return false;
         }
         q = new Link<T>;
         q->data = value;
         q->next = tmp->next;
         tmp->next = q;
         if (tmp == tail)
             tail = q;
         return true;
     }









     //5.追加

     bool append(const T value) {

         Link<T>* tmp, * q;

         q = new Link<T>; //q指向新结点

         q->data = value;  //填入新结点的数据域

         q->next = NULL;  //填入新结点的指针域NULL

         p = tail;    //p指向尾结点,也可以p=head->next; while(p->next!=NULL) p=p->next;

         tmp->next = q;   //新结点链入原尾结点之后

         tail = q;    //修改尾指针

         return true;


     }

     //尾结点的条件p->next == NULL,头结点的条件p == head

         //第1结点的条件p == head->next,单链表结束的条件 p == NULL

 //6.删除
     bool delete1(const int p)
     {
         Link<T>* tmp, * q;
         if ((tmp = setPos(p - 1)) = NULL || tmp == tail)
         {
             cout << "非法删除点" << end1;
             return false;
         }
         q = tmp->next;
         if (q == tail)
         {
             tail = tmp;
             tmp->next == NULL;
             delete q;
         }
         else if (q != NULL)
         {
             tmp->next = q->next;
             delete q;
         }
         return true;
     }

     //7.查找
     bool getValue(const int p, T& value)
     {
         Link <T>* tmp = head->next;
         int i = 1;
         while (tmp != NULL && i < p)
         {
             tmp = tmp->next;
             i++;
         }
         value = tmp->data;
         return true;
     }

     //8.修改
     bool setValue(const int p, T& value)
     {
         Link<T>* tmp = head->next;
         int i = 1;
         while (tmp != NULL && i < p)
         {
             tmp = tmp->next;
             i++;
         }
         tmp->data = value;
         return true;
     }

     //9.定位
     bool getPos(int& p, const T value)
     {
         Link<T>* tmp = head->next;
         int i = 0;
         while (tmp != NULL)
         {
             if (tmp->data == value)
             {
                 p = i;
                 return ture;
             }
             i++;
             tmp = tmp->next;
         }
         return true;
     }
 };
 








     void main()
     {
         lnkList<int> LL;

         int choice, p, value;

         bool ok;

         do
         {
             cout << "单链表程序(0退出,1清除,2显示,3表长,4插入,5追加,6删除,7查找,8修改,9定位),请选择:";

             cin >> choice;

             switch (choice)
             {

             case 0:

                 cout << "再见!\n";

                 break;

             case 1:
                 ok = LL.clear();
                 if (ok == true) cout << "清除操作成功!\n";
                 else cout << "清除操作失败!\n";


                 break;

             case 2:

                 ok = LL.display();

                 if (ok == true) cout << "显示操作成功!\n";

                 else cout << "显示操作失败!\n";

                 break;

             case 3:

                 ok = LL.length(p);

                 if (ok == true) cout << "求表长操作成功!表长为:" << p << endl;

                 else cout << "求表长操作失败!\n";

                 break;

             case 4:
                 cout << "位置: "cin >> p;
                 cout << "元素:  "cin >> value;
                 ok == LL.insert(p, value);
                 if (ok == true)cout << "插入操作成功!\n";
                 else cout << "插入操作失败!\n";


                 break;

             case 5:

                 cout << "请输入元素值:"; cin >> value;

                 ok = LL.append(value);

                 if (ok == true) cout << "追加操作成功!\n";

                 else cout << "追加操作失败!\n";

                 break;

             case 6:
                 cout << "位置:"; cin >> p;
                 ok == LL.delete1(p);
                 if (ok == true)cout << "删除表元操作成功!\n";
                 else coout << "删除表元操作失败!\n";


                 break;

             case 7:
                 cout << "位置:"; cin >> p;
                 ok == LL.getValue(p, value);
                 if (ok == ture)cout << "查表元操作成功!\n元素值为:" << value << end1;
                 else cout << "差表元操作失败!\n";

                 break;

             case 8:
                 cout << "位置:";cin >> p;
                 cout << "元素:";cin >> value;
                 ok == LL.setValue(p, value);
                 if (ok == true)cout << "修改表元操作成功!\n";
                 else cout << "修改表元操作失败!\n";

                 break;

             case 9:
                 cout << "元素:";cin >> value;
                 ok == LL.getPos(p, value);
                 if (ok == false) cout << "元素不存在!\n";
                 else
                 {
                     cout << "定位操作成功!\n";
                     if (p == 0)  cout << "元素不存在!\n";
                     else cout << "元素位置为:" << p << end1;
                 }
                 break;

             default:

                 cout << "选择错误!\n";
             }
             while (choice != 0);
         }
     }
  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-03-15 16:30
    关注

    你倒是把错误信息帖出来看看

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计