单链表实现十进制大整数运算。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表实现十进制大整数运算。相关的知识,希望对你有一定的参考价值。

使用单链表实现不限大小的整数,每个结点存储一位数字。要求实现加、减运算,即能从键盘上输入两个大整数,比如:12345123451234512345和-11111111111111111111,则加的结果应为:01234012340123401234;减的结果应为:23456234562345623456。你的程序能运算并输出上述结果。要有注释哦

//
// File name : Main.cpp
//
// Code by : jiangyonghang
//
// Project name : SingleLinkedListAddMinus
//
// Create datetime: 2011-07-10 06:53:10
//

// Tested or implemented header
// ...

// C system headers
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#pragma warning(disable:4996)

// C++ system headers
// ...

// Headers from other projects
// ...

// Headers of current project
// ...

typedef struct DigitNode

int num;
struct DigitNode *higher_one;
DigitNode;

typedef struct ListNumber

DigitNode *list;
unsigned int len;
int positive;
ListNumber;

void InitNumber(ListNumber *number);
void ClearNumber(ListNumber *number);
int GetHighestDigit(ListNumber number);
void RemoveHighestDigit(ListNumber *number);
int NotLessThan(ListNumber first, ListNumber second);

ListNumber ReadNumber();
char ReadOperator();
int Input(ListNumber *first, char *operator_char, ListNumber *second);
void AppendAsSmallEnd(ListNumber *number, int new_digit);
void AppendAsBigEnd(ListNumber *number, int new_digit);

ListNumber Calculate(ListNumber first, char operator_char, ListNumber second);
ListNumber Add(ListNumber first, ListNumber second);
ListNumber Minus(ListNumber first, ListNumber second);
void PrintResult(ListNumber result);

int main()

ListNumber first_number;
ListNumber second_number;
ListNumber result;
char operator_char = '\0';

int ret_code = false;
InitNumber(&first_number);
InitNumber(&second_number);
InitNumber(&result);

while (1)

ret_code = Input(&first_number, &operator_char, &second_number);
if (ret_code)

result = Calculate(first_number, operator_char, second_number);
if (result.list)

printf("Calculation is done.\n");
PrintResult(result);

else

printf("Calculation is failed.\n");
break;


else

printf("Input is failed.\n");
break;


ClearNumber(&first_number);
ClearNumber(&second_number);
ClearNumber(&result);


return 0;


void InitNumber(ListNumber *number)

if (number)

number->len = 0;
number->list = NULL;
number->positive = true;

return;


void ClearNumber(ListNumber *number)

DigitNode *now = NULL;
if (!number)
return;

now = number->list;
while (now)

DigitNode *next = now->higher_one;
free(now);
now = NULL;
now = next;


number->list = NULL;
number->len = 0;
number->positive = true;
return;


int GetHighestDigit(ListNumber number)

const DigitNode *kNow = number.list;
if (0 == number.len)
return 0;

while (kNow->higher_one)
kNow = kNow->higher_one;

return kNow->num;


void RemoveHighestDigit(ListNumber *number)

DigitNode *now_top = number->list;
if (number->len <= 0)
return;

if (1 == number->len)

free(number->list);
number->len = 0;
number->positive = true;


while (now_top->higher_one->higher_one)

now_top = now_top->higher_one;

free(now_top->higher_one);
now_top->higher_one = NULL;
number->len--;

return;


int NotLessThan(ListNumber first, ListNumber second)

const DigitNode *kFirstHighestDigit = first.list;
const DigitNode *kSecondHighestDigit = second.list;

if (first.len > second.len)
return true;
if (first.len < second.len)
return false;
if (0 == first.len)
return true;
while (kFirstHighestDigit || kSecondHighestDigit)

if (GetHighestDigit(first) != GetHighestDigit(second) )
return GetHighestDigit(first) > GetHighestDigit(second);
kFirstHighestDigit = kFirstHighestDigit->higher_one;
kSecondHighestDigit = kSecondHighestDigit->higher_one;


return 0;


ListNumber ReadNumber()

ListNumber result;
DigitNode *new_digit = NULL;
char temp = '\0';

InitNumber(&result);

while (1)

if (scanf("%c", &temp) != 1)
break;

if (!isdigit(temp) )

if (result.list)

break;

else

continue;



AppendAsSmallEnd(&result, temp - '0');


return result;


char ReadOperator()

char temp;
while (1)

temp = getchar();
if (
(' ' == temp) ||
('\t' == temp) ||
('\r' == temp) ||
('\n' == temp)
)
continue;
break;

return temp;


int Input(ListNumber *first, char *operator_char, ListNumber *second)

ClearNumber(first);
*operator_char = 0;
ClearNumber(second);

*first = ReadNumber();
if (!first->list)
return false;

*operator_char = ReadOperator();
if (
(*operator_char != '+') &&
(*operator_char != '-')
)
return false;

*second = ReadNumber();
if (!second->list)
return false;

return true;


void AppendAsSmallEnd(ListNumber *number, int new_digit)

if (number)

DigitNode *new_node = (DigitNode*)malloc(sizeof(DigitNode) );
if (new_node)

new_node->num = new_digit;
new_node->higher_one = number->list;
number->list = new_node;
number->len++;



return;


void AppendAsBigEnd(ListNumber *number, int new_digit)

if (number)

if (0 == number->len)

AppendAsSmallEnd(number, new_digit);

else

DigitNode *add_position = number->list;
while (add_position->higher_one)
add_position = add_position->higher_one;

add_position->higher_one = (DigitNode*)malloc(sizeof(DigitNode) );
if (add_position->higher_one)

add_position->higher_one->num = new_digit;
add_position->higher_one->higher_one = NULL;
number->len++;




return;


ListNumber Calculate(ListNumber first, char operator_char, ListNumber second)

ListNumber result;

InitNumber(&result);

if ('+' == operator_char)
result = Add(first, second);
else if ('-' == operator_char)
result = Minus(first, second);

while (0 == GetHighestDigit(result) )

if (result.len > 1)

RemoveHighestDigit(&result);

else

break;



return result;


ListNumber Add(ListNumber first, ListNumber second)

ListNumber result;
int upper_left = 0;

const DigitNode *kFirstDigit = first.list;
const DigitNode *kSecondDigit = second.list;

InitNumber(&result);

while (kFirstDigit || kSecondDigit || upper_left)

if (kFirstDigit)

upper_left += kFirstDigit->num;
kFirstDigit = kFirstDigit->higher_one;

if (kSecondDigit)

upper_left += kSecondDigit->num;
kSecondDigit = kSecondDigit->higher_one;


AppendAsBigEnd(&result, upper_left % 10);

upper_left /= 10;


return result;


ListNumber Minus(ListNumber first, ListNumber second)

ListNumber result;
int minus_mark = 0;
const DigitNode *kFirstNode = NULL;
const DigitNode *kSecondNode = NULL;

InitNumber(&result);

if (!NotLessThan(first, second) )

ListNumber temp = first;
first = second;
second = temp;
result.positive = false;


kFirstNode = first.list;
kSecondNode = second.list;

while (kFirstNode)

int first_digit = 0;
int second_digit = 0;
if (kFirstNode)
first_digit = kFirstNode->num;
if (kSecondNode)
second_digit = kSecondNode->num;
if (first_digit - minus_mark >= second_digit)

AppendAsBigEnd(&result, first_digit - minus_mark - second_digit);
minus_mark = 0;

else

AppendAsBigEnd(&result, first_digit - minus_mark + 10 - second_digit);
minus_mark = 1;

kFirstNode = kFirstNode->higher_one;
if (kSecondNode)
kSecondNode = kSecondNode->higher_one;


return result;


void PrintResult(ListNumber result)

char *output = (char*)malloc((result.len + 1) * sizeof(char) );
int i = 0;
const DigitNode *kNow = NULL;
if (!result.positive)
putchar('-');

i = result.len;
output[i] = '\0';
kNow = result.list;
i--;
for (; i >= 0; i--)

if (!kNow)

break;


output[i] = '0' + kNow->num;
kNow = kNow->higher_one;


if (i < 0)
puts(output);
else
puts("Print failed!");
free(output);
return;


需要注释的话请追问……注释太多未必好懂追问

给注释吧

追答

注释太多超过百度限制了
已将答案发布到我空间“软件发布”分类

参考技术A #include <stdio.h>
#include <string.h>
int main()

char s[150];
int i,sum[600],b[600],lenth,j,c,t;
memset(sum,0,sizeof(sum)); //把sum[i]所有的位全部置为0..能看懂不?~~
scanf("%s",s); //输入字符串1
lenth=strlen(s);
i=500;
j=lenth-1;
memset(b,0,sizeof(b));
while(j>=0)
b[i--]=s[j--]-'0';//把字符转变成数字.最后一个字符在i=500位置.倒数第二个在i=499,依此类推.存在b[i]中
i=500;
c=0;
while(i!=100) //实现b[i]跟sum[i]个对个相加.进位啥啥啥的...从最后往前加.因为要对齐嘛.

t=sum[i]+b[i]+c;
sum[i]=t%10;
c=t/10;
i--;

scanf("%s",s);//第二个字符串.操作跟上面一样的.
lenth=strlen(s);
i=500;
j=lenth-1;
memset(b,0,sizeof(b));
while(j>=0)
b[i--]=s[j--]-'0';
i=500;
c=0;
while(i!=100)

t=sum[i]+b[i]+c;
sum[i]=t%10;
c=t/10;
i--;

i=1;
while(sum[i]==0) //前面多余的0不输出.
i++;
while(i<=500)
printf("%d",sum[i++]); //从不为0处往后一直输出.
printf("\n");
return 0;
追问

哥你这是单链表吗?而且只有加法没有减法。

追答

晕..写得兴起,不知所以了.呵呵.
单链表的话应该可以把对应的数组 a[i]改成*(a+i);这个倒是容易..减法的话,还要改代码......累了~~~~~写了好久,等有心人帮忙改下罗.呵呵.

集合操作 用单链表模拟有序集合,实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。

集合操作 用单链表模拟有序集合,实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。(1)用单链表存放集合中的元素,链表中的元素按大小存放;(2)实现集合加入一个元素删除一个元素的元素操作;(3)实现集合的交、并、差集合操作;

#include <iostream>
using namespace std;
typedef struct Element
Element* next;
int value;
Element,*Link,*Position;
class SortedUnion


private:
Link sorted_link;
public :
SortedUnion()

//创建单链表的头节点
sorted_link = (Link)malloc(sizeof(Element));
sorted_link->next = NULL;


void addValue(int value)

Position pos = insertPosition(value);
if(pos!=NULL)

Link tmp = (Link)malloc(sizeof(Element));
tmp->value = value;
tmp->next = pos->next;
pos->next = tmp;


void deleteValue(int value)

Position pos,pre=sorted_link;
for(pos=sorted_link->next; pos; pos=pos->next)

if(pos->value == value)

pre->next = pos->next;
free(pos);
break;

pre = pos;


Position insertPosition(int value)

Position pos;
for(pos = sorted_link; pos->next; pos=pos->next)

if(pos->next->value > value)
break;
if(pos->next->value == value)
return NULL;

return pos;

void print()

Link ptr;
for(ptr=sorted_link; ptr->next; ptr=ptr->next)
cout << ptr->next->value << " ";

friend SortedUnion Intersection(SortedUnion A, SortedUnion B)

SortedUnion C;
Position posA = A.sorted_link->next, posB = B.sorted_link->next;
while(posA && posB)

if(posA->value < posB->value)
posA = posA->next;
else if(posB->value < posA->value)
posB = posB->next;
else
C.addValue(posA->value);
posA = posA->next;
posB = posB->next;


return C;

;
int main()

SortedUnion u1,u2,u3;
u1.addValue(2);
u1.addValue(3);
u1.addValue(1);
u1.addValue(4);

u2.addValue(1);
u2.addValue(2);

u3 = Intersection(u1, u2);
u3.print();
参考技术A ,,, 参考技术B 数据结构与C语言综合训练实习 1 序号 项目名称 任务描述 指导教师 1 英文文本压缩 问题描述利用哈夫曼编码实现英文文本的压缩和解压缩。基本要求对于给定的英文文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 2 文本编辑系统 1分别统计出其中英文字母数和空格数及整篇文章总字数2统计某一字符串在文章中出现的次数并输出该次数3删除某一子串并将后面的字符前移。 3 简单算术表达式运算 给定简单的算术表达式包括加减乘除括号这几种运算操作符请计算表达式的值。1能够正确处理加减乘除这四种运算2能够正确处理括号运算。 4 小学生测验系统 面向小学12年级学生随机选择两个整数和加减法形成算式要求学生解答。功能要求1电脑随机出10道题每题10分程序结束时显示学生得分2确保算式没有超出12年级的水平只允许进行50以内的加减法不允许两数之和或之差超出050的范围负数更是不允许的3每道题学生有三次机会输入答案当学生输入错误答案时提醒学生重新输入如果三次机会结束则输出正确答案4对于每道题学生第一次输入正确答案得10分第二次输入正确答案得7分第三次输入正确答案得5分否则不得分5总成绩90以上显示“SMART”80-90显示“GOOD”70-80显示“OK”60-70显示“PASS”60以下“TRY AGAIN”。 5 数字游戏的设计 实现一个简单的猜数字游戏1一个四位数各位上的数字不重复从1到9。2按以下提示猜出这个四位数。 3每次猜测输入的数据给出类似的提示AB。4其中A前的代表你本次猜对了多少个数字。 5其中B前的代表你本次猜对的数字并且位置正确的个数。6给定猜测次数如果超过次数未猜中游戏失败。 6 学生成绩管理程序 设计一个简单的学生成绩管理程序要求根据菜单处理相应功能。1管理功能包括列表、求平均成绩、查找最高分等。2可按指定的性别或高于指定的个人平均分来筛选列表3可按平均成绩排序4平均成绩可按个人或科目进行5查找可按最高个人平均分进行或按指定科目的最高分进行6每个学生的信息包括序号、学号、性别、成绩1、成绩2、 数据结构与C语言综合训练实习 2 成绩3、成绩47基本功能为建立文件、增加学生记录、新建学生信息文件、删除/修改学生记录。 7 图书登记管理程序 该程序应该具有下列功能1 通过键盘输入某本图书的信息2 给定图书编号显示该本图书的信息3 给定作者姓名显示所有该作者编写的图书信息4 给定出版社显示该出版社的所有图书信息5 给定图书编号删除该本图书的信息6 提供一些统计各类信息的功能。 8 集合操作 用单链表模拟有序集合实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。1用单链表存放集合中的元素链表中的元素按大小存放2实现集合加入一个元素删除一个元素的元素操作3实现集合的交、并、差集合操作 9 树的重构和遍历系统 系统菜单信息输入、输出遍历。 10 个人关系网的设计与实现系统 系统菜单信息输入、输出建图、查询。 11 简单栈和队列演示系统的设计与实现 系统菜单信息输入、输出。 12 按每个数的各位值进行排序的系统 系统菜单信息输入、输出排序。 13 学生基本信息管理系统 系统菜单信息输入、输出查询。 14 身份证管理程序 该程序应该具有下列功能1 通过键盘可以输入身份证信息大量信息可存放在文件中。身份证包含的信息请参看自己的身份证2 给定身份证号码显示其身份证信息3 给定省份的编号显示该省的人数4 给定某区的编号显示该区的人数5 给定身份证号码可以修改该身份证信息6 给定身份证号码可以删除该身份证信息。 15 学生宿舍管理查询软件 设计一个简单的学生宿舍管理查询程序要求根据菜单处理相应功能。1建立数据文件 数据文件按关键字姓名、学号、房号进行排序 2查询菜单: 可以用二分查找实现以下操作A. 按姓名查询 B. 按学号查询 C. 按房号查询等3可以打印任一查询结果4每个学生的信息包括序号、学号、性别、房号、楼号等。 数据结构与C语言综合训练实习 3 16 万年历查询程序 实现万年历程序功能要求1提供菜单方式选择假定输入的年份在1940-2040年之间。2输入一个年份输出是在屏幕上显示该年的日历。3输入年月输出该月的日历。如4输入年份、月份、日期计算得到的是这一天据今天有多少天星期几5输入公历的年月日输出农历年月日。6输入农历节气输出当年农历的年月日及公历年月日。可以假定只涉及年份是1940年到2040年。 17 二叉树遍历算法的实现 四种算法都是前序、中序、后序三种算法要求递归和非递归实现层遍历用非递归实现。 18 二叉排序树的实现 要求分别以顺序表和二叉链表作为储结构实现二叉排序树。基本操作有插入、删除。 19 管道铺设施工的最佳方案选择 功能设计一个最佳方案使得这N个居民区之间铺设煤气管道所需代价最少。 20 数组编码和解码问题的求解设计与实现 设有一个数组A: array0..N-1存放的元素为0-N-11ltNlt10之间的整数且不存在重复数据。例如当N6时有A430512。此时数组A的编码定义如下:A0编码为0Ai编码为在A0A1�6�7Ai-1中比Ai的值小的个数i12�6�7N-1上面数组A的编码为B000312要求如下给出数组A 利用C 求解A的编码.给出数组A的编码后求出A中原数据。 21 简易文本编辑器的设计与实现 功能具有图形菜单界面查找、替换、块移动行块列块移动、删除具有基本功能。 22 利用哈希表实现电话号码查找系统 功能建立哈希表。选择不同的哈希函数选择不同的解决冲突的办法。 23 迷宫问题求解 要求对任意设定的迷宫求出一条从入口到出口的通路或得出没有通路的结论。 24 排序算法综合 功能数据随机生成五种常用排序算法实现从时间上分析效率并比较。 25 简易通讯录的制作 功能输入信息 显示信息 查找以姓名作为关键字 删除信息 存盘 装入。 数据结构与C语言综合训练实习 4 26 图的遍历的实现 功能实现图的深度优先 广度优先遍历算法并输出原图结构及遍历结果。 27 稀疏矩阵运算器的设计与实现 功能压缩存储矩阵的基本运算加、乘、求逆常规矩阵方式输出。 28 小学生作业题练习系统利用堆栈实现 功能建立试题库文件随机产生n个题目 题目涉及加减乘除带括弧的混合运算给出分数判定 随时可以退出 保留历史分数能回顾历史根据历史分数给出评价。 29 一元多项式的加法、减法、乘法的实现 要求判定是否稀疏分别采用顺序和链式存储结构实现结果Mx中无重复阶项和无零系数项要求输出结果的升幂和降幂两种排列情况 30 邻接表克鲁斯卡尔算法的实现 要求根据需要建立图的邻接表存储结构构造最小生成树模拟演示生成过程。 31 期刊论文管理程序 该程序应该具有下列功能1 通过键盘输入某期刊论文的信息也可以把大量期刊论文信息放在文件中2 给定期刊论文的论文名称显示该论文的作者信息作者单位发表期刊的名称3 给定作者姓名显示所有该作者发表的期刊论文情况4 给定期刊名称显示该期刊的所有论文信息 32 字符串操作 编写程序不使用标准库函数实现字符串的拷贝、拼接、字串查找、长度计算等函数。1在不使用相关的标准库函数的情况下完成本任务2实现两个字符串拼接的函数strcatstr1 str23实现字符串拷贝的函数strcpystr1str24实现字符串查找的函数strcstrstr1str25实现字符串长度计算的函数strlenstr16实现字符串查找字符的函数strccharstr1c7实现字符串替换的函数strcreplacestrstr1str2str38实现字符串替换字符的函数strcreplacecharstr1str2c 33 单源最短路径求解 给定一个带权有向图GVE其中每条边的权是一个非负实数。另外还给定V中的一个顶点成为源。现在计算从源到其他各顶点的最短路径。路径的长度是指路上各边权值之和。 34 歌手比赛系统 设计一个简单的歌手比赛绩管理程序对一次歌手比赛的成绩进行管理功能要求1.输入每个选手的数据包括编号、姓名、十个评委的成绩根据输入计算出总成绩和平均成绩去掉最高分去掉最低分。2.显示主菜单如下1输入选手数据 2评委打分 3成绩排序按 数据结构与C语言综合训练实习 5 平均分4数据查询 5追加学生数据 6写入数据文件7退出系统 35 找数字对 输入N2ltNlt100个数字在0与9之间然后统计出这组数种相邻两数字组成的链环数字对出现的次数。例如 输入N20 表示要输入数的数目 0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9 输出782 873指78、87数字对出现次数分别为2次、3次 36 二叉树遍历算法的实现 四种算法都是前序、中序、后序三种算法要求递归和非递归实现层遍历用非递归实现。 37 中文文本压缩 问题描述利用哈夫曼编码实现中文文本的压缩和解压缩。基本要求对于给定的中文文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 38 邻接矩阵普利姆算法的实现 要求根据需要建立图的邻接矩阵存储结构构造最小生成树模拟演示生成过程。 39 邻接矩阵克鲁斯卡尔算法的实现 要求根据需要建立图的邻接矩阵存储结构构造最小生成树模拟演示生成过程。 40 n元多项式乘法 1 界面友好函数功能要划分好 2 总体设计应画一流程图 3 程序要加必要的注释 4 要提供程序测试方案 5 程序一定要经得起测试宁可功能少一些也要能运行起来不能运行的程序是没有价值的。 41 学生成绩管理程序 设计一个简单的学生成绩管理程序要求根据菜单处理相应功能。 1管理功能包括列表、求平均成绩、查找最高分等。 2可按指定的性别或高于指定的个人平均分来筛选列表 3可按平均成绩排序 数据结构与C语言综合训练实习 6 4平均成绩可按个人或科目进行 5查找可按最高个人平均分进行或按指定科目的最高分进行 6每个学生的信息包括序号、学号、性别、成绩1、成绩2、成绩3、成绩4 7基本功能为建立文件、增加学生记录、新建学生信息文件、删除/修改学生记录。 42 数组操作 设计菜单处理程序对一维数组进行不同的操作。 1操作项目包括求数组最大值、最小值、求和、求平均值、排序、 二分查找、有序插入 2设计并利用字符菜单进行操作项目的选择程序一次运行可根据选择完成一项或多项操作通过菜单“退出”来结束程序的运行 3数组的输入、输出可支持命令行输入文件名、界面输入文件名从数据文件中输入和输出也支持界面录入。 43 打印日历表 打印指定年份的公历表和农历表。 1输入年份为19902050内任一年 2可以选择输出公历表或农历表 3农历表包括二十四节气。 44 学生证管理程序 该程序应该具有下列功能 1 通过键盘输入某位学生的学生证信息。学生证包含的信息请参看自己的学生证 2 给定学号显示某位学生的学生证信息 3 给定某个班级的班号显示该班所有学生的学生证信息 4 给定某位学生的学号修改该学生的学生证信息 5 给定某位学生的学号删除该学生的学生证信息 6 提供一些统计各类信息的功能。 45 图书登记管理程序 该程序应该具有下列功能 1 通过键盘输入某本图书的信息 2 给定图书编号显示该本图书的信息 3 给定作者姓名显示所有该作者编写的图书信息 4 给定出版社显示该出版社的所有图书信息 数据结构与C语言综合训练实习 7 5 给定图书编号删除该本图书的信息 6 提供一些统计各类信息的功能。 46 学生学分管理程序 假设每位学生必须完成基础课50学分、专业课50学分、选修课24学分、人文类课程8学分、实验性课程20学分才能够毕业。因此在管理学分时要考虑每个学分所属于的课程类别。 该程序应该具有下列功能 1 通过键盘输入某位学生的学分 2 给定学号显示某位学生的学分完成情况 3 给定某个班级的班号显示该班所有学生学分完成情况 4 给定某位学生的学号修改该学生的学分信息 5 按照某类课程的学分高低进行排序 6 提供一些统计各类信息的功能。 47 作业完成情况管理程序 假设某门课程一学期要留10次作业每次老师要进行批改给出分数后还要进行登记。学期期末要根据每次作业的成绩计算出最终的平时成绩满分100。 该程序应该具有下列功能 1 通过键盘输入某位学生某次作业的分数 2 给定学号显示某位学生作业完成情况 3 给定某个班级的班号显示该班所有学生的作业完成情况 4 给定某位学生的学号修改该学生的作业完成信息 5 给定某位学生的学号删除该学生的信息 6 提供一些统计各类信息的功能。 48 旅店POS机管理系统 旅店收款POS机管理系统的简单实现。 1前台管理包括空房分等级显示、入住登记、退房结算、洗衣房管理、娱乐项目管理 2后台管理包括客房预定分析、营业额统计、日报表、月报表、年报表 3设计数据结构文件来实现数据库管理包括数据录入、查询、删除、修改、更新。 49 学生通讯录管理系统 用链表方式来实现学生通讯录管理系统。 1通过定义一个包含学生通讯录主要包括学号、姓名、系别、专业、籍贯、家庭住址、 数据结构与C语言综合训练实习 8 联系电话等的结构体类型实现增加学生通讯录的内容、删除某个学生通讯录、输出全部学生通讯录内容、根据用户需求查找某个或某些学生的通讯录内容如按系别、专业、学号、姓名等内容进行查找。 2能够实现以上给定的各项功能具有方便简洁的操作界面具有一定的容错性。 50 超长正整数的乘法 设计一个算法来完成两个超长正整数的乘法。 算法提示 首先要设计一种数据结构来表示一个超长的正整数然后才能够设计算法。 51 个人电话号码查询系统 问题描述实现简单的个人电话号码查询系统根据用户输入的信息如姓名身份证号电话号码、邮件地址等进行快速查询。 基本要求 1 插入实现将用户的信息插入到系统中2 删除删除某个用户的信息3 修改修改某个用户的信息4 查询根据姓名、身份证号等查询用户信息包括简单条件查询组合条件查询、模糊查询等5 排序对于用户信息进行排序提高查询速度6 输出输出用户信息。 提示 1 在内存中设计数据结构存储电话号码的信息在外存中利用文件的形式来保存电话号码信息系统运行时将电话号码信息从文件调入内存来进行插入、查找等操作。 2 如果数据的插入删除频繁可以考虑采取二叉排序树组织电话号码信息也可采用较复杂的平衡二叉树可以提高查找和维护的时间性能。 3 选择不同的排序和查找算法尽可能提高查找和维护性能。 52 数字文本压缩 问题描述利用哈夫曼编码实现数字文本的压缩和解压缩。基本要求对于给定的数字文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 53 订票系统 基本要求 1录入可以录入航班情况数据可以存储在一个数据文件中数据结构、具体数据自定 2查询可以查询某个航线的情况如输入航班号查询起降时间起飞抵达城市航班 数据结构与C语言综合训练实习 9 票价票价折扣确定航班是否满仓 3可以输入起飞抵达城市查询飞机航班情况 4订票订票情况可以存在一个数据文件中结构自己设定可以订票如果该航班已经无票可以提供相关可选择航班退票 可退票退票后修改相关数据文件客户资料有姓名证件号订票数量及航班情况订单要有编号 5修改航班信息当航班信息改变可以修改航班数据文件。 54 学籍管理系统 问题描述建立学籍管理系统实现对于学生信息的添加和维护管理。 基本要求完成学籍登记表中的下面功能登记表中包括学号、姓名、性别、出生日期、政治面貌、联系方式、家庭住址等信息。 ⑴ 插入将某学生的基本信息插入到登记表中 ⑵ 删除将满足条件的基本信息删除 ⑶ 修改对基本信息的数据项进行修改 ⑷ 查询查找满足条件的学生 ⑸ 输出将登记表中的全部或满足条件基本信息输出。 提高要求 ⑴ 可以添加课程信息如开课学期、上课时间、上课地点等信息学生选课信息实现学生的选课功能 ⑵ 增加学生成绩信息可以对学生的成绩进行插入、删除、修改等操作 ⑶ 实现查找某学生的选课记录课程成绩等 ⑷ 利用二叉排序树、平衡树、排序算法等数据结构知识提高排序和查找速度。 提示 ⑴ 学生登记表一般建立后比较少更改因此可以采用顺序表方式建立 ⑵ 学生选课、成绩等信息一般更改比较频繁则可以采取链表建立 ⑶ 可以将学生的信息存储到文件中系统运行时将信息从文件调入到内存中运行。 55 数字游戏的设计 1一个四位数各位上的数字不重复从1到9。 2按以下提示猜出这个四位数。 数据结构与C语言综合训练实习 10 3每次猜测输入的数据给出类似的提示AB。 4其中A前的代表你本次猜对了多少个数字。 5其中B前的代表你本次猜对的数字并且位置正确的个数。 56 稀疏矩阵的压缩与还原 一个矩阵含有非零元素比较少而零元素相对较多这样的矩阵称为稀疏矩阵对稀疏矩阵的存储我们不用完全用二维数组来存储可以用一个三元组即任意一个稀疏矩阵可以用一个只有三列的二维数组来存放 要求把给定的稀疏矩阵用为三元组表示同时把三元组转换为稀疏矩阵形式。 57 文章编辑 输入一页文字程序可以统计出文字、数字、空格的个数。静态存储一页文章每行最多不超过80个字符。 要求 1分别统计出其中英文字母数和空格数及整篇文章总字数 2统计某一字符串在文章中出现的次数并输出该次数 3删除某一子串并将后面的字符前移。 存储结构使用线性表分别用几个子函数实现相应的功能 输入数据的形式和范围可以输入大写、小写的英文字母、任何数字及标点符号。 输出形式 1 分行输出用户输入的各行字符 2 分4行输出quot全部字母数quot、quot数字个数quot、quot空格个数quot、quot文章总字数quot 3 输出删除某一字符串后的文章 58 拓扑排序 建立有向无环图并输出拓扑的序列。 59 随机探测再散列哈希表 实现随机探测再散列哈希表的创建与查找 60 公园的导游图 给出一张某公园的导游图游客通过终端询问可知 从某一景点到另一景点的最短路径。游客从公园大门进入选一条最佳路线使游客可以不重复地游览各景点最后回到出口出口就在入口旁边。 分步实施 数据结构与C语言综合训练实习 11 1 初步完成总体设计建好框架确定人机对话的界面确定函数个数 2 完成最低要求建立一个文件包括5个景点情况能完成遍历功能 3 进一步要求进一步扩充景点数目画出景点图有兴趣的同学可以自己扩充系统功能。 61 商店存货管理系统 建立一商店存货管理系统要求每次出货时取进货时间最早且最接近保质期中止时间的货物。 分步实施 1初步完成总体设计建好框架确定人机对话的界面确定函数个数 2完成最低要求建立一个文件包括5个种类的货物情况能对商品信息进行扩充追加修改和删除以及简单的排序 3进一步要求扩充商品数量以及完成系统查询功能。有兴趣的同学可以自己扩充系统功能。 62 运动会分数统计 输入统计排序查询信息存储。 63 二叉树遍历算法的实现 四种算法都是.追问

haha

以上是关于单链表实现十进制大整数运算。的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 --- 02. 内存, 顺序表, 单链表

单链表实现多项式的表示及运算

集合操作 用单链表模拟有序集合,实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。

输入一组整数,建立带头结点的单链表,并实现线性表的求长度、插入和删除等操作?

实现单链表的各种基本运算

单链表实现两组整数相加(Java)