求解单链表的逆序输出输出为什么是空的

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
单链表_实验报告
下载积分:30
内容提示:单链表_实验报告
文档格式:PDF|
浏览次数:540|
上传日期: 10:20:54|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
单链表_实验报告
关注微信公众号问:C++单链表删除函数定义在删除链表时,链表的数据域放的是类的对象,类里的私有成员均动态申请了空间...答:因为链表的数据域放的是类的对象,那么对于new来的链表节点,一旦delete掉,里面的数据成员便会释放回内存池,相应的类对象也会调用自己的构造函数销毁自己。...
问:求编程:实现两个长整数相加:要求用链表(单链表或双向链表)...把注解,设计思路也写一些吧答:楼主你好设计思路:先在函数Creat_List中用头入法创建一个表示大数的链表因为用头入法方便大数相加(例如:用头入法入的时候遍历的序列为:、...
问:动态单链表建立的算法分析?答:单链表的建立是一个动态生成链表的过程,从空表的初始化状态,依次建立各结点,一般来讲,为了作方便我们通常在单链表的第一个结点之前附设一个结点,称之为头...
问:单链表实现十进制大整数运算。答:所以,你得先实现带表头结点的单链表,然后把每一个大数用一个链表来表示,再运算。貌似写的太长了。另外就是没有完全测试,说不定某种输入情况下不对了,如果不对请告诉我~#include&stdio.h&#...
问:求教一个单链表小程序的编写,谢谢用JA编写,完成单链表的生成,任意位置的入、删除,以及确定某一元素在单链...答:由于ja没有指针,所以通常用数组来实现。那么数组下表就成了位置。如果非要链式,那么久只能直接用类对象来替指针对象了。如果节点类形式 public Node{...
问:两个单链表合并如何做?有两个单链表具有相同节点个数的单链表A和BA={a,a.an}B={b,b.bn}编写一个...答:include&stdio.h&#include&string.h&#include&malloc.h&#define LEN sizeof(struct student)struct student{char name[];struct student*...
问:单链表和循环单链表的置空问题为什么在以HL为表头指针的带头附加节点的单链表和循环单链表中,链表为空的条件...答:HL-&next=NULL用于单链表,带头附加节点一定有头,但头的下一个为空,链表就为空了 HL-&next=HL用于循环链表,意思跟上面一样。
问:单链表建立的问题 include&stdio.h&#include&stdlib.h&#define NULL((LNode*))typedef struct...答:我把码帮你改过了,你自己对照下。已经在vc运行过。include&stdio.h&#include&stdlib.h&#define NULL((LNode*))typedef struct LNode{struct...
问:单链表的作本实验要求实现以下功能:.从键盘输入顺序任意的个整数,生成第一个有序单链表...答:码在附带的中.附件:dfdfdf.cpp
问:如何使用单链表实现无限大整数的加减运算?跪求各位大侠说的简单点,俺是菜鸟啊答:这个问题其实不是很难,先建立两个链表,用于存放加数被加数,输入时每输入一个数字就在链表中增加一个节点,直至输入完成。这样得到两个存放大数的链表,为便于...
问:c语言中关于单链表的问题我正在设计一个下程序,但是遇到了一点麻烦:我想要用单链表实现数据存储,因为...答:定义全的链表长度,在有些函数中长度动态变化没有。此外可以设计链表的头结点为非数据节点,里面存在链表长度。对于排序,可以写个void sort(List L,bool...
问:单链表作实验单链表作基本要求()建立头指针为h的带表头结点的单链表;()...答:是用C还是C++?你没说的话,只能给你个参考程序!include&iostream&typedef char ElemTtypedef int Sdefine OK#define ERROR...
问:如何检测单链表中的是否存在环最好能有程序俺是初答:设一快一慢两个指针(Node*fast,*low)同时从链表起点开始遍历,其中快指针每次移动长度为,慢指针则为。则若无环,开始遍历之后fast不可能与low重合,且fast...
问:关于用单链表,递归实现大数阶乘 Exercice.hpp*/ifndef EXERCICE_H#define EXERCICE_H class Nombre{ public:...答:需要更详尽的功能说明。,输入是什么,输出是什么?其他的问题还有:.void返回值的函数明显是只能打印结果,是只打印计算的阶乘结果吗?.chiffre是私有...
09-1309-1309-1309-13
10-1111-2903-0303-26
◇本站云标签中国领先的IT技术网站
51CTO旗下网站
例题解析(2)
《新编数据结构习题与解析》第3章栈和递归,本书介绍栈和递归的定义、栈的特点及与线性表的异同;掌握顺序栈和链栈的组织方法,栈满、栈空的判断及其描述。本节为例题解析。
作者:李春葆来源:清华大学出版社| 18:37
3.2.2& 例题解析(2)
3. 算法设计题
【例3-2-14】设计一个算法,利用栈的基本运算返回指定栈中的栈底元素,要求仍保持栈中元素不变。
解:假定采用顺序栈结构。先退栈st中的所有元素,利用一个临时栈tmpst存放从st栈中退栈的元素,最后的一个元素即为所求,然后将临时栈tmpst中的元素逐一出栈并进栈到st中,这样恢复st栈中原来的元素。对应算法如下。
int&GetBottom(SqStack&st,ElemType&&x) &{&&&ElemType&e; &&&&&SqStack&&&&&&&&&&&&&&&&&&&&&&&&&&&//定义临时栈 &&&&&InitStack(tmpst);&&&&&&&&&&&&&&&&&&&&&&&//初始化临时栈 &&&&&if&(StackEmpty(st))&&&&&&&&&&&&&&&&&//空栈返回0 &&&&&&&&&return&0; &&&&&while&(!StackEmpty(st))&&&&&&&&&&&&&//临时栈tmpst中包含st栈中的逆转元素 &&&&&{&&&Pop(st,x); &&&&&&&&&Push(tmpst,x); &&&&&} &&&&&while&(!StackEmpty(tmpst))&&&&&&&&&&//恢复st栈中原来的内容 &&&&&{&&&Pop(tmpst,e); &&&&&&&&&Push(st,e); &&&&&} &&&&&return&1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//返回1表示成功 &} &
本题要求只能使用栈的基本运算来完成,不能直接用st.data[0]来得到栈底元素。
【例3-2-15】③设计一个算法,采用一个顺序栈逆向输出单链表L中的所有元素。
解:本题并不需要改变单链表L的结构。设置一个顺序栈st,先遍历单链表并将所有元素进栈,然后栈不空循环并输出栈中所有元素。对应算法如下:
void&ReverseDisp(LinkList&*L) &{&&&ElemType&x; &&&&&struct&node &&&&&{&&&ElemType&data[MaxSize]; &&&&&&&&&int& &&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//定义一个顺序栈 &&&&&st.top=-1; &&&&&LinkList&*p=L- &&&&&while&(p!=NULL)&&&&&&&&&&&&&&&&&&&&&//遍历单链表,将所有元素进栈 &&&&&{&&&st.top++; &&&&&&&&&st.data[st.top]=p- &&&&&&&&&pp=p- &&&&&} &&&&&while&(st.top!=-1)&&&&&&&&&&&&&&&&&&//栈不空循环,输出栈中所有元素 &&&&&{&&&x=st.data[st.top]; &&&&&&&&&st.top--; &&&&&&&&&printf(&%d&&,x); &&&&&} &&&&&printf(&\n&); &} &
【例3-2-16】③设计一个算法,采用一个顺序栈判断单链表L中所有元素的正、反序是否相同。
解:设置一个顺序栈st,先遍历单链表并将所有元素进栈,然后再次遍历单链表,并同步退栈一个元素,若两者值相等,则继续循环,否则返回0,若单链表遍历完毕后仍没有返回,则返回1。对应算法如下:
int&Same(LinkList&*L) &{&&&ElemType&x; &&&&&struct&node &&&&&{&&&ElemType&data[MaxSize]; &&&&&&&&&int& &&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//定义一个顺序栈 &&&&&st.top=-1; &&&&&LinkList&*p=L- &&&&&while&(p!=NULL)&&&&&&&&&&&&&&&&&&&&&//遍历单链表,将所有元素进栈 &&&&&{&&&st.top++; &&&&&&&&&st.data[st.top]=p- &&&&&&&&&pp=p- &&&&&} &&&&&p=L- &&&&&while&(p!=NULL)&&&&&&&&&&&&&&&&&//栈不空循环 &&&&&{&&&x=st.data[st.top];&&&&&&&&&&//出栈元素x &&&&&&&&&st.top--; &&&&&&&&&if&(p-data!=x)&&&&&&&&&&&&&//若当前单链表元素不等于x,返回0 &&&&&&&&&&&&&return&0; &&&&&&&&&pp=p- &&&&&} &&&&&return&1; &} &
【例3-2-17】③假设表达式中允许包含3种括号:圆括号、方括号和大括号。设计一个算法采用顺序栈判断表达式中的括号是否正确配对。
解:设置一个栈st,扫描表达式exp,遇到'('、'['或'{',则将其入栈,遇到')',若栈顶是'(',则继续处理,否则以不配对返回0;遇到']',若栈顶是'[',则继续处理,否则以不配对返回0;遇到'}',若栈顶是'{',则继续处理,否则以不配对返回0。在exp扫描完毕后,若栈不空,则以不配对返回0;否则以括号配对返回1。对应算法如下:
int&Match(char&exp[],int&n) &{&&&char&st[MaxSize];&&&&&&&&&&&//括号栈 &&&&&int&top=-1;&&&&&&&&&&&&&&&&&//栈顶指针 &&&&&int&i=0,tag=1; &&&&&while&(i&&&&tag==1) &&&&&{&&&if&(exp[i]=='('&||&exp[i]=='['&||&exp[i]=='{'} &&&&&&&&&//遇到'('、'['或'{',则将其入栈 &&&&&&&&&{&&&top++; &&&&&&&&&&&&&st[top]=exp[i]; &&&&&&&&&} &&&&&&&&&if&(exp[i]==')')&&&&//遇到')',若栈顶是'(',则继续处理,否则以不配对返回 &&&&&&&&&&&&&if&(st[top]=='(')&&top--; &&&&&&&&&&&&&else&tag=0; &&&&&&&&&if&(exp[i]==']')&&&&//遇到']',若栈顶是'[',则继续处理,否则以不配对返回 &&&&&&&&&&&&&if&(st[top]=='[')&&top--; &&&&&&&&&&&&&else&tag=0; &&&&&&&&&if&(exp[i]=='}')&&&&//遇到'}',若栈顶是'{',则继续处理,否则以不配对返回 &&&&&&&&&&&&&if&(st[top]=='{')&&top--; &&&&&&&&&&&&&else&tag=0; &&&&&&&&&i++; &&&&&} &&&&&if&(top=0) &&&&&&&&&tag=0;&&&&&&&&&&&&&&&&&&//若栈不空,则不配对 &&&&&return(tag); &} &
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:151304人学习过
讲师:132001人学习过
讲师:82898人学习过
精选博文论坛热帖下载排行
本书全面介绍了Linux编程相关的知识,内容涵盖Linux基本知识、如何建立Linux开发环境、Linux开发工具、Linux文件系统、文件I/O操作、设备文...
订阅51CTO邮刊#include&stdio.h&
struct node{
struct node*
本题的解法思路较简单:
因为要求集合A和集合B的差集(A-B),结果保存在集合A中.
所以我们取出集合A中每一个元素,然后在集合B中寻找(代码22行所实现) 找到即删除此节点 否则保留
此时while循环跳出只有两种情况,pb为NULL或者 pa-&elem==pb-&elem
当pb不为null时,即找出集合A和集合B的公有元素,此时要删除这个元素
pre(实现删除节点之后的链接)
当pre为NULL时,说明是首次找到A和B的公有元素,此时 *LA指向pa-&next 所以*LA仍然是头结点
当pre不为NULL时, pre指向pa-&next,顺利实现删除节点的链接
void difference(node** LA,node* LB){
node*pa,*pb,*pre,*q;
pa=*LA;/*LA是指向指针的指针,pa指向集合的元素*/
while(pa){
pb=LB;/*pb指向集合B的元素*/
while(pb && pa-&elem!=pb-&elem) /*在链表LB中寻找与pa所指元素相等的节点*/
if(pb){ /*pa所指元素与pb所指元素相等*/
pre-&next=pa-&
q=/*求差集 所以要删除pa节点*/
这也算错。。
typedef struct node
struct node*
void Different_Set(Lnode &La,Lnode Lb)//需要在La上进行更改,所以使用引用
pLa,pLb,pre,
while(pLa)//当La链表没到头的时候
while(pLb && pLa-&elem != pLb-&elem)//LB中没有和LA中相等的元素就继续寻找
if(!pre)//如果LB中和LA中的第一个元素相等了
La=pLa-&//换掉LA中第一个节点
else//否则删除当前LA中与LB中相等的元素节点
pre-&next=pLa-&
pre指向当前非公有元素。当查找到A和B的公有元素时,若pre为空,说明前面的元素都是公有元素,需要修改*LA的表头;若pre不为空,则pre-&next=pa-&next跳过pa指向的当前公有元素,实现删除。
LA为二维指针,pa为一维指针,将pa指向链表A时,需要LA执行一次解引用操作,即pa=*LA;
A在外层循环,B内层循环。每次取出A中一个值x后,在B中从头到尾找值为x的节点,即执行如下代码 while(pb && pa-&elem != pb-&elem)
其中pre始终指向pa的上一个节点。
(1)若pre==NULL
则说明此时在B中找到了A链表的首节点相同的元素,应该将此节点删除。所以执行*LA=pa-&next,后面的
是将此时A中pa指向的节点删除,pa移到下一个元素,而*LA保持为A链表首节点; (2)若pre非NULL
因为pa节点要删除,所以pre的下一个节点应该指向pa-&next,即执行
pre-&next=pa-& 总地来说,就是保证pre是要操作的节点pa的上一个节点;
2.2未找到x,也就是pb为NULL
此时pa节点不会删除,pa会往后移,而在它后移之前,我们需要保证pre是移到后pa的上一个节点,所以执行
*LA==pa-&表示如果头结点为相同元素的话,那么该元素要删除,且*LA指向pa的下一个结点。
这道题关键是理解pre这个指针代表的含义,pre为null,表示第一次两个集合的共有元素。找到新的*LA的头结点。
代码中的指针pa用于指向集合A的元素;pb指向集合B的元素;临时指针q指向需要被删除的元素;pre用于实现删除时结点的链接,与pa保持所指结点的前后继关系。
看别人的代码真痛苦!!!!
请哪位牛客帮忙解释一下,LA为什么要定义成指针的指针?定义成LB一样的类型不行吗?
每个符号之间要有空格!!!
大声告诉我,pre指针一开始就是空,最后怎么有next?
pre 指针的用途是先判断是否找到第一个元素。后面用于构建删除元素之后的LA链表。
2里面没有括号行?
我就想问一下,如果a的第一个元素和b的第一个元素相同,那么就不会进入while(pb &&
pa-&elem!=pb-&elem)的这个循环里,也就不会删除节点,所以这个程序的思路有bug呀。!!!!
求反驳。求指教。没有的话 这个网站。。。有点水
判题太死板了。判题系统0智力集成,开发者不愿动一点脑筋,直接比较字符串。
第二空,while循环连括号都没有,我加了个括号算我错了
原来free可以这么用,没有malloc也能直接free掉吗
强烈建议后台修改批改程序。不要硬匹配,可以填入跑程序嘛。
每次都是因为一个空格、等式左右两遍互换了下导致错误。
这题目是不是问题啊,若第pb为空了,说明LB中的的节点和pa指向节点没有相同的,pre应该指向下一个节点才是pa吧
手机代码看不到
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
浙ICP备号-2
扫一扫,把题目装进口袋

我要回帖

更多关于 单链表的输入输出 的文章

 

随机推荐