Bi ểu diễn đa thức rời rạc bằng DSLK (cĩ nút câm)

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 99 - 101)

. Xố nút new_ele; Trả về CurrPtr;

c. Bi ểu diễn đa thức rời rạc bằng DSLK (cĩ nút câm)

Xét đa thức bậc n (an ≠ 0):

P(x) = a0 + a1 x + a2 x2 + ... + an xn

Ta cĩ thể biểu diễn đa thức trên bằng mảng a[n+1] để lưu các hệ số: a[i] = ai, ∀ i = 0, …, n. Với cách biểu diễn này, các phép tốn trên đa thức sẽ được thực hiện đơn giản và nhanh chĩng. Trong trường hợp đa thức rời rạc (đa thức cĩ rất ít hệ số khác 0), cài đặt mảng khơng hiệu qủa rất lãng phí bộ nhớ. Một cách tiếp cận khác là dùng DSLK với nút câm để cài đặt đa thức rời rạc. * Ví dụ: Xét đa thức P(x) = 5 + x99 = 5 + 0*x + 0*x2 + ... + 0*x98 + 1*x99 P ? ? 5 0 1 99 • Mỗi nút cĩ dạng: Hệ số (Coef) Next Số mũ (Expo) • Cài đặt đa thức rời rạc

Trường dữ liệu Data của mỗi nút được biểu diễn bởi: typedef double CoefType;

typedef int ExpoType;

typedef struct { CoefType Coef;

ExpoType Expo;

} ElementType;

Thủ tục Attach thêm một số hạng x ≡{x.Coef, x.Expo} vào cuối đa thức P int Attach(LL P , ElementType x)

{

return InsertElementTailLL2(P, x);

}

Thủ tục cộng hai đa thức

Giả sử các số hạng của các đa thức được lưu tăng theo số mũ vào DSLK đơn cĩ nút câm.

int AddPolynome (LL A, LL B, LL &A_PLUS_B)

{ NodePointer RestList, ptrA, ptrB; CoefType Sum;

if ((A_PLUS_B = CreateEmptyLL2( )) == NULL) return 0; ptrA = A->Next;

ptrB = B->Next; while (ptrA && ptrB)

{ if ((ptrA->Data).Expo < (ptrB->Data).Expo) { if (!Attach(A_PLUS_B, ptrA->Data)) return 0;

ptrA = ptrA->Next; }

else if ((ptrA->Data).Expo > (ptrB->Data).Expo)

{ if (!Attach(A_PLUS_B, ptrB->Data)) return 0; ptrB = ptrB->Next;

}

else { TempData.Coef = (ptrA->Data).Coef + (ptrB->Data).Coef; if (TempData.Coef != 0) //chỉ lưu các số hạng cĩ hệ số khác 0

{ TempData.Expo = ptrtA->Expo;

if (!Attach(A_PLUS_B, TempData)) return 0;

} ptrA = ptrA->Next; ptrA = ptrA->Next; ptrB = ptrB->Next; } } RestList = ptrA;

if (RestList) RestList = ptrB; // Temp chỉđến đa thức cịn lại cĩ thể chưa hết while (RestList)

{ if (!Attach(A_PLUS_B, RestList ->Data)) return 0; RestList = RestList ->Next;

}

return 1;

}

Các thao tác cơ bản khác như: trừ, nhân hai đa thức, lấy thương và phần dư trong phép chia hai đa thức, … được xem như bài tập.

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 99 - 101)

Tải bản đầy đủ (PDF)

(148 trang)