谁能帮我看看这个链表的删除结点的函数的问题?

tommyxdf 2009-03-04 01:10:59
void Polynomial::deleteElement(int n)
{
NumberElement *elementPtr;
NumberElement *previousElement;

if(!head)
return;

if(head->exponent==n)
{
elementPtr = head->next;
delete head;
head = elementPtr;
}
else
{
elementPtr = head;

while(elementPtr!=NULL&&elementPtr->exponent!=n)
{
previousElement = elementPtr;
elementPtr = elementPtr->next;
}

if(elementPtr)
{
previousElement->next = elementPtr->next;
delete elementPtr;
}

else
cout <<"The element you want to delete does not exist."<<endl;
}
}
我运行时候发现 结果可以显示,但是所要删除的结点并没有删除。不知道是怎么回事。
...全文
84 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tommyxdf 2009-03-04
  • 打赏
  • 举报
回复
晕死。。。
hai040 2009-03-04
  • 打赏
  • 举报
回复
cout < <"To delete an element, please specify the exponent of the element." < <endl;
cin >> exponent;
cout < <"After the operation, the new polynomial object is:" < < endl;
cout < < poly1;

没运行deleteElement
tommyxdf 2009-03-04
  • 打赏
  • 举报
回复
运行文件:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "Polynomial.h"

int main()
{
Polynomial poly1;
Polynomial poly2;
Polynomial poly3;

int coefficient, exponent;


bool end = false;
char choice;

cout << "Please input the number element of polynomial one:"<<endl;
while(!end)
{
cin >> poly1;
cout << "Add more?[Y/N]: ";
cin >> choice;
choice = toupper(choice);
if(choice=='N')
{
end = true;
}
}
end = false;

Polynomial polyCopy(poly1);
cout <<"Now, a new Polynomial object polyCopy has been created,"<<endl;
cout <<" which has invoked its copy constructor."<<endl;
cout << "For polyCopy:"<<endl;
cout << polyCopy;

cout <<"To insert an element, please input the coefficient and exponent:"<<endl;
cin >> coefficient >> exponent;
poly1.insertElement(coefficient, exponent);
cout <<"After the operation, the new polynomial object is:" << endl;
cout << poly1;

cout <<"To delete an element, please specify the exponent of the element."<<endl;
cin >> exponent;
cout <<"After the operation, the new polynomial object is:" << endl;
cout << poly1;

cout << "Please input the number element of polynomial two:"<<endl;
while(!end)
{
cin >> poly2;
cout << "Add more?[Y/N]: ";
cin >> choice;
choice = toupper(choice);
if(choice=='N')
{
end = true;
}
}

cout<<"For Polynomial one:"<<endl;
cout<<poly1<<endl;
cout<<"For Polynomial two:"<<endl;
cout<<poly2<<endl;

poly3 = poly1 + poly2;
cout<<"The result is:"<<endl;
cout<<poly3;

return 0;
}
运行到删除元素时,输入删除元素后再输出发现式子没变,根本就没有删除。
tommyxdf 2009-03-04
  • 打赏
  • 举报
回复
类文件:
// Member-function definitions for class Polynomial
#include <iostream>
using std::cerr;
using std::cout;
using std::cin;
using std::endl;

#include "Polynomial.h"

Polynomial::Polynomial(const Polynomial &polyCopy)
{
NumberElement *elementPtr;

elementPtr = polyCopy.head;
NumberElement *nm=new NumberElement;
head=nm;
NumberElement *np=polyCopy.head;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
while(np->next!=0)
{
nm->next = new NumberElement;
nm=nm->next; np=np->next;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
}
nm->next = NULL;
}


void Polynomial::insertElement(int a, int b)
{
NumberElement *newElement;
NumberElement *elementPtr;
NumberElement *previousElement = NULL;

newElement = new NumberElement;
newElement->coefficient = a;
newElement->exponent = b;

if(!head)
{
head = newElement;
newElement->next = NULL;
}

else
{
elementPtr = head;
previousElement = NULL;

while(elementPtr!=NULL&&newElement->exponent<elementPtr->exponent)
{
previousElement = elementPtr;
elementPtr = elementPtr->next;
}

if(previousElement==NULL)
{
head = newElement;
newElement->next = elementPtr;
}

else
{
if(elementPtr==NULL)
{
previousElement->next = newElement;
newElement->next = NULL;
}
else if(newElement->exponent==elementPtr->exponent)
{
elementPtr->coefficient = elementPtr->coefficient + newElement->coefficient;
}
else
{
previousElement->next = newElement;
newElement->next = elementPtr;
}
}

}
}

void Polynomial::deleteElement(int n)
{
NumberElement *elementPtr;
NumberElement *previousElement;

if(!head)
return;

if(head->exponent==n)
{
elementPtr = head->next;
delete head;
head = elementPtr;
}
else
{
elementPtr = head;

while(elementPtr!=NULL&&elementPtr->exponent!=n)
{
previousElement = elementPtr;
elementPtr = elementPtr->next;
}

if(elementPtr)
{
previousElement->next = elementPtr->next;
delete elementPtr;
}

else
cout <<"The element you want to delete does not exist."<<endl;
}
}

const Polynomial &Polynomial::operator=(const Polynomial &right)
{

NumberElement *p,*q, *r;
head = NULL;
if (!right.head)
return *this;
head = new NumberElement;
head->coefficient = right.head->coefficient;
head->exponent = right.head->exponent;
head->next = NULL;
r=NULL;
p=head;
q=right.head->next;
while(q!=NULL)
{
r = new NumberElement;
r->coefficient = q->coefficient;
r->exponent = q->exponent;
r->next = NULL;
p->next = r;
p = p->next;
q = q->next;
}
return *this;

}

Polynomial Polynomial::operator+(const Polynomial &polyAdd)
{
Polynomial temp;
NumberElement *p, *q;
p = this->head;
q = polyAdd.head;
int coefficient, exponent;

temp.head = new NumberElement;
if (p->exponent==q->exponent)
{
coefficient = p->coefficient + q->coefficient;
exponent = p->exponent;
temp.head->coefficient = coefficient;
temp.head->exponent = exponent;
temp.head->next = NULL;
p = p->next;
q = q->next;
}

else if(p->exponent>q->exponent)
{
coefficient = p->coefficient;
exponent = p->exponent;
temp.head->coefficient = coefficient;
temp.head->exponent = exponent;
temp.head->next = NULL;
p = p->next;
}

else if(p->exponent<q->exponent)
{
coefficient = q->coefficient;
exponent = q->exponent;
temp.head->coefficient = coefficient;
temp.head->exponent = exponent;
temp.head->next = NULL;
q = q->next;
}

while(p!=NULL&&q!=NULL)
{
if(p->exponent>q->exponent)
{
coefficient = p->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
p = p->next;
}

else if(p->exponent<q->exponent)
{
coefficient = q->coefficient;
exponent = q->exponent;
temp.insertElement(coefficient, exponent);
q = q->next;
}

else
{
coefficient = p->coefficient + q->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
p = p->next;
q = q->next;
}
}

while (p!=NULL&&q==NULL)
{
coefficient = p->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
p = p->next;
}

while(q!=NULL&&p==NULL)
{
coefficient = q->coefficient;
exponent = q->exponent;
temp.insertElement(coefficient, exponent);
q = q->next;
}

return temp;
}

bool Polynomial::operator== (const Polynomial &right)
{
NumberElement *leftElement = this->head;
NumberElement *rightElement = right.head;
bool boolean = true;

if(leftElement!=NULL&&rightElement==NULL)
{
boolean = false;
return boolean;
}

else if(leftElement==NULL&&rightElement!=NULL)
{
boolean = false;
return boolean;
}

else if(leftElement==NULL&&rightElement==NULL)
{
boolean = true;
return boolean;
}

while(leftElement==rightElement)
{
leftElement = leftElement->next;
rightElement = rightElement->next;
}

if(leftElement!=NULL||rightElement!=NULL)
{
boolean = false;
}

return boolean;
}


void Polynomial::display(ostream &out) const
{
NumberElement *elementPtr = this->head;
while(elementPtr->next!=NULL)
{
out << elementPtr->coefficient << "X^" << elementPtr->exponent << " + ";
elementPtr = elementPtr->next;
}

if (elementPtr->exponent==0)
out << elementPtr->coefficient<<endl;
else
out << elementPtr->coefficient << "X^" << elementPtr->exponent <<endl;
}

void Polynomial::read(istream &in)
{
NumberElement *inPtr = new NumberElement;
int coefficient, exponent;
in>>coefficient>>exponent;
inPtr->coefficient = coefficient;
inPtr->exponent = exponent;

if(!head)
{
head = inPtr;
head->next = NULL;
}
else
insertElement(coefficient, exponent);
}

Polynomial::~Polynomial()
{
NumberElement *elementPtr;
NumberElement *nextElement;

elementPtr = head;

while (elementPtr != NULL)
{
nextElement = elementPtr->next;

delete elementPtr;

elementPtr = nextElement;
}
}


istream &operator>>(istream &in, Polynomial &poly)
{
poly.read(in);
return in;
}




ostream &operator<<(ostream &out, const Polynomial &poly)
{
poly.display(out);

return out;
}
tommyxdf 2009-03-04
  • 打赏
  • 举报
回复
这链表没有重复元素 我反复看了半天也找不出来什么错误。
这是我的头文件:
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

#include <iostream>
using std::ostream;
using std::istream;

class Polynomial
{


private:
struct NumberElement
{
int coefficient;
int exponent;
struct NumberElement *next;
};
NumberElement *head;

public:
Polynomial()
{
head = NULL;
}
Polynomial(const Polynomial &);
~Polynomial();

const Polynomial &operator=( const Polynomial &);
Polynomial operator+(const Polynomial &);
bool operator==( const Polynomial &right);

void insertElement(int, int);
void deleteElement(int);
void display(ostream &) const;
void read(istream &);
};
istream &operator>>( istream &, Polynomial &);
ostream &operator<<( ostream &, const Polynomial &);

#endif
pengzhixi 2009-03-04
  • 打赏
  • 举报
回复
如果你这个链表允许重复的元素的话,应该就只能删除一个啊.看了下,逻辑上应该没错

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧