仅有的倔强 发表于 2018-8-12 09:56:04

一个小单链表代码问题


structslist
{double   s;
   struct slist*next;
};
typedefstruct slistSTREC;


doublefun( STREC *h)
{

double max=h->s;
while(h!=NULL)
{
if(max<h->s)
max=h->s;
h=h->next;
}
return max;
}


这是一个 寻找带头结点的单链表中寻找 数据最高方法

为什么在fun 方法里面, 一开始让最大值是 h->s,h是头指针, h->s 是头结点的 数据? 头结点的数据 不是没有嘛?
寻求大佬的帮助!

claws0n 发表于 2018-8-12 12:53:17

姐姐,您有 C 的基础吗?结构体与其指针是相同的 *L == L (地址),但用法不一样。这里是要寻找,没有必要去复制一笔资料再来比大小,直接遍历就可以了,所以用指针的方式

structslist
{
    double   s;
    struct slist*next;
};
typedefstruct slistSTREC;


doublefun( STREC *h )
{
    double max=h->s;      // h->s >> max = h 的资料,因为 s 是 double 型的资料
    while(h!=NULL)          // 这是遍历/搜索的写法:如果指针不是指向 NULL(尾端),继续循环
    {
      if(max<h->s)         // 如果在寻找过程发现新的资料 s 比目前 max 所记录的值来得大
            max=h->s;      // 更新记录,max = h 的 s
      h=h->next;         // h 指向下一个元素
    }
    return max;               // 上面找完所以元素了,把最大值返回
}

加入适当的空格,方便阅读
那边最好这样写
if(max<h->s)         //如果在寻找过程发现新的资料 s 比
{
    max=h->s;
}

仅有的倔强 发表于 2018-8-12 16:24:35

claws0n 发表于 2018-8-12 12:53
姐姐,您有 C 的基础吗?结构体与其指针是相同的 *L == L (地址),但用法不一样。这里是要寻找,没有必要 ...

有C语言基础,但学的不好

我知道 *h 是指针, 是链表中的头指针.在该链表有头结点
h->s   我也知道 s 是结点中 double 的数据.
1.但 h->s 的指向的是哪个结点中的数据吗?是头结点的数据(头结点的数据域不是一般不设置吗)?
2.为什么先让它为 最大值进行操作的??

claws0n 发表于 2018-8-12 16:51:31

仅有的倔强 发表于 2018-8-12 16:24
有C语言基础,但学的不好

我知道 *h 是指针, 是链表中的头指针.在该链表有头结点


没有人敢说学得好吧{:10_329:}

姐姐在看小甲鱼老师的视频?小甲鱼老师在(C)讲指针的时候,一开始还好,到后面的时候就乱了{:5_99:}
到数据结构的时候就更不负责任了{:10_278:}

建议不要看到箭头就说指去这里那里,吧【 -> 】看成【的】就清楚多了。h 的 s == h 目前的资料(double s)
1. 以开始是头结点没错,跟 p 一样,之后就不是了,因为 h = h->next   // h 被赋值为 h 的下一个(指针 *next)
2. 你要找最大值,所以必须定义。一开始是头结点,头结点的资料一般是 NULL,加入 return NULL,说明这是空链表。
假设说这不是空链表,那么头结点肯定不会指向 NULL,所以 while(h!=NULL) 将进入循环,直到最后一个元素。这个过程用 if() 判断,把链表中的最大元素给找出来

lvvly 发表于 2018-8-12 17:04:54

哎 带头结点的链表 头结点是自己定义的,我的理解就是头结点的数据部分是无用的,因为头结点的作用应该是拿来指向"第一个"“数据有用”的指针。比如p0,p1,p2都是链表指针,你把数据从p1开始存储,那p0的next指向p1,p0就是头指针。

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

嗯嗯嗯 对 在看小甲鱼的学习视频   
我还看小甲鱼的 数据结构,看到链表这里我就卡主了,一直纠结你给我解决的问题,
然后要考C语言二级,做题呢。 又碰到现在这个让我转不过来弯的问题拉
   我太笨了呜呜呜呜呜...


   1.恩 我同意你说的 ,要找最大值,要必须定义。 所以 题目说 max=h->s;
   2. 然后 h->s, 然而 我还是不懂你说的 h的s 就是目前的 s. 头指针的数据域 没有值吧 ??{:5_99:}
   我还是不自动 max等于多少呢

下面是main函数里的东东西,题目只让写fun(h)方法;


void main()
{
   doubles={85,76,69,85,91,72,64,87}, max;void NONO ();

   STREC*h;

   h=creat( s );   outlist(h);

   max=fun( h );

   printf("max=%6.1f\n",max);

   NONO();
}

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

lvvly 发表于 2018-8-12 17:04
哎 带头结点的链表 头结点是自己定义的,我的理解就是头结点的数据部分是无用的,因为头结点的作用应该是拿 ...

恩恩谢谢你来解决我的问题

现在我迷惑的地方是, h是头指针, 而h->s =? 一开始是 头结点中的 数据吗,但是和之前 头结点的数据 是无用的 不矛盾吗

lvvly 发表于 2018-8-12 17:43:48

我不知道我理解的对不对,头结点我是这么理解的:
h0,h1,h2,h3……hn
按照你的要求 寻找带头结点的单链表中寻找 数据最高方法
既然是带头结点的 那你的数据就应该放在g1,g2,g3……gn 中
比如你在 1 2 3 4 5 6 ……n 中找最大的,那么被找的这些数据就是存储在h1,h2,h3……里面
你声明结点的时候,h1->s=1,h2->s=2……
h0->s 因为h0是头结点,你可以随意设置h0->s 头结点的数据对你来说无意义 如果你没有对h0->s初始化,那么h0->s就是不确定的值 但是h0->s对你的问题没用,因为你找的数是从p1开始存储的
p0->next就是p1
你的代码中max=h->s因为是带头结点的,h是头结点那么h->s它的值是不确定的
max=h->next->s
h->next->s才是h1的值,你存储数据的开始。
我的理解

仅有的倔强 发表于 2018-8-12 18:26:34

lvvly 发表于 2018-8-12 17:43
我不知道我理解的对不对,头结点我是这么理解的:
h0,h1,h2,h3……hn
按照你的要求 寻找带头结点的单链表 ...

谢谢你 , 我看懂了 一开始的理解和你相同

我上面发的代码是 答案给的 。 所以我很纳闷 来讯问哒

还是很谢谢 你 辛苦了{:5_106:}

Mountain_gs 发表于 2018-9-12 09:49:33

仅有的倔强 发表于 2018-8-12 18:26
谢谢你 , 我看懂了 一开始的理解和你相同

我上面发的代码是 答案给的 。 所以我很纳闷 来讯问哒


      为什么要max=h->s啊?,直接max=h->next->s就行了。
      而且一般情况下不会用h=h->next的吧,而是新建一个指针p,用p指向h,之后移动p指针的吧?h是头指针,把头指针移动了不会对链表本身造成影响吗?
页: [1]
查看完整版本: 一个小单链表代码问题