王也枉不了 2021-01-22 18:34 采纳率: 33.3%
浏览 49

这个c++有序的单向链表是哪错了啊,搞一下午了。。。。

/*已知一个有序链表类LinkSortList及main函数的部分代码如下,
 请完成LinkSortList类的成员函数,得到对应的运行结果,勿改动main函数。*/
//有序表类

#include <iostream>
using namespace std;
template <class T>
struct Node
{
    T  data;
   Node<T> *next;
};
template <class T>
class LinkSortList
{
 public:
    LinkSortList( ); //建立只有头结点的空链表
    ~LinkSortList();             //析构函数
    void Insert(T x);   //在有序单链表中插入元素x使序列仍有序
    int Length();      //求表长
    int DeleteOdd();     //在单链表中删除所有奇数,返回值为奇数个数
    void DispList( );     //遍历有序单链表,按序号依次输出各元素
 private:
   Node<T> *first; //单链表的头指针
};
template <class T>
 LinkSortList<T>::LinkSortList( )//建立只有头结点的空链表
 {
     first = new Node<T>;
     first->next = nullptr;
 }
 template <class T>
    LinkSortList<T>::~LinkSortList()            //析构函数
    {
        Node<T> *p;
        p = first;
        while(p!=nullptr)
        {
           first = first->next;
           delete p;
           p = first;

        }
    }
    template <class T>
    void LinkSortList<T>::Insert(T x)   //在有序单链表中插入元素x使序列仍有序
      {
       //cout<<x<<" ";// 离谱
        Node<T> *p = first;
        Node<T> *s;
        s = new Node<T>;
        s->data = x;
       if(p->next!=nullptr)
        {

            while(p->next ->data <= x )
        {
        p = p->next;
        }
        s->next = p->next;
         p->next = s;
        }
        else
{
    p->next  =  s  ;

}
    }

    template <class T>
    int LinkSortList<T>::Length()     //求表长
    {
        Node<T> *p;
        p=first;
        int count = 0 ;
        while(p!=nullptr)
        {
           p = p->next;
           count ++;
        }
        return count ;
    }

    template <class T>
    int LinkSortList<T>::DeleteOdd()    //在单链表中删除所有奇数,返回值为奇数个数
    {
        Node<T>*p;
        p=first;
        int count = 0;
        while(p!=nullptr)
        {
            p=p->next;
            if(p->next->data % 2 != 0)
            {
                p->next->next = p->next;
                count ++;
            }
        }
        return count;

    }
    template <class T>
    void LinkSortList<T>::DispList( )    //遍历有序单链表,按序号依次输出各元素
    {
        Node<T> *p =first;
        while(p!=nullptr)
        {
            p = p->next;
            cout << p->data<<" ";
        }
        cout <<Length();
    }
int main( ){
 LinkSortList<int> sa;
 int x;
 while(1)
 {
  cin>>x;
        if(!x)break;//
  sa.Insert(x);//cout <<x;

 }
    sa.DispList();
 int count=sa.DeleteOdd();
 cout<<"Count of deleted odds:"<<count<<endl;
 sa.DispList();
 return 0;
}
/*
Input
Output
Sample Input
42 5 32 56 34 7 233 1 0
Sample Output
The length:8
The elements:1 5 7 32 34 42 56 233
Count of deleted odds:4
The length:4
The elements:32 34 42 56 */
 

  • 写回答

1条回答 默认 最新

  • 泡视界 2021-01-22 19:04
    关注

    大兄弟,你的插入函数Insert(T x)有误啊

    当链表里有元素,再插入新元素的时候

    加入新元素的值是最大的,那按你的写法

     while (p->next->data <= x)

      {
                p = p->next;
      }

    p会就会指到最后一个元素,然后再次循环的时候p->next ==nullptr,

    while判断条件的时候就会造成 p->next->data 空指针引用,造成程序崩溃。

    你需要重新设计一下你的插入函数

    评论

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号