问题描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/904dee5ce00bd6a8c76e296ce1bb362a.png)
解题思路
- 每个节点中可以存放的最大整数为215-1,才能保证两数相加不会溢出,但若这样存放,即相当于按32768进制数存放,在书进制数与32768进制数之间的转换十分不方便,故可以在每个节点中仅存十进制数的4位,即不超过9999的非负整数
- 可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两个操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限
代码实现
typedef struct CNode
{
ElemType data;
struct CNode* last;
struct CNode* next;
}CNode,*CLinkList;
bool InitList(CLinkList &L,char *num)
{
int i = 0;
L = (CLinkList)malloc(sizeof(CNode));
L->next = nullptr;
L->last = nullptr;
CNode* p = L;
if (num[i] == '-')
{
L->data = 1;
i++;
}
else
{
L->data = 0;
}
while (num[i] != '\0')
{
int k = 0;
char tmp[nmax] = "";
while (num[i] != ',' && num[i] != '\0')
{
tmp[k++] = num[i++];
}
int data = atoi(tmp);
CNode* newNode = (CLinkList)malloc(sizeof(CNode));
newNode->data = data;
p->next = newNode;
newNode->last = p;
newNode->next = nullptr;
p = newNode;
if (num[i] == ',')
{
i++;
}
if (num[i] == '\0')
{
p->next = L;
L->last = p;
break;
}
}
return true;
}
void showList(const CLinkList& L)
{
CNode* q = L->next;
int count = 0;
for (; q != L; q = q->next)
count+=q->data;
if (!count)
{
cout << "0";
return;
}
CNode* p = L->next;
if(L->data==1)
cout << '-';
while (p->next != L)
{
if (p == L->next && p->data == 0) {}
if (p != L->next && p->data == 0)
{
cout << "0000" << ",";
}
else
cout << p->data << ",";
p = p->next;
}
if (p->data != 0)
cout << p->data;
else
cout << "0000";
}
void sublist(CLinkList& a, CLinkList& b)
{
CNode* pa = a->last, * pb = b->last;
int borrow = 0;
while (pb != b)
{
if (pa->data - pb->data - borrow >= 0)
{
pa->data = pa->data - pb->data - borrow;
}
else
{
pa->data = pa->data - pb->data - borrow + 10000;
borrow = 1;
}
pa = pa->last;
pb = pb->last;
}
if (pa == a && borrow == 1)
{
pa->last->data = 10000 - pa->last->data;
if (a->data == 0)
a->data = 1;
else
a->data = 0;
}
showList(a);
}
void addlist(CLinkList& a, CLinkList& b)
{
CNode* pa = a->last, *pb = b->last;
int carry = 0;
while (pb != b)
{
int data = (pa->data + pb->data+carry) % 10000;
carry = (pa->data + pb->data + carry) / 10000;
pa->data = data;
pa = pa->last;
pb = pb->last;
}
if (pa != a)
pa->data += carry;
else if(pa == a && carry)
{
CNode* newNode = (CLinkList)malloc(sizeof(CNode));
newNode->data = carry;
newNode->next = pa->next;
pa->next->last = newNode;
pa->next = newNode;
newNode->last = pa;
}
showList(a);
}
int length(const CLinkList &L)
{
CNode* p = L->next;
int len = 0;
while (p!= L)
{
p = p->next;
++len;
}
return len;
}
void solve(CLinkList& a, CLinkList& b)
{
if (a->data ^ b->data)
{
length(a) >= length(b) ? sublist(a, b) : sublist(b, a);
}
else
{
length(a) >= length(b) ? addlist(a, b) : addlist(b, a);
}
}
int main()
{
char num1[nmax] = "";
char num2[nmax] = "";
cin.getline(num1, 1000);
cin.getline(num2, 1000);
CLinkList numlist1;
CLinkList numlist2;
InitList(numlist1, num1);
InitList(numlist2, num2);
solve(numlist1, numlist2);
return 0;
}