|
|
发表于 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()
复制代码
上述代码还可以完善,比如对输入的链表数值进行判定,对每次输入的节点数据进行判定等。 |
|