线性链表的实现及操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

while(i--)

{

s->data=q->data-p->data;

if(s->data<0)

相关文档
最新文档