鱼C论坛

 找回密码
 立即注册
查看: 2636|回复: 2

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

[复制链接]
发表于 2017-7-13 22:22:40 | 显示全部楼层 |阅读模式

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

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

x
就是我想有一个基类,然后一个单链表类继承他,但是总是有错误 可不可以帮我看一下啊
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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()

上述代码还可以完善,比如对输入的链表数值进行判定,对每次输入的节点数据进行判定等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 10:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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