单链表类问题(包含了运算符重载)

时间:2021-03-27 17:22:40
单链表类实现如下:
#include <iostream.h>
#include <iomanip.h>
#include "MyList.h"

//无参构造函数
MyList::MyList()
{
head = NULL;
}

//析构函数
MyList::~MyList()
{
NODE *p=head,*q;

if (head == NULL)
return;
else
{
while(p!=NULL)
{
q=p->next;
delete p;
p=q; 
}
}
}

//增加一个节点
int MyList::AddNode(int num)
{
NODE *p;

p = head;
head = new NODE;
if (head == NULL)
return -1;

head->num = num;
head->next = p;
return 0;
}

//输出整个链表
void MyList::DisplayList()
{
NODE *p;
int i=0;

cout<<"链表为:"<<endl;
p=head;
while(p!=NULL)
{
cout<<setw(10)<<p->num;
i++;
if(i%10==0)
cout<<endl;
p=p->next;
}
cout<<endl;
}

//定义拷贝构造函数
MyList::MyList(const MyList &src)
{
head=NULL;
NODE *p=src.head;
while(p!=NULL)
 {
  AddNode(p->num);
  p=p->next;
 }
}
//前自增
MyList &MyList::operator ++()
{
NODE *p;
p=head;
while(p!=NULL)
 {
  (p->num)++;
  p=p->next;
 }
return *this;
}
//后自增
MyList MyList::operator ++(int)
{
MyList m(*this);    //调用拷贝构造函数
NODE *p;
p=head;
while(p!=NULL)
 {
  (p->num)++;
  p=p->next;
 }
return m;          //返回原来链表
}
int MyList::FindNode(int num)
{
NODE *p;
p=head;
while(p!=NULL&&p->num!=num)
  p=p->next;
if(p!=NULL) return 1;
else return 0;
}
int MyList::DelNode(int num)
{
NODE *p,*q;
q=p=head;
while(p->num!=num&&p!=NULL)
{
 q=p;
 p=p->next;
}
if(p!=NULL)
{
 q->next=p->next;
 if(p==head)
 {
   head=head->next;
 }
 delete p;
 return 1;
}
else return 0;
}

主函数如下:
#include <iostream.h>
#include "MyList.h"

int main()
{
MyList obj;
obj.AddNode(4);
obj.AddNode(3);
obj.DisplayList(); 
(obj++).DisplayList();
(++obj).DisplayList();
return 1;
}

运行结果如下:

链表为:
         3         4
链表为:
         3         4
链表为:
         5         6

按照我的程序,主函数中第二次输出结果应该为: 
4        3
因为在调用拷贝构造函数时,m的链表结点顺序被我倒了过来。但运行结果却未倒过来。请大家解释一下!

5 个解决方案

#1


(obj++).DisplayList();
obj.DisplayList(); 后obj++;
要不然和前增有什么逻辑上的区别呢

#2


问题是我在后自增中调用了拷贝构造函数,返回的是新产生的链表m,按照我的程序,m的顺序应该是和原来链表的顺序相反的,但运行结果却未倒过来。问题的焦点不是前自增和后自增的区别!

#3


请高手讨论!

#4


失望,没人回答,给分算了。

#5


你的程序和你想要的结果是一致的!
但你对后缀自增运算符的重载不符合习惯用法。

#1


(obj++).DisplayList();
obj.DisplayList(); 后obj++;
要不然和前增有什么逻辑上的区别呢

#2


问题是我在后自增中调用了拷贝构造函数,返回的是新产生的链表m,按照我的程序,m的顺序应该是和原来链表的顺序相反的,但运行结果却未倒过来。问题的焦点不是前自增和后自增的区别!

#3


请高手讨论!

#4


失望,没人回答,给分算了。

#5


你的程序和你想要的结果是一致的!
但你对后缀自增运算符的重载不符合习惯用法。