利用双向循环链表实现任意长的整数的加法运算的演示程序,谢谢

tanxi4141 2002-07-14 02:40:11
基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整形变量,任何整形变量的范围是-32767————32767,输入和输出形式按照中国传统的对长整数的表示方法,每4为一组,组间用逗号隔开
测试数据:
(1) 0和0 应该输出0
(2)-2345,6789和-76543211 应该输出-1,0000,0000
(3)-9999,9999和1,0000,0000,0000 应该输出9999,0000,0001
(4)1,0001,0001和-1,0001,0001 应该输出0
实现提示
(1) 每个结点中可以存放的最大整数为32767,才能保重两数相加不会溢出,但是若这样存放,既相当于按32768进制数存放,在十进制数与32768进制数之间的转换十分不方便,故可以在每个结点中仅存十进制的4位,既不超过9999的非负整数,整个链表表示为万进制数
(2) 可以利用头结点数据域的符号域代表长整数的符号,相加过程中不要破坏两个操作数链表,不能给长整数位数规定上限

...全文
576 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyb_Ultra 2002-07-17
  • 打赏
  • 举报
回复
To LLnju(LLnju):
当然可以,但你要知道,这是链表那一张的作业。哈哈!

wyb_Ultra 2002-07-17
  • 打赏
  • 举报
回复
To LLnju(LLnju):
当然可以,但你要知道,这是链表那一张的作业。哈哈!

jojoship 2002-07-16
  • 打赏
  • 举报
回复
给你结果了,怎么给分我呢?
有机会联系联系吧:zzyfrank@hotmail.com
LLnju 2002-07-16
  • 打赏
  • 举报
回复
怎么想到用链表,不太慢了吗?用数组有什么不好。
zhoukun666 2002-07-16
  • 打赏
  • 举报
回复 1
// Borland C++ 3.1 和 Borland C++ Builder 6.0 编译通过

#include <stdio.h>

typedef struct IntNode
{
short Data;
IntNode *Prev;
IntNode *Next;
} IntNode; //链表节点

//-- 释放链表占用内存 --
void FreeLrgInt(IntNode *&LrgInt)
{
IntNode *p;
if(LrgInt)
{
LrgInt->Prev->Next=0; //切断链表
while(LrgInt)
{
p = LrgInt;
LrgInt = LrgInt->Next;
delete p; //释放内存
}
}
}

//-- 把 Buffer 字符串内容转成大整数链表 --
void SetLrgInt(IntNode *&LrgInt, char *Buffer)
{
IntNode *p, *t;
FreeLrgInt(LrgInt); //释放已有的链表
if(*Buffer)
{
t = new IntNode;
t->Data = (*Buffer++) - '0';
t->Prev = t;
p = t;
while(*Buffer)
{
LrgInt = new IntNode;
LrgInt->Data = (*Buffer++) - '0';
LrgInt->Next = p;
LrgInt->Prev = t;
p->Prev = LrgInt;
p = LrgInt;
}
t->Next = p;
LrgInt = p;
}
}

//-- 输出大整数链表 --
void PrintLrgInt(IntNode *LrgInt)
{
if(LrgInt)
{
IntNode *p = LrgInt->Prev;
do
{
printf("%d",p->Data);
p=p->Prev;
}
while(p!=LrgInt->Prev);
}
}

//-- LrgSum = Lrg1 + Lrg2 --
void AddLrgInt(IntNode *&LrgSum, IntNode *Lrg1, IntNode *Lrg2)
{
IntNode *p, *t, *l1=Lrg1, *l2=Lrg2;
short i, r = 0;
FreeLrgInt(LrgSum); //释放已有的链表
if(l1 && l2)
{
i = l1->Data + l2->Data + r;
LrgSum = new IntNode;
LrgSum->Data = i%10;
LrgSum->Next = LrgSum;
p = LrgSum;
r = i / 10;
l1 = l1->Next;
l2 = l2->Next;
while(l1!=Lrg1 || l2!=Lrg2 || r)
{
i = (l1!=Lrg1?l1->Data:0) + (l2!=Lrg2?l2->Data:0) + r;
t = new IntNode;
t->Data = i % 10;
t->Prev = p;
t->Next = LrgSum;
p->Next = t;
p = t;
r = i / 10;
if(l1 != Lrg1)l1 = l1->Next;
if(l2 != Lrg2)l2 = l2->Next;
}
LrgSum->Prev = p;
}
}

#pragma argsused
int main(int argc, char* argv[])
{
IntNode *LrgInt1=0, *LrgInt2=0, *LrgIntA=0;

SetLrgInt(LrgInt1,"7436456756788");
SetLrgInt(LrgInt2,"26435623451");
AddLrgInt(LrgIntA, LrgInt1, LrgInt2);

PrintLrgInt(LrgInt1); printf(" + ");
PrintLrgInt(LrgInt2); printf(" = ");
PrintLrgInt(LrgIntA); printf("\r\n");

FreeLrgInt(LrgInt1);
FreeLrgInt(LrgInt2);
FreeLrgInt(LrgIntA);

return 0;
}

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧