单链表的头结点与计数器的关系
j=1??
我怎么觉得计数器应该是从0开始的
1.在 Status ListInsert(LinkList *L,int i,ElemType e) 中的 LinkList *L是 头指针的地址是吗?
2.若L是头指针的地址,那么P =*L应该是 头结点的地址。
3.那么P不就是指针头结点吗 ,计数器不应该从 0开始吗,又没有到线性表第一个数据呀?
不知道有没有理解错 大佬帮助下下女子 姐姐好~
1. LinkList *L 是一个指针结构。*L 是头指针没错
2. p 是一个参考指针,一开始是头结点,但之后就不是了
3. 数据结构是自己定义的,没有规定一定要从 0 开始。这里的计数器是在计算位置,最前面的不是第 0 个,而是第 1 个,所以 j 从 1 开始,这样就比较直,插入第 i 个位置。 claws0n 发表于 2018-8-11 23:29
姐姐好~
1. LinkList *L 是一个指针结构。*L 是头指针没错
谢谢你为我解答
但我还是有一个问题是
既然p一开始指向头结点的。 头结点也算是第一个结点是吗 那这样的话, 计数器应该从0开始呀 第二个结点才是我们真正的 线性表第一个结点哇?那时候计数器才变成1我还是对这个地方有点懵 仅有的倔强 发表于 2018-8-12 08:37
谢谢你为我解答
但我还是有一个问题是
既然p一开始指向头结点的。 头结点也算是第一个结点是吗 那 ...
j 不是计数器,是位置指标,不需要从 0 开始。
链表的结构是这样的
HEAD(0) -> a1(1) -> a2(2) -> ...
我想插入一个元素在第一个位置
HEAD(0) -> e(1) -> a1(2) -> a2(2) -> ...
需要怎么做?直接插入就好了嘛,因为 HEAD 是指向第一个元素的位置。
找到位置了,while ... if ... 跳过,申请内存,存放资料。
s-> next = p->next;//新资料指向头结点 p 的下一个位置 a1
p->next = s; //头结点不动,直接指向新资料的位置
生活化的例子:插队。您想插到第五个位置,那是不是需要先定位到第四个,然后原本排在第五个的人就落后一位了。链表就是插队~ 这4 跟 5,就是您的 0 与 1~
么么? claws0n 发表于 2018-8-12 12:14
j 不是计数器,是位置指标,不需要从 0 开始。
链表的结构是这样的
HEAD(0) -> a1(1) -> a2(2) -> ...
...
在有头结点的单链表,若想在 第 i个位置添加数据 ,和 想在第i个位置删除数据, j 用来判断 有没有到达 i 的位置? 仅有的倔强 发表于 2018-8-12 14:16
在有头结点的单链表,若想在 第 i个位置添加数据 ,和 想在第i个位置删除数据, j 用来判断 有没有到 ...
头结点是不变的,p 是动态的指针,一开始是指向头结点而已。但是指针没有计数的功能,所以用 j
标记目前的位置,用 i 标记目标位置。
因为链表就是活动性高的,没有理由让指针附带计数器。 claws0n 发表于 2018-8-12 14:39
头结点是不变的,p 是动态的指针,一开始是指向头结点而已。但是指针没有计数的功能,所以用 j
标记目 ...
请教下,我这样哪个地方理解错了? j是1,指示首节点,L代表头指针,L->next指示的是头节点的指针域,代表首节点 仅有的倔强 发表于 2018-8-12 15:10
请教下,我这样哪个地方理解错了?
不全对也不全错。j 不是资料的位置,是接线的位置
L--> ---------> ---------> ---------> ---------> .....
^ j=1 j=2 j=3
p
目标删除位置 i=2>> a2
找到 j = i ,但 p 还是指向 a1
临时指针 q = p->next == &a2
p->next = q->next == &a3
free(q) 功成圆满,可以释放 q 了 claws0n 发表于 2018-8-12 15:59
不全对也不全错。j 不是资料的位置,是接线的位置
L--> ---------> ---------> [ ...
感谢!! 这样感觉就略懂了 ! 我试着写写代码!感谢! 仅有的倔强 发表于 2018-8-12 16:14
感谢!! 这样感觉就略懂了 ! 我试着写写代码!感谢!
交流学习~欢迎发问~
完成后,请姐姐采纳最佳答案~ 么么~ claws0n 发表于 2018-8-12 15:59
不全对也不全错。j 不是资料的位置,是接线的位置
L--> ---------> ---------> [ ...
Status GetFlem(LinkList L,int i,ElemType *e)
{
int j;
LinkList P;
p=L->next;
j=1;
while(p||j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
{
rerutnERROR;
}
*e=p->data;
return OK;
}
claws0n 发表于 2018-8-12 16:22
交流学习~欢迎发问~
完成后,请姐姐采纳最佳答案~ 么么~
又麻烦你拉 ~ 本帖最后由 claws0n 于 2018-8-12 17:12 编辑
仅有的倔强 发表于 2018-8-12 16:47
Status GetFlem(LinkList L,int i,ElemType *e)
{
int j;
这代码有错字
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList P;
p=L->next;
j=1;
while(p||j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
returnERROR;
}
*e=p->data;
return OK;
}
p 不需要指向 a2,因为 j == i == 2,p->next 就保证是 &a2
看回 9 楼吧,比较一下,消化一下
p 不能丢掉,因为 p 接下来得把 &a3 给重新上链 claws0n 发表于 2018-8-12 17:04
这代码有错字
Status GetElem(LinkList L,int i,ElemType *e)
{
不不不,
我现在问的是 查询第 i个结点的代码
和9楼说的方法有冲突,(可能也是我理解错的原因)
因为最后有一个*e=p->data;
按照9楼说的方法, 找到的p并不是指向的第i个结点 ,而p->next 才是 第i个位置。所以 *e=p->data;e并不是 第 i 个结点 的数据 仅有的倔强 发表于 2018-8-12 17:18
不不不,
我现在问的是 查询第 i个结点的代码
等下,现在是要查找第几个元素而已吧?
索取的话,概念不一样~~
序号没有改变~~
因为一开始 p = L-> == &a1 了,此时 p 是在 j 之后
claws0n 发表于 2018-8-12 17:39
等下,现在是要查找第几个元素而已吧?
索取的话,概念不一样~~
序号没有改变~~
噢噢噢~略懂略懂了 什么序号没有改变??
仅有的倔强 发表于 2018-8-12 17:52
噢噢噢~略懂略懂了 什么序号没有改变??
应该说这链表是建立在数组的基础上。如果插队了,插入第 5 个位置,那么原本第 5 个到最后一个元素,要退后一个,让出位置来对吧?
链表是省去了整体移动的动作,但是原本 5:end 的变成 6:end。它们的相对序号是改变的。但是在链表,这个序号从幕前被搬到幕后去,几乎看不到身影
插入的时候,让前面的报数。1,2,3,4;好,到 4 的后面,就会插入在第 5 个元素了。
索取的时候,如果你要第 5 个元素,你一定是算到第五个才拿不是吗?所以指针的指向调整了一格 claws0n 发表于 2018-8-12 18:06
应该说这链表是建立在数组的基础上。如果插队了,插入第 5 个位置,那么原本第 5 个到最后一个元素,要退 ...
深奥....
不懂... 仅有的倔强 发表于 2018-8-12 20:52
深奥....
不懂...
那就消化最后两行吧~
页:
[1]