Tôi gần như hoàn thành nhiệm vụ này và nó đang giết tôi. Đây là bài THIRD của tôi về ba phần khác nhau của điều này, và tôi thành thật xấu hổ rằng tôi đang đấu tranh nhiều với nhiệm vụ này. Bản thân bài tập là tạo một chương trình thực hiện phép cộng và trừ các số nguyên lớn bằng cách sử dụng các danh sách liên kết (và từ từ tôi bắt đầu ghét các danh sách liên kết, bên ngoài Lisp). Mọi thứ dường như đang hoạt động, tiết kiệm cho việc cộng và trừ thực tế. Tôi không chắc liệu đó có phải là hàm số học hay không, bởi vì chúng hoạt động trước đây (nhưng không bao giờ 100%), nhưng nó không đau khi kiểm tra với cộng đồng S/O (thông thường tôi sẽ không yêu cầu điều này nhiều lắm giúp đỡ trong một bài tập bởi vì tôi thích tự mình tìm ra những thứ khác, nhưng đây là một tuần đầy khủng khiếp và bận rộn, và thời hạn nhanh chóng đến gần).Thêm và trừ Bigints bằng cách sử dụng các danh sách được liên kết
Các hàm số học tôi đã viết như sau, bất kỳ ai cũng có thể giúp tôi tìm ra điều gì sai?
/*
* Function add
*
* @Paramater STRUCT* Integer
* @Parameter STRUCT* Integer
*
* Takes two linked lists representing
* big integers stored in reversed order,
* and returns a linked list containing
* the sum of the two integers.
*
* @Return STRUCT* Integer
*
* TODO Comment me
*/
struct integer* add(struct integer *p, struct integer *q)
{
int carry = 0;
struct integer *sHead, *sCurr;
struct integer *pHead, *qHead;
pHead = p;
qHead = q;
sHead = NULL;
while(p)
{
sCurr = (struct integer*) malloc (sizeof(struct integer));
sCurr->digit = p->digit + q->digit + carry;
sCurr->next = sHead;
sHead = sCurr;
carry = 0;
/*
* If the current digits sum to greater than 9,
* create a carry value and replace the current
* value with value mod 10.
*/
if(sCurr->digit > 9)
{
carry = 1;
sCurr->digit = sCurr->digit % 10;
}
/*
* If the most significant digits of the numbers
* sum to 10 or greater, create an extra node
* at the end of the sum list and assign it the
* value of 1.
*/
if(carry == 1 && sCurr->next == NULL)
{
struct integer *sCarry = (struct integer*) malloc (sizeof(struct integer));
sCarry->digit = 1;
sCarry->next = NULL;
reverse(&sCurr);
sCurr->next = sCarry;
reverse(&sCurr);
}
p = p->next;
if(q->next) q = q->next;
else q->digit = 0;
}
return sHead;
}
/*
* Function subtract
*
* @Parameter STRUCT* Integer
* @Parameter STRUCT* Integer
*
* Takes two linked lists representing struct integers.
* Traverses through the lists, subtracting each
* digits from the subsequent nodes to form a new
* struct integer, and then returns the newly formed
* linked list.
*
* @Return STRUCT* Integer
*
* TODO Comment me
*/
struct integer* subtract(struct integer *p, struct integer *q)
{
int borrow = 0;
struct integer *dHead, *dCurr;
struct integer *pHead, *qHead;
pHead = p;
qHead = q;
dHead = NULL;
while(p)
{
dCurr = (struct integer*) malloc (sizeof(struct integer));
if(q)
{
dCurr->digit = p->digit - q->digit - borrow;
}
else
{
dCurr->digit = p->digit - borrow;
}
dCurr->next = dHead;
if(dCurr->digit < 0)
{
dCurr->digit += 10;
borrow = 1;
}
dHead = dCurr;
p = p->next;
if(q->next) q = q->next;
}
return dHead;
}
Sản lượng mẫu sẽ trông như thế này:
8888888888 + 2222222222 = 11111111110
10000000000 – 9999999999 = 1
10000000000 – 9999999999 = 1
nhưng thay vào đó, nó trông như thế này:
8888888888 + 2222222222 = 1111111110
10000000000 - 9999999999 = 10000000001
10000000000 - 9999999999 = 10000000001
EDIT Toàn bộ chương trình, ở dạng hiện tại lúc 3:30 chiều EST, có sẵn here để tham khảo hoặc trong trường hợp các chức năng này không phải là vấn đề.
Cách sử dụng trình gỡ lỗi và hiển thị những gì đã xảy ra trên mỗi bước. Dường như nó không phải là về danh sách liên kết, nhưng về cách bạn trừ đi. BTW, tốt hơn nên đặt tên là "mượn" hơn "mang" trừ đi. – pmod
Quan tâm đặc biệt là đầu ra của dCurr-> chữ số, p-> chữ số, q-> chữ số. Và bạn đã không hiển thị như thế nào là loại số nguyên được xác định. – pmod
@Pmod Xin lỗi, tôi sẽ đưa lên một phần trước của toàn bộ chương trình làm tài liệu tham khảo. – Andy