关于单链表的头插法建立单链表,想问下建立时将L->=null;那怎么实现指向下一个结构呢?

童子佩觹 2019-11-30 03:32:56
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;


typedef struct LNode
{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode; //声明单链表结点类型
void CreateListF(LinkNode *&L,ElemType a[],int n)


//头插法建立单链表
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->next=NULL; //这一步没看懂
for (int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data=a[i];
s->next=L->next; //将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}
在循环里把L->赋值给了s->next,那s->next不是为空了么?还有想问的是s从0到n-1都是插入的么?L才是原来的旧链表?谢谢大家了。
...全文
292 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
童子佩觹 2019-12-01
  • 打赏
  • 举报
回复
引用 11 楼 寻开心 的回复:
void CreateListF(LinkNode *&L,ElemType a[],int n)
//头插法建立单链表 看函数的名字Create是新建的意思, 不是在原有的一个上插入
{
LinkNode *s;
// 新建一个表头, 刚开始建立的时候,链表就一个元素, 那它的下一个必须是NULL
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->next=NULL; //这一步没看懂。 它没有下一个节点, 下一个节点必须是NULL

for (int i=0;i<n;i++)
{
// s是每次循环进入后,新建的节点,根据传参数进来的数组内容设置节点的元素值
s= (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data=a[I];
//下面的是重点
头插法:保持头不变, 把新的节点放到头节点的后面
所以头节点的next指向新创建的s节点, 新创建的s节点的next要指向原来的头节点的next,这样才串联起来

s->next=L->next; //将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}

对于已经有内容的表, 应该另外写一个InsertListF()这样的函数, 而不是用这个函数
InsertListF()函数当中, L是表头,它的Next已经不是NULL了
代码进来就是for循环,不用再对L做malloc和赋值了,因为它已经存在了

InserListF()和CreateListF() 是两个不同的需求, 不要用同一个函数来解决

谢谢你,看来是我对插入这个词过分解读了。非常感谢。
寻开心 2019-11-30
  • 打赏
  • 举报
回复
void CreateListF(LinkNode *&L,ElemType a[],int n)
//头插法建立单链表 看函数的名字Create是新建的意思, 不是在原有的一个上插入
{
LinkNode *s;
// 新建一个表头, 刚开始建立的时候,链表就一个元素, 那它的下一个必须是NULL
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->next=NULL; //这一步没看懂。 它没有下一个节点, 下一个节点必须是NULL

for (int i=0;i<n;i++)
{
// s是每次循环进入后,新建的节点,根据传参数进来的数组内容设置节点的元素值
s= (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data=a[I];
//下面的是重点
头插法:保持头不变, 把新的节点放到头节点的后面
所以头节点的next指向新创建的s节点, 新创建的s节点的next要指向原来的头节点的next,这样才串联起来

s->next=L->next; //将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}

对于已经有内容的表, 应该另外写一个InsertListF()这样的函数, 而不是用这个函数
InsertListF()函数当中, L是表头,它的Next已经不是NULL了
代码进来就是for循环,不用再对L做malloc和赋值了,因为它已经存在了

InserListF()和CreateListF() 是两个不同的需求, 不要用同一个函数来解决
童子佩觹 2019-11-30
  • 打赏
  • 举报
回复
引用 8 楼 牧濑EL 的回复:
你到底是想干什么…
你上面的表述是”在已有表上插入“
我那句话是说L是某个表的最后一个节点,读入的数据插进这个表中。
如果是想新建一个链表把读入的数据存进去,就把L直接定义成普通的指针,还有空表就不是表了吗?一开始什么读入都没有初值不就是空吗?

我表达的已有表插入是因为我发现实现不了。而你的描述是直接给了L。但是代码里面的L是刚刚初始化,没有赋值的表。无法实现已有表。所以我就想问下代码的功能是只能对刚初始化的表进行操作是吧?
童子佩觹 2019-11-30
  • 打赏
  • 举报
回复



引用 8 楼 牧濑EL 的回复:
你到底是想干什么…
你上面的表述是”在已有表上插入“
我那句话是说L是某个表的最后一个节点,读入的数据插进这个表中。
如果是想新建一个链表把读入的数据存进去,就把L直接定义成普通的指针,还有空表就不是表了吗?一开始什么读入都没有初值不就是空吗?

对呀就是代码是空表一直都是空表,和我以前理解的不一样,就想问问代码这样写只能实现空表吧?
_pikaball 2019-11-30
  • 打赏
  • 举报
回复
你到底是想干什么… 你上面的表述是”在已有表上插入“ 我那句话是说L是某个表的最后一个节点,读入的数据插进这个表中。 如果是想新建一个链表把读入的数据存进去,就把L直接定义成普通的指针,还有空表就不是表了吗?一开始什么读入都没有初值不就是空吗?
童子佩觹 2019-11-30
  • 打赏
  • 举报
回复
引用 6 楼 牧濑EL 的回复:
L的next一开始是Null 又不是L自己是空的

链表不是头结点只有指针么?指针指向空,说明开始是空的,头部也只有指针没有数据,那不就是空的了么?
_pikaball 2019-11-30
  • 打赏
  • 举报
回复
L的next一开始是Null 又不是L自己是空的
_pikaball 2019-11-30
  • 打赏
  • 举报
回复
引用 3 楼 童子佩觹 的回复:
[quote=引用 2 楼 牧濑EL 的回复:] L一直是头,一开始因为链表中没有元素直接指向结束,每次加入元素时放在L后面一位,即“头插”
可是这样子的话,那这个表最开始就没有数据的,是空表。不是在已有表上插入了。[/quote] L自己就是已有表的最后一个吧?
童子佩觹 2019-11-30
  • 打赏
  • 举报
回复
引用 2 楼 牧濑EL 的回复:

L一直是头,一开始因为链表中没有元素直接指向结束,每次加入元素时放在L后面一位,即“头插”

可是这样子的话,那这个表最开始就没有数据的,是空表。不是在已有表上插入了。
_pikaball 2019-11-30
  • 打赏
  • 举报
回复
L一直是头,一开始因为链表中没有元素直接指向结束,每次加入元素时放在L后面一位,即“头插”
童子佩觹 2019-11-30
  • 打赏
  • 举报
回复
很奇怪,我看了视频后,发现头插尾插都是针对于被插数组的顺序,而不是原数组的头部尾部。都是在头结点并且,头结点指向NULL。很奇怪,为啥网上那么多贴图,都是头结点后面跟着一一指向的链表来讲解的呢?

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧