鱼C论坛

 找回密码
 立即注册
查看: 2788|回复: 9

一个小单链表代码问题

[复制链接]
发表于 2018-8-12 09:56:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

struct  slist
{  double   s;
   struct slist  *next;
};
typedef  struct slist  STREC;


double  fun( 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 是头结点的 数据? 头结点的数据 不是没有嘛?
寻求大佬的帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-12 12:53:17 | 显示全部楼层
姐姐,您有 C 的基础吗?结构体与其指针是相同的 *L == L (地址),但用法不一样。这里是要寻找,没有必要去复制一笔资料再来比大小,直接遍历就可以了,所以用指针的方式

  1. struct  slist
  2. {
  3.     double   s;
  4.     struct slist  *next;
  5. };
  6. typedef  struct slist  STREC;


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


加入适当的空格,方便阅读
那边最好这样写
  1. if(max<h->s)         //如果在寻找过程发现新的资料 s 比
  2. {
  3.     max=h->s;
  4. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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.为什么先让它为 最大值进行操作的??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-12 16:51:31 | 显示全部楼层
仅有的倔强 发表于 2018-8-12 16:24
有C语言基础  ,但学的不好

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

没有人敢说学得好吧

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

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

使用道具 举报

发表于 2018-8-12 17:04:54 | 显示全部楼层
哎 带头结点的链表 头结点是自己定义的,我的理解就是头结点的数据部分是无用的,因为头结点的作用应该是拿来指向"第一个"“数据有用”的指针。比如p0,p1,p2都是链表指针,你把数据从p1开始存储,那p0的next指向p1,p0就是头指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-12 17:10:56 | 显示全部楼层
嗯嗯嗯 对 在看小甲鱼的学习视频   
  我还看小甲鱼的 数据结构,看到链表这里我就卡主了,一直纠结你给我解决的问题,
  然后要考C语言二级,做题呢。 又碰到现在这个让我转不过来弯的问题拉
   我太笨了  呜呜呜呜呜...


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

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


void main()
{  
     double  s[N]={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();
}

  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

现在我迷惑的地方是, h是头指针, 而  h->s =? 一开始是 头结点中的 数据吗,但是和之前 头结点的数据 是无用的 不矛盾吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的值,你存储数据的开始。
我的理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-12 18:26:34 | 显示全部楼层
lvvly 发表于 2018-8-12 17:43
我不知道我理解的对不对,头结点我是这么理解的:
h0,h1,h2,h3……hn
按照你的要求 寻找带头结点的单链表 ...

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

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

还是很谢谢 你 辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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是头指针,把头指针移动了不会对链表本身造成影响吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表