Lỗi cộng trừ hai đa thức (sử dụng con trỏ và struct)

Dạ em chào mọi người, em đang học Con Trỏ kết hợp với Struct, và em đang thực hành bài tập về Cộng Trừ Hai Đa Thức (sử dụng Struct và Con Trỏ).

Nhưng em đang mắc một lỗi đó là sau khi thực hiện hàm Cộng và Trừ, thì chương trình chạy bị lỗi, lúc thì in ra được kết quả nhưng lỗi số cuối, nhưng lúc lại chỉ in được một đa thức rồi kết thúc chương trình. Em tìm nhưng vẫn không biết sai ở đâu và tại sao, mong mọi người giải thích giúp em ạ, em cảm ơn!

#include <bits/stdc++.h>
using namespace std;

struct node{
	float heso;
	int mu;
	node *next;
};

void Inp(node *&L)
{ 
	node *P,*C;
	do {
		P= new node;
		cout<<"He so:";
		cin>>P->heso;
		cout<<"So mu:";
		cin>>P->mu;
		P->next=NULL;
		if (L==NULL)
		{
			L=P;
			C=P;
		}
		else {
			C->next=P;
			C=P;
		}
	} while (P->mu!=0);
}

void Outp(node *L)
{
	node *P;
	P=L;
	while (L!=NULL)
	{
		if (P->mu>0) cout<<P->heso<<"x^"<<P->mu;
		else cout<<P->heso;
		if (P->next!=NULL) cout<<" + ";
		P=P->next;
	}
}

void congdt(node *L1,node *L2,node *LC)
{
	while (L1->next && L2->next) {
        if (L1->mu > L2->mu) {
            LC->mu = L1->mu;
            LC->heso = L1->heso;
            L1 = L1->next;
        }
        else if (L1->mu < L2->mu) {
            LC->mu = L2->mu;
            LC->heso = L2->heso;
            L2 = L2->next;
        }
        else {
            LC->mu = L1->mu;
            LC->heso = L1->heso + L2->heso;
            L1 = L1->next;
            L2 = L2->next;
        }	
        LC->next= (struct node*)malloc(sizeof(struct node));
        LC= LC->next;
        LC->next = NULL;
	}
    while (L1->next || L2->next) {
        if (L1->next) {
            LC->mu = L1->mu;
            LC->heso = L1->heso;
            L1 = L1->next;
        }
        if (L2->next) {
            LC->mu= L2->mu;
            LC->heso= L2->heso;
            L2 = L2->next;
        }
        LC->next= (node*)malloc(sizeof(node));
        LC = LC->next;
        LC->next = NULL;
    }
}

void trudt(node *L1,node *L2,node *LT)
{
    while (L1->next && L2->next) {
        if (L1->mu > L2->mu) {
            LT->mu = L1->mu;
            LT->heso = L1->heso;
            L1 = L1->next;
        }
        else if (L1->mu < L2->mu) {
            LT->mu = L2->mu;
            LT->heso = L2->heso;
            L2 = L2->next;
        }
        else {
            LT->mu = L1->mu;
            LT->heso = L1->heso - L2->heso;
            L1 = L1->next;
            L2 = L2->next;
        }
        LT->next= (node*)malloc(sizeof(node));
        LT = LT->next;
        LT->next = NULL;
    }
    while (L1->next || L2->next) {
        if (L1->next) {
            LT->mu = L1->mu;
            LT->heso = L1->heso;
            L1 = L1->next;
        }
        if (L2->next) {
            LT->mu = L2->mu;
            LT->heso = L2->heso;
            L2 = L2->next;
        }
        LT->next=(node*)malloc(sizeof(node));
        LT = LT->next;
        LT->next = NULL;
    }
}

main()
{
	node *L1=NULL,*L2=NULL,*LC=NULL,*LT=NULL;
	cout<<"Nhap da thuc A:"<<endl;
	Inp(L1);
	cout<<"Nhap da thuc B:"<<endl;
	Inp(L2);
	cout<<"A=";
	Outp(L1);
	cout<<endl;
	cout<<"B=";
	Outp(L2);
	cout<<endl;
	LC=(node*)malloc(sizeof(node));
    congdt(L1, L2, LC);
	Outp(LC);
	cout<<endl;
	LT= (node*)malloc(sizeof(node));
    trudt(L1, L2, LT);
	Outp(LT);
	return 0;
}

Chào em,

Sau khi xem qua đoạn code của em, em bị lỗi khi in ra các đa thức sau khi thực hiện hàm Cộng và Trừ. Vấn đề này có thể do cấp phát động bộ nhớ trong các hàm congdt()trudt() .

Khi em cấp phát bộ nhớ trong hàm congdt()trudt() , em nên thêm kiểm tra nếu con trỏ đang trỏ đến NULL thì không cần cấp phát nữa, vì nếu cấp phát tiếp sẽ dẫn đến lỗi khi truy cập vùng nhớ không hợp lệ.

Thay vì cấp phát bộ nhớ trong hàm congdt()trudt() , em nên cấp phát bộ nhớ cho LCLT trước khi gọi các hàm này. Sau đó, em chỉ cần truyền LCLT vào các hàm congdt()trudt() mà không cần cấp phát bộ nhớ trong các hàm này nữa.

Ngoài ra, em cũng nên kiểm tra nếu danh sách liên kết rỗng thì không nên in ra gì cả. Cụ thể, trong hàm Outp() , em nên kiểm tra nếu danh sách rỗng thì in ra thông báo “Danh sach rong.” thay vì lặp vô hạn.

Sau khi sửa lại các vấn đề trên, đoạn code của em sẽ như sau:

#include <bits/stdc++.h>
using namespace std;

struct node{
    float heso;
    int mu;
    node *next;
};

void Inp(node *&L)
{ 
    node *P,*C;
    do {
        P= new node;
        cout<<"He so:";
        cin>>P->heso;
        cout<<"So mu:";
        cin>>P->mu;
        P->next=NULL;
        if (L==NULL)
        {
            L=P;
            C=P;
        }
        else {
            C->next=P;
            C=P;
        }
    } while (P->mu!=0);
}

void Outp(node *L)
{
    if (L == NULL) {
        cout << "Danh sach rong.";
        return;
    }
    node *P;
    P=L;
    while (P != NULL)
    {
        if (P->mu > 0) cout << P->heso << "x^" << P->mu;
        else cout << P->heso;
        if (P->next != NULL) cout << " + ";
        P = P->next;
    }
}

void congdt(node *L1,node *L2,node *LC)
{
    while (L1 != NULL && L2 != NULL) {
        if (L1->mu > L2->mu) {
            LC->mu = L1->mu;
            LC->heso = L1->heso;
            L1 = L1->next;
        }
        else if (L1->mu < L2->mu) {
            LC->mu =
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?