实验:线性表及其应用

一、实验内容

【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序 。

【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整形变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

【测试数据】

(1)0;0;应输出“0”。

(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。

(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。

(4)1,0001,0001;-1,0001,0001;应输出“0”。

(5)1,0001,0001;-1,0001,0000;应输出“1”。

(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”。

(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。

二、实验目的

1.熟悉掌握链表的基本操作。

2.培养运用线性表解决问题的能力。

三、实验文档:

1. 概要设计(文字性地说明解决问题的具体方法和步骤)

a) 创建双向链表结点的结构体

b) 声明三条链表:L1,L2,L

c) 每一个结点的数据域只存四位数

d) 链表的生长方向为顺序,相加时逆序,即由尾到头,头结点存储符号和位数信息

e) 每一次相加时,若符号相同,则直接相加,用n=data/1,0000检查是否进位,若进位(n>1),L1链的前一结点data+1,;

f) 若符号相异,则绝对值大的作为被减数,事后确定符号,借位时,若果前一结点不是 head,则data=1 0000+v1+v2,当其中一条链已经加完后,直接把剩下的接在L链上

g) 结果的符号与绝对值大的相同

h) 相加时,如果一些结点的data归零了,则要删除,这一步需在完成所有相加运算后进行

i) 用while语句控制输出

DulNode.h

#ifndef DULNODE_H
#define DULNODE_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct DulNode{ //结点类型,双向链表
int data;
struct DulNode *prior;
struct DulNode *next;
}DulNode;

void listCreate(DulNode *L,int n) /*创建链表*/
{
/*传入链表头结点,所需结点个数*/
/*创建空链表*/
int i;
DulNode *p,*q;
p=L;
for(i=0;i!=n;i++)
{
q=(DulNode*)malloc(sizeof(DulNode));
p->next=q;
q->prior=p;
p=q;
}
q->next = NULL; /*尾结点的next指向next*/
}
void destroyList(DulNode *L) /*销毁链表*/
{
/*传入头结点删除链表*/
DulNode *p,*q;
p=L;
q=L;
while(q!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
int input(DulNode *L,char *s) /*输入*/
{
/*传入链表头结点和数字字符串*/
/*先对字符串处理*/
char *p,*ad;
DulNode *q=NULL;
int i,t,n,length,wei,data[20]; /*总长和位数(不含符号),data[]记录数据*/
length=strlen(s);
n=length/5;
if(length%5!=0)
n += 1; /*4位数为一组,有n组*/
wei=length - n +1; /*不算逗号*/
listCreate(L,n); /*创建链表*/
/*头结点data记录符号和位数*/
L->data = wei; /*对正数的处理*/
p=s;
if(s[0]==‘-‘) /*对负数的处理*/
{
wei -= 1;
L->data = -1 * wei;
p=s+1;
}
/*开始将字符串变为数字*/
for(i=0;i!=length;i++) /*改逗号分隔为终止符分隔*/
{
if(s[i]==‘,‘)
s[i]=‘\0‘;
}
ad = p;
data[0]=atoi(ad);
for(i=1;i!=n;i++) /*n为组数*/
{
for(;*ad!=‘\0‘;ad++);
data[i]=atoi(++ad); /*记录每组数*/
}
q=L->next;
i=0;
while(q!=NULL) /*总算存进去了*/
{
q->data = data[i];
q=q->next;
i++;
}
return n; /*返回有效结点个数,即不包括头结点*/
}

void add(DulNode *L1,DulNode *L2,DulNode *L,DulNode *pad) /*相加并输出*/
{
/*要求L1的位数大于L2*/
/*传入已经创建好并录入数据的两个加数链表的头结点*/
/*和一个即将存储最终结果的链表的头结点*/
int carry=0,borrow=0; /*进位和借位*/
int m=0; /*记录组数*/
DulNode *Lp1=L1,*Lp2=L2,*q=NULL;
/*从后面开始*/
while(Lp1->next!=NULL)
{
Lp1=Lp1->next;
m++;
}
while(Lp2->next!=NULL)
Lp2=Lp2->next;
/*完善结果链表*/
listCreate(L,m+2);
L->data=1; /*只把符号记下来*/
if(L1->data < 0)
L->data = -1; /*-1代表负号*/
/*Lp1,Lp2都指向最后结点,开始相加*/
q = L->next;

if(L1->data * L2->data >= 0) /*同号直接相加*/
{
while(Lp1!=L1 && Lp2!=L2)
{
q->data = Lp1->data + Lp2->data + carry;
carry = q->data / 10000;
q->data = q->data % 10000; /*进一*/
q=q->next;
Lp1=Lp1->prior;
Lp2=Lp2->prior;
}
while(Lp1!=L1) /*已传入的L1位数更大规定*/
{
q->data = Lp1->data + carry;
carry = q->data / 10000;
q->data = q->data % 10000; /*进一*/
q=q->next;
Lp1=Lp1->prior;
}
if(carry != 0)
{
q->data = carry;
q=q->next;
}
}
else if(L1->data * L2->data < 0) /*异号大数减小数*/
{
while(Lp1!=L1 && Lp2!=L2)
{
q->data = 10000 + Lp1->data - Lp2->data - borrow;
if(q->data / 10000 == 0)
borrow = 1;
else borrow = 0;
q->data = q->data % 10000;
q=q->next;
Lp1=Lp1->prior;
Lp2=Lp2->prior;
}
while(Lp1 != L1)
{
q->data = Lp1->data - borrow;
if(borrow != 0)
{
q->data += 10000;
if(q->data / 10000 == 0)
borrow = 1;
else borrow = 0;
q->data = q->data % 10000;
}
q=q->next;
Lp1=Lp1->prior;
}

}
/*记录最终位置,方便从后往前输出*/
pad = q->prior;
while(pad->data == 0 && pad->prior != L)
pad=pad->prior;

printf("%d",L->data * pad->data);
while(pad->prior != L)
{
pad=pad->prior;
printf(",%04d",pad->data); //自动加0
/* if(pad->prior != L)
printf(",");*/
}
}
#endif

测试:  main.h

#include "Dulnode.h"

int main()
{
DulNode *L1,*L2,*L,*pad;
char s1[80],s2[80];

int m,n;
L1 = (DulNode*)malloc(sizeof(DulNode));
L2 = (DulNode*)malloc(sizeof(DulNode));
L = (DulNode*)malloc(sizeof(DulNode));
printf("绝对值大的先输入:\n");
gets(s1);
gets(s2);
m = input(L1,s1);
n = input(L2,s2);

/*返回有效结点个数,即不包括头结点*/
add(L1,L2,L,pad);
return 0;
}

原文地址:https://www.cnblogs.com/liulangbxc/p/11690969.html

时间: 2024-08-06 06:11:07

实验:线性表及其应用的相关文章

数据结构实验 —— 线性表

顺序表 #include<iostream> #include<stdio.h> #include<stdlib.h> //线性表动态 分配顺序存储结构 #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的线性增量 #define ERROR -1 //定义错误 ERROR #define OK 1 typedef int Status;//状态码 typedef int

实验二:线性表的实验【物联网1132-11】

<数据结构>实验二:     线性表实验 实验目的 [巩固线性表的数据结构,学会线性表的应用.] 1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作. 2.学习运用线性表的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 实验内容1: [顺序表]实现"建立一个N个学生成绩的顺序表,对表进行插入.删除.查找等操作,分别输出结果."代码如下: [单链表]实现"建立一个N个学生成绩的顺序表,对表进行插入.删除.查找等操作,分别输出结

实验7:Problem A: STL——灵活的线性表

Home Web Board ProblemSet Standing Status Statistics Problem A: STL——灵活的线性表 Problem A: STL——灵活的线性表 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2986  Solved: 1092[Submit][Status][Web Board] Description 数组和链表是我们熟知的两种线性结构,但是它们不够灵活(不能同时实现直接插入.删除和访问操作)

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

算法系列15天速成——第八天 线性表【下】

原文:算法系列15天速成--第八天 线性表[下] 一:线性表的简单回顾 上一篇跟大家聊过“线性表"顺序存储,通过实验,大家也知道,如果我每次向 顺序表的头部插入元素,都会引起痉挛,效率比较低下,第二点我们用顺序存储时,容 易受到长度的限制,反之就会造成空间资源的浪费. 二:链表 对于顺序表存在的若干问题,链表都给出了相应的解决方案. 1. 概念:其实链表的“每个节点”都包含一个”数据域“和”指针域“. ”数据域“中包含当前的数据. ”指针域“中包含下一个节点的指针. ”头指针”也就是head,指

数据结构之线性表再思考

数据结构学起来妙不可言,贼有意思. 很久没写博客了,今天来一篇长的.前面写的关于线性表的代码和思路,经过我多次反复思考,又有了新的收获,与大家一起分享. 1.线性表的定义 首先要明白什么是线性表,一种常用且最简单的数据结构. 数据结构通俗来说就是:装水的杯子,有的是圆的.有的是方的. 官方定义:线性表是n个数据元素的有限序列. 把这个样的一个数据模型映射到计算机,等同找一块存储空间给它,而线性表一般是申请动态内存,因此就是在堆上给它分配一块内存. 看下图 通过图我们可以了解到,线性表数据结构如何

DS01——线性表

0.PTA得分截图 1.本周学习内容总结 1.1总结线性表内容 1.顺序表 顺序表结构体定义.存放数据以及表的长度 顺序表插入.遍历顺序表,找到需要插入的位置,并将该位置及之后的元素均向后移动一个位置 顺序表删除.遍历顺序表,找到需要删除的元素,将该元素之后的元素均向前挪动一个位置 顺序表重复元素删除.遍历两次顺序表,找到重复元素,然后操作删除 顺序表区间删除.遍历顺序表,找到区间内的元素,重新放入顺序表中,并定义自增变量,最后赋给顺序表长度 2.链表 链表结构体定义.存放数据以及创建后继节点

线性表---顺序表

线性结构的特点是:在非空的有限集合中,只有唯一的第一个元素和唯一的最后一个元素.第一个元素没有直接前驱元素,最后一个没有直接的后继元素.其它元素都有唯一的前驱元素和唯一的后继元素. 线性表是一种最简单的线性结构.线性表可以用顺序存储结构和链式存储结构存储,可以在线性表的任意位置进行插入和输出操作. 要想将线性表在计算机上实现,必须把其逻辑结构转化为计算机可识别的存储结构.线性表的存储结构主要有两种:顺序存储结构和链式存储结构. 线性表的顺序表示与实现 线性表的顺序存储结构 线性表的顺序存储结构指