线性链表的实现及操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》
实验报告
学生姓名
学生班级
学生学号
指导老师
一.实验内容
1、设计一个100位以内的长整数加减运算的程序。要求如下:
输入输出要求:每四位一组,组间用逗号分隔;
加和减分别用不同的程序实现
程序应考虑输入数据的符号
2、用循环链表实现约瑟夫环问题
二、需求分析
1、使用链表进行超长数据的储存,减法时需要判断减数与被减数的长短关系,再进行对比与运算。在链表前一个节点进行加减来代替进位操作(每个节点数据满十即在前一个节点加一)。使用if(ch〉='0'&&ch<=’9')语句确保链表中只存放数字。
2、建立链表,输入数据,循环输出同时删除节点。
三、概要设计
1、创建链表储存数据,每个节点存一位,过滤非数字字符如‘ , ’.调整最高位数字的正负来代表整串数字的正负.进位操作是在前一个节点进行加减。
2、创建链表储存数据,设计循环输出并删除节点。
四、详细设计
1.得到两个链表
Number *GetNumber()
{
Number *p,*q,*List;
char ch;
p=(Number *)malloc(LEN);
List=p;
List->prior=NULL;
List->data=0; //加法时,放最高位进的1,否者 999+1=000
ch=getchar();
while(ch!=’\n’)
{
if(ch〉=’0'&&ch<='9’) //过滤非数字字符
{
q=(Number *)malloc(LEN);
q—>data=ch—’0’;
p-〉next=q;
q-〉prior=p;
p=q;
}
ch=getchar();
}
p—>next=NULL;
List—>prior=NULL;
return List;
}
2。加法分两种情况长度相同与不同
Number *JiaFa(Number *num_1,Number *num_2) //返回的数据为逆序
{
Number *p,*q,*r,*s,*num=NULL;
int i=0,j=0;
r=num;
p=num_1;
while(p->next!=NULL)
{
i++;
p=p—>next;
}//i表示number1数字的长度p指向number节点
q=num_2;
while(q—>next!=NULL)
{
j++;
q=q—>next;
} //j表示number2数字的长度q指向number节点
s=(Number *)malloc(LEN);
s—>prior=NULL;
s-〉next=NULL;
num=s;
while(i-—&&j-—)
{
s-〉data=p->data+q->data;
if(s->data>9)
{
s-〉data—=10;//处理两数相加大于9的情况,后面还有
if(i>j) //在长的数据上调整
p—〉prior—〉data++;
else
q—>prior-〉data++;
}
r=(Number *)malloc(LEN);
s—〉next=r;
r->prior=s;
s=r;
p=p—〉prior;
q=q->prior;
}
r=s=s->prior; //去掉最后一个没数据的节点free(s—>next);
s—〉next=NULL;
if(i>j)
{
while(i——)
{
if(p—〉data〉9)
{
p->data—=10;
p—>prior-〉data++;
}
s-〉data=p—>data;
p=p->prior;
r—>next=s;
s—>prior=r;
r=s;
}
if(p—>data>0)
{
s=(Number *)malloc(LEN);
s->data=p-〉data;
r-〉next=s;
s-〉prior=r;
r=s;
}
}
else
{
while(j-—)
{
if(q—〉data>9)
{
q->data-=10;
q—〉prior—〉data++;
}
s=(Number *)malloc(LEN);
s-〉data=q—>data;
q=q->prior;
r-〉next=s;
s—>prior=r;
r=s;
}
if(q-〉data>0)
{
s—〉data=q-〉data;
r—〉next=s;
s->prior=r;
r=s;
}
}
s—>next=NULL;//将最后一个next置空return num;
}
3。减法分3中情况:被减数长度大于、小于、等于减数长度
Number *JianFa(Number *num_1,Number *num_2) //返回的数据也为逆序{
Number *p,*q,*r,*s,*num=NULL;
int i=0,j=0;
r=num;
p=num_1;
while(p—>next!=NULL)//i表示number1数字的长度 p指向number节点
{
i++;
p=p-〉next;
}
q=num_2;
while(q—>next!=NULL)//j表示number2数字的长度 q指向number节点
{
j++;
q=q—〉next;
}
s=(Number *)malloc(LEN);
s->prior=NULL;
s—>next=NULL;
num=s;
if(i〈j) //对于被减数长度小于减数的,用减数减去被减数,最后反号
{
while(i—-)
{
s-〉data=q—>data-p->data;
if(s->data〈0)