1、抽象数据类型线性表的定义如下:ADT List 数据对象:D ai | ai ElemSet, i=1,2,.,n, n0 称 n 为线性表的表长; 称 n=0 时的线性表为空表。数据关系:R1 |ai-1 ,aiD, i=2,.,n 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。基本操作: ADT ListLinkList LNode *head; / 头指针(带头结点) LNode *tail , *cur; / 尾指针, 当前指针 /int length; / 链表长度 bool Init(); / 初始化 初始条件:无 操作
2、结果:初始化 void Clear(); 已存在 / 清除单链表 void Create(int n); 初 始条件:无 / 建立含n个结点的单链表 int Locate(int e); / 查找/ 清除线性表 void InsertBefore(int i, int e);/ 插入元素初始条件: bool Delete(int i,int &e); / 删除元素 void Traverse(); / 遍历,并输出内容 bool Empty();/ 判断空表 bool GetElem(int i,int & /获取元素void createlistbyorder(string s);/字符串创
3、建链表; LinkList2、主程序的处理流程 int main() 线性表LA,LB,LC初始化; 读入2个字符串; 将这2个字符串创建成链表; 分别用2个指针指向线性表表头; 进行运算; 遍历被插入的链表LC(即输出运算结果); return 0;三、详细设计1、线性表的实现struct LinkList / 初始化 / 清除线性表 / 建立含n个结点的单链表 / 遍历,并输出内容 / 判断空表 bool GetElem(int i,int & void createlistbyorder(string s); /字符串创建链表bool LinkList:Init( ) head=new
4、LNode; head-next=NULL; return true;void LinkList:InsertBefore(int i, int e) LNode *p=head; while (p-next!=NULL & i1) p=p-next; i-; if (p=NULL | i data = e;next = p- p-next = s;Delete (int i, int &e) int j=0; j +j; / 寻找第 i 个结点,并令 p 指向其前趋 if (!(p-next) | j i-1) return false; / 删除位置不合理 LNode *q = p-nex
5、t = q- / 删除并释放结点 e = q-data; delete q;Clear() LNode *p; while (head-=NULL) p=head- head-next=p- int LinkList:Locate(int e) LNode *p=head- while(p!=NULL&p-data!=e) j+; return j;Create(int n) head = new LNode;next =NULL; / 先建立一个带头结点的单链表 for (int i = n; i 0; - LNode *p = new LNode; cin / 输入元素值 p-next =
6、 head-next = p; / 插入Traverse()=NULL) coutdatanext=NULL) return true; else return false;GetElem(int i,int &e)/获取元素 if(icreatelistbyorder(string s) for(int i=0;idata=si-0;next=q;3、主程序int main() LinkList LA,LB,LC; LA.Init( ); LB.Init( ); LC.Init( ); string s1,s2; cins1s2; LA.createlistbyorder(s1); LB.c
7、reatelistbyorder(s2); LNode *it1=LA.head- LNode *it2=LB.head- int carry=0; while(it1!=NULL | it2! int c=carry; if(it1! c=c+it1- it1=it1- if(it2! c=c+it2- it2=it2- carry=c/10; c=c%10; LC.InsertBefore(1,c); if(carry0) LC.InsertBefore(1,carry); LC.Traverse(); return 0;测试结果:总代码:#includestringusing names
8、pace std;struct LNode int data; / 数据域 LNode *next; / 指针域 ;实验心得:拿到这个实验,我首先看了老师上课的课件,弄懂能够使这个实验实现的思想:即把输入数据当做2个字符串处理,而后我又发现把字符串转化成线性表处理会更加简单。即把输入的2个字符串转化为线性表LA,LB;然后将他们各个位置对应相加插入线性表LC。实现这个操作需要用到bool Init();这几个函数,因此我又翻看了以前的笔记,将这几个函数在int main()外写好。当我把所有需要的函数写好,在编译没有错误的时候,我进行了数据测试,结果发现只能输入,而不能输出结果,经过数次检查后我仍然找不到错误,然后我又试着用老师教过的调试方法,结果发现输入正确,然而初始化这部并未实现,于是就去上面的函数查找错误,结果发现我在InsertBefore(int i,int e)中创建了一个新链表。而后我改了这个错误,再次运行发现结果正确了,由此,我懂得了做实验应该细心,仔细发现错误,切记不能照搬照抄老师的代码。有时即使编译没有错误,运行结果出来时还是会有错误。所以以后的实验我不仅要细心,更要谨慎。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1