问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于单链表逆序输出的问题,如果不用递归的话,怎么解决,自己写了段代码,一运行就崩溃。求大神赐教。

发布网友 发布时间:2022-08-16 00:58

我来回答

3个回答

热心网友 时间:2023-09-25 10:48

你写的程序当释放到最后一个指针的时候会出错。
比如链表是:
head -> n1 -> NULL

下面没步骤执行的时候:
while(L->next!=NULL)

{
p=L->next; //执行到这一步的时候, p = n1;
while(p->next!=NULL) //这个循环不会执行,因为 p->next 现在已经是null了。注意q没有赋值
{
q=p;
p=q->next;
}
cout<<p->data<<" "; //这步会正确打印n1中的数字;
q->next=NULL; //这步挂了。看到了吗?q还没有赋值!!!
free(p);
}
}

代码改成:
void PrintInverted(LNode *&L)
{
LNode *p,*q;
while(L->next!=NULL)
{

q = L; //就加这一行就行了!!!!!!!!!!!
p=L->next;
while(p->next!=NULL)//找到终结点
{
q=p;
p=q->next;
}
cout<<p->data<<" ";
q->next=NULL;
free(p);//删除最后一个结点

}
}

另外,既然是打印完了之后链表就销毁了,其实还有一种时间复杂度更高的方法:
1、先遍历到链表的末尾,遍历的时候,直接把链表逆序;
2、然后依次删除链表就行了。

就像我代码里面些的,从你的实现上,函数传入的头指针L里面应该是没有装数据的,我下面的代码是按照这个来写的。如果L面是有数据,行数会更短,稍微改下就可以了,你懂的。

代码如下:
void PrintInverted(LNode *&L)
{
LNode* p, *q, *r;
//L 是头指针(从你实现上,这个应该是没有装数据的,这个不动)。
//剩下的逆序
p = L->next;
if(p == NULL)
{//此时链表为空,没有数据;
return;
}
q = p->next;
p->next = NULL;
while(q != NULL)
{
r = q;
q = q->next;
r -> next = p;
p = r;
}
//此时,链表已经逆序,装有数据的表头为p,然后是“顺序”打印,你懂的
while( p != NULL)
{
cout<<p->data<<" ";
q = p;
p = p->next;
free(q);
}
}

热心网友 时间:2023-09-25 10:48

void PrintInverted(LNode *&L)
{
LNode *p=L->next,*q=L; //这里给初值
if ( p!=NULL) //如果是空表则不处理
{
while(p->next!=NULL)//找到终结点
{
q=p;
p=q->next;
}
cout<<p->data<<" ";
q->next=NULL;
free(p);//删除最后一个结点
}

}

热心网友 时间:2023-09-25 10:48

/*
这是个例子
*/
# include "stdio.h"
# include "stdlib.h"
typedef struct LNode
{
char data;
LNode * next;
} * LinkList;
LinkList create_list(char * A);
void traverse_list(LinkList pHead);
LinkList PrintInverted(LinkList L);
int main(void)
{
char * A = "abcdefg";
LinkList pHead;
pHead = create_list(A);
printf("遍历单链表中的元素:");
traverse_list(pHead);
PrintInverted(pHead);
printf("元素倒置后,遍历单链表:");
traverse_list(pHead);
return 0;
}
LinkList create_list(char * A)
{
int len;
int i;
int val;

LinkList pHead = (LinkList)malloc(sizeof(LNode));
LinkList pTail = pHead;
pTail->next = NULL;
for (i=0;i<7;++i)
{
LinkList pNew = (LinkList)malloc(sizeof(LNode));
pNew->data = A[i];
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(LinkList pHead)
{
LinkList p = pHead->next ;
while (NULL != p)
{
printf("%c ",p->data);
p = p->next;
}
printf("\n");
return ;
}
LinkList PrintInverted(LinkList L)//单链表的倒置算法
{
LNode * p,* q;
p = L->next;
L->next = NULL;
while(p)
{
q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
return L;
}
/*
结果:
------------------------
遍历单链表中的元素:a b c d e f g
元素倒置后,遍历单链表:g f e d c b a
Press any key to continue
------------------------------
*/
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
注册保险代理有限公司需要什么资料! 现在什么云手机性价比高一点? 50个可接双宾语的动词 为琵琶独奏曲《春江花月夜》配一首词或诗 我经常看到HI语音里会有什么魅力榜、贡献榜这些排名,我也一直在语音直播... 跨行通怎么激活 父母是农民不知道有没有纳税 普通农民可以算纳税人吗? 农民不交农业税了,是不是纳税人? 小红书上女生缺衣服穿的心情说说四十句 如何实现链表的倒序输出 在数据结构单链表中如何实现倒序输出 求C语言单链表倒序遍历程序~ 化学有机物的sp轨道分别是什么? s或p的几次方代表什么? s1 p1 中有固定的原子么? 不小心把办公室柜子的钥匙弄丢了,在不破坏锁的情况下,怎么才能打开呀?是那种3个抽屉一个锁的那种。 用什么方法教育孩子爱上学习 英语作文可爱的弟弟 英语作文我的弟弟(写多一点,演讲用) 有关写弟弟的英语作文(60词) 以我的弟弟为题目的英语作文 300词左右 以“我的弟弟”为题写一篇100词的英语作文 英语作文弟弟 oppo年终奖一般几个月 问了好多人,都说OPPO年终奖很丰厚,是真的吗? oppo年终奖绩效c有年终奖吗 OPPO年终奖为什么这么高?有没有在OPPO工作的人,介绍下 怎样减肥肚子不饿? 怎样不饿肚有效减肥 经营宗旨的类型 被子植物与裸子植物相同之处是( )A.有花的各部B.有种子C.有果实D.双... 逆序一个单链表,C语言 链表倒序排列 求解C语言数据结构链表倒序思路 英语万圣节的习俗40字 文案|“充满希望的治愈系句子” 电脑虚拟内存设置了有用吗 我的衣服上有superman字样,不知啥意思?能穿吗? 你好,我现在也遇到了被套路贷强制下款的贷款,谈怎么处理 衣服上只写着superman的t恤是什么牌子啊和这个应该是同个牌子 龙岗世贸百货superman衬衫标志质量怎么样的? superman正品衣服哪里有卖 为什么Superman 的S变成R IPAD AIR 全民飞机大战 怎么和微信好友玩 全民飞机大战如何添加微信里没有的好友。而对方有你,还能给你送体力 什么是精血 精血和普通血液有什么区别? 女生的精血指什么 精血的精血简介 古代精血什么意思? 请问动车二等座06车05C号,06车06A号,06车05B号在一起吗?