小游 发表于 2017-7-13 22:22:40

有没有大神可以帮我看看这个代码啊

就是我想有一个基类,然后一个单链表类继承他,但是总是有错误 可不可以帮我看一下啊
#include<iostream>
using namespace std;
struct D_Node{
        double data;
        D_Node *next;
};
class Link_List{
public:
        Link_List(int num);                                                                   //初始化节点个数
        virtual void Create(D_Node *pHead)=0;          //创建单链表
        //virtual void D_Insert(double element,int n)=0;                        //插入节点
        virtual void showNode(D_Node *pHead)=0;               //显示链表
        //virtual void getNode(D_Node *pHead)=0;                //获取节点个数
protected:
        D_Node node;
        int num;
};
Link_List::Link_List(int num){                  
        this->num=num;
}
class S_Link_List:public Link_List{                                                //单链表继承于Link_List
public:
        S_Link_List();
        S_Link_List(int num);
        D_Node *getHead(){
        return pHead;
}                               //获取头节点
        virtual void Create(D_Node *pHead);
        virtual void showNode(D_Node *pHead);
private:
        D_Node *pHead;
};
S_Link_List::S_Link_List(int num):Link_List(num){
        pHead=new D_Node;
        pHead->next=NULL;
};
void S_Link_List::Create(D_Node *pHead){
        D_Node *temp;
        D_Node *p;
        temp=pHead;
        for(int i=1;i<num;i++){
                int a;
                p=new D_Node;
                cin>>a;
                p->data=a;
                p->next=NULL;
                temp->next=p;
        }
        temp->data=NULL;
        delete temp,p;
}
void S_Link_List::showNode(D_Node *pHead){
        cout<<"pHead->";
        D_Node *temp;
        temp=pHead;
        while(temp->next!=NULL){
                temp=temp->next;
                cout<<temp->data<<"->";
       
        }
        delete temp;
        cout<<endl;
}
int main(){
        cout<<"下面创建单链表,请输入节点个数:";
        int NO;
        cin>>NO;
        cout<<endl;
        S_Link_List list(NO);
        cout<<"请输入节点数据:";
        list.Create(list.getHead());
        cout<<endl<<"下面是创建的单链表:"<<endl;
        list.showNode(list.getHead());
        system("pause");
        return 0;
}

BngThea 发表于 2017-7-14 13:06:37

本帖最后由 BngThea 于 2017-7-14 13:49 编辑

首先,建议把错误信息也贴出来
可能存在以下问题:
1 基类没有定义默认构造函数,这时调用子类的默认构造函数会出错
2 子链表类缺少析构函数,这样当其对象在作用域消亡时,会导致内存泄漏
3 创建单列表的Create函数逻辑不对,而且 int a的定义请放到循环外,cin语句可能需要输入格式判定,最后的delete语句使用明显不对
4 同样的,在ShowNode函数中的delete使用也存在问题,请注意delete和new配对使用

以下是我修改过可以正确执行的代码:
#include<iostream>
using namespace std;

struct D_Node
{
      double data;
      D_Node *next;
};

class Link_List
{
public:
      Link_List(){}//默认构造
      Link_List(int num){ this->num = num;}
      virtual void Create(D_Node *pHead) = 0;          //创建单链表
      virtual void showNode(D_Node *pHead) = 0;      //显示链表

protected:
      D_Node node;
      int num;
};


class S_Link_List:public Link_List
{   
public:
      S_Link_List(){}
      S_Link_List(int num);
      ~S_Link_List();//析构函数,用来释放内存
      D_Node *getHead(){return pHead;} //获取头节点
      virtual void Create(D_Node *pHead);
      virtual void showNode(D_Node *pHead);
private:
      D_Node *pHead;
};

S_Link_List::S_Link_List(int num):Link_List(num)
{
      pHead = new D_Node;
      pHead->next = NULL;
};

S_Link_List::~S_Link_List()
{
      D_Node * temp = pHead;
      while (temp->next != NULL)
      {
                pHead = temp->next;
                delete temp;
                temp = pHead;
      }      
}

void S_Link_List::Create(D_Node *pHead)
{
      D_Node *temp;
      D_Node *p;
      temp = pHead;

      cout << "请输入第1个节点的数据:";
      cin >> pHead->data;

      for(int i = 2;i < num + 1; i++)
      {
                p = new D_Node;
                cout << "请输入第 " << i << "个节点的数据:";
                cin >> p->data;
                pHead->next = p;
                pHead = p;
      }
      pHead->next = NULL;      
      p = NULL;
      pHead = temp;
}

void S_Link_List::showNode(D_Node *pHead)
{
      cout << "头部\t->\t";
      D_Node *temp = pHead;
      while(pHead)
      {               
                cout << pHead->data << "\t->\t";
                pHead = pHead->next;
                if (!pHead)
                     cout << "尾部" << endl;                              
      }
      pHead = temp;
      cout << endl;
}


int main()

上述代码还可以完善,比如对输入的链表数值进行判定,对每次输入的节点数据进行判定等。

小游 发表于 2017-7-21 19:59:31

BngThea 发表于 2017-7-14 13:06
首先,建议把错误信息也贴出来
可能存在以下问题:
1 基类没有定义默认构造函数,这时调用子类的默认构造 ...

谢谢你
页: [1]
查看完整版本: 有没有大神可以帮我看看这个代码啊