30/09/2018, 18:31

Các anh chị giúp em về sửa lỗi sai code danh sách liên kết đơn

em đang mò mẫm code thì không hiểu sao không chạy được chương trình , nó báo lỗi dòng số 34 . nghĩ mãi không ra nên anh chị giúp em với ạ (nhập xuất phân số thì em đã chạy được rồi, nhưng đến phần xóa 1 phần tử cuói thì lại không đc !!)

#include"iostream"
using namespace std;
class phanso{
	private:
	   int ts,ms;
	public:
		void nhapphanso(phanso &a);
		void xuatphanso(phanso &a);
};
class node{
	private:
		phanso data;
		node *pNext;
	friend class list;
};
class list{
	private:
		node *pTail,*pHead;
	public:
		void Init(list &l);
		node* getnode(phanso x);
		void addTail(list &l,node *p);
		void addHead(list &l,node *p);
		void nhap(list &l);
		void xuat(list l);
       	void xoacuoi(list &l);
       	
};
void list::xoacuoi(list &l)
{
	node *p;
	for(node *k=l.pHead;k!=NULL;k=k->pNext)
	{
		if(k->data==l.pTail->data)
		   {
		   	  l.pTail=p;
		   	  l.pTail->pNext=NULL;
			  delete k;
			  return ; 
		   }
		p=k;
	}
}
void phanso::nhapphanso(phanso &a)
	{
		cout<<"
 nhap tu so va mau so  : ";
		cin>>a.ts>>a.ms;
	}
void phanso::xuatphanso(phanso &a)
	{
		cout<<a.ts<<"/"<<a.ms<<"
";
	}
void list::Init(list &l)
{
	l.pTail=l.pHead=NULL;
}
node* list::getnode(phanso x)
{
	node *p;
	p=new node;
	if(p==NULL)
	{
		return NULL;
	}
	else
	{
		p->data=x;
		p->pNext=NULL;
		return p;
	}
}
void list::addTail(list &l, node *p)
{
	if(l.pHead==NULL)
	   l.pTail=l.pHead=p;
	else
	{
		l.pTail->pNext=p;
		l.pTail=p;
	}
}

void list::nhap(list &l)
{
	node *p;
	int n;
	phanso x;
	cout<<"
 nhap so phan tu: ";
	cin>>n;
	Init(l);
	for(int i=1;i<=n;i++)
	{
        x.nhapphanso(x);
		p=getnode(x);
		addTail(l,p);
	}
}
void list::xuat(list l)
{
	phanso x;
	for(node *p=l.pHead;p!=NULL;p=p->pNext)
	{
		x.xuatphanso(p->data);
	}
}
int main()
{
	list l;
    l.nhap(l);
	l.xuat(l); 
 
}
minh viết 20:33 ngày 30/09/2018

@Pham_Van_Hai @Gio 2 anh hôm gì giúp em với

viết 20:35 ngày 30/09/2018

Mình thấy xóa cuối thì chỉ cần tìm phần tử kế cuối rồi trỏ next =NULL sau đó xóa cuối là được.

Pham Van Hai viết 20:46 ngày 30/09/2018

Bạn không thể so sánh hai đối tượng trực tiếp như này trừ khi bạn viết lại toán tử == cho lớp phân số.

if(k->data==l.pTail->data)

Việc xóa phần tử cuối cùng bạn không càn duyệt đến phần tử cuối cùng, chỉ cần duyệt đến phần tử trước đó thôi:

node *p;
node *k = l.pHead;
while (k->pNext) {
    p = k;
    k = k->pNext;
}
delete p->pNext;
p->next = NULL;
l.pTail = p;
minh viết 20:45 ngày 30/09/2018

em xin cám ơn 2 anh ạ

Bài liên quan
0