仅有的倔强 发表于 2018-8-11 22:14:14

单链表的头结点与计数器的关系


j=1??
我怎么觉得计数器应该是从0开始的

1.在 Status ListInsert(LinkList *L,int i,ElemType e) 中的 LinkList *L是 头指针的地址是吗?
2.若L是头指针的地址,那么P =*L应该是 头结点的地址。
3.那么P不就是指针头结点吗 ,计数器不应该从 0开始吗,又没有到线性表第一个数据呀?


不知道有没有理解错 大佬帮助下下女子

claws0n 发表于 2018-8-11 23:29:01

姐姐好~

1. LinkList *L 是一个指针结构。*L 是头指针没错
2. p 是一个参考指针,一开始是头结点,但之后就不是了
3. 数据结构是自己定义的,没有规定一定要从 0 开始。这里的计数器是在计算位置,最前面的不是第 0 个,而是第 1 个,所以 j 从 1 开始,这样就比较直,插入第 i 个位置。

仅有的倔强 发表于 2018-8-12 08:37:00

claws0n 发表于 2018-8-11 23:29
姐姐好~

1. LinkList *L 是一个指针结构。*L 是头指针没错


谢谢你为我解答
但我还是有一个问题是
既然p一开始指向头结点的。 头结点也算是第一个结点是吗   那这样的话, 计数器应该从0开始呀 第二个结点才是我们真正的 线性表第一个结点哇?那时候计数器才变成1我还是对这个地方有点懵

claws0n 发表于 2018-8-12 12:14:08

仅有的倔强 发表于 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~

么么?

仅有的倔强 发表于 2018-8-12 14:16:03

claws0n 发表于 2018-8-12 12:14
j 不是计数器,是位置指标,不需要从 0 开始。
链表的结构是这样的
HEAD(0) -> a1(1) -> a2(2) -> ...
...

在有头结点的单链表,若想在 第 i个位置添加数据 ,和 想在第i个位置删除数据, j 用来判断 有没有到达 i 的位置?

claws0n 发表于 2018-8-12 14:39:18

仅有的倔强 发表于 2018-8-12 14:16
在有头结点的单链表,若想在 第 i个位置添加数据 ,和 想在第i个位置删除数据, j 用来判断 有没有到 ...

头结点是不变的,p 是动态的指针,一开始是指向头结点而已。但是指针没有计数的功能,所以用 j
标记目前的位置,用 i 标记目标位置。

因为链表就是活动性高的,没有理由让指针附带计数器。

仅有的倔强 发表于 2018-8-12 15:10:18

claws0n 发表于 2018-8-12 14:39
头结点是不变的,p 是动态的指针,一开始是指向头结点而已。但是指针没有计数的功能,所以用 j
标记目 ...




请教下,我这样哪个地方理解错了?

爱上花儿的骚年 发表于 2018-8-12 15:36:36

j是1,指示首节点,L代表头指针,L->next指示的是头节点的指针域,代表首节点

claws0n 发表于 2018-8-12 15:59:32

仅有的倔强 发表于 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 了

仅有的倔强 发表于 2018-8-12 16:14:51

claws0n 发表于 2018-8-12 15:59
不全对也不全错。j 不是资料的位置,是接线的位置

L--> ---------> ---------> [ ...

感谢!!   这样感觉就略懂了 ! 我试着写写代码!感谢!

claws0n 发表于 2018-8-12 16:22:13

仅有的倔强 发表于 2018-8-12 16:14
感谢!!   这样感觉就略懂了 ! 我试着写写代码!感谢!

交流学习~欢迎发问~

完成后,请姐姐采纳最佳答案~ 么么~

仅有的倔强 发表于 2018-8-12 16:47:58

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;
}

仅有的倔强 发表于 2018-8-12 16:49:53

claws0n 发表于 2018-8-12 16:22
交流学习~欢迎发问~

完成后,请姐姐采纳最佳答案~ 么么~

又麻烦你拉 ~

claws0n 发表于 2018-8-12 17:04:42

本帖最后由 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 给重新上链

仅有的倔强 发表于 2018-8-12 17:18:49

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 个结点 的数据

claws0n 发表于 2018-8-12 17:39:54

仅有的倔强 发表于 2018-8-12 17:18
不不不,
我现在问的是 查询第 i个结点的代码



等下,现在是要查找第几个元素而已吧?
索取的话,概念不一样~~
序号没有改变~~
因为一开始 p = L-> == &a1 了,此时 p 是在 j 之后

仅有的倔强 发表于 2018-8-12 17:52:12

claws0n 发表于 2018-8-12 17:39
等下,现在是要查找第几个元素而已吧?
索取的话,概念不一样~~
序号没有改变~~


噢噢噢~略懂略懂了   什么序号没有改变??

claws0n 发表于 2018-8-12 18:06:11

仅有的倔强 发表于 2018-8-12 17:52
噢噢噢~略懂略懂了   什么序号没有改变??

应该说这链表是建立在数组的基础上。如果插队了,插入第 5 个位置,那么原本第 5 个到最后一个元素,要退后一个,让出位置来对吧?

链表是省去了整体移动的动作,但是原本 5:end 的变成 6:end。它们的相对序号是改变的。但是在链表,这个序号从幕前被搬到幕后去,几乎看不到身影

插入的时候,让前面的报数。1,2,3,4;好,到 4 的后面,就会插入在第 5 个元素了。
索取的时候,如果你要第 5 个元素,你一定是算到第五个才拿不是吗?所以指针的指向调整了一格

仅有的倔强 发表于 2018-8-12 20:52:48

claws0n 发表于 2018-8-12 18:06
应该说这链表是建立在数组的基础上。如果插队了,插入第 5 个位置,那么原本第 5 个到最后一个元素,要退 ...


深奥....
不懂...

claws0n 发表于 2018-8-12 21:05:23

仅有的倔强 发表于 2018-8-12 20:52
深奥....
不懂...

那就消化最后两行吧~
页: [1]
查看完整版本: 单链表的头结点与计数器的关系