OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3733|回复: 4

单链表遍历,无法打印首元素问题求指导...

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-5-19 17:55:11 | 显示全部楼层 |阅读模式
10金钱
使用战舰开发板+mdk5.14
额,主题程序参考<<C和指针>>源码
编程思想: 首指针->首节点->第一个有效节点->第二个有效节点->第三个有效节点......(首指针没有数据区域,首节点数据区域无效)
[mw_shl_code=c,true]typedef struct list
{
    int value;
    struct list * next;
}list_t;

list_t * header; /* 首指针 */

int list_init(list_t ** hdr)
{
    list_t * first = NULL;

    first = (list_t *)malloc(sizeof(list_t)); /* 创建首节点 */
    if (first == NULL)
    {
        return -1;
    }
    first->value = 0;
    (*hdr) = first; /* 首指针指向首节点 */
   
    return 0;
}
  
int list_insert(list_t ** hdr, int value)
{
    list_t * cur = NULL;
    list_t * ptr = NULL;
    list_t ** next = &((*hdr)->next);
   
    while (((cur=*next)!=NULL) && (cur->value<value)) /* next初始状态下存储的是首节点的地址 */
    {
        next = &cur->next;
    }
   
    ptr = (list_t *)malloc(sizeof(list_t));
    if (ptr == NULL)
    {
        return -1;
    }
    ptr->value = value;
   
    ptr->next = cur;
    *next = ptr;
    return 0;
}

int list_traverse(list_t * hdr)
{
    list_t * cur = NULL;
    int i = 1;

    for (cur=hdr->next->next; cur!=NULL; cur=cur->next) /* cur初始情况下指向的是第一个有效节点,为什么数值为1的节点没有打印出来 */
    {
        printf("%d\r\n", cur->value);
        printf("i = %d\r\n", i++);
    }
   
    return 0;
}
int main(void)
{         
        delay_init();                   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
        uart_init(115200);       

    list_init(&header);
    list_insert(&header, 1);
    list_insert(&header, 2);
    list_insert(&header, 3);
    list_insert(&header, 4);
    list_insert(&header, 5);
    list_traverse(header);
   
    while(1);
}[/mw_shl_code]
如果将程序中加粗的那句代码做如下修改,则可以完整输出所有节点数据.
for (cur=hdr->next; cur!=NULL; cur=cur->next)
可是此时cur(cur=hdr->next)指向的是头节点,头结点数据是无效的啊,应该是不需要打印的啊.
恳请大神指教...

最佳答案

查看完整内容[请看2#楼]

估计楼主已经解决了 list_traverse(header)这里传入的是指针变量的值,即传入的是首节点地址,则cur=hdr->next->next就是第二个有效节点了,通过仿真的数据可能看的比较清楚。 此外有个问题估计楼主已经解决了,可能还没有更新帖子中的代码,就是初始化首节点的时候,没有把next设置为NULL,这样会造成异常。
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-5-19 17:55:12 | 显示全部楼层
估计楼主已经解决了
list_traverse(header)这里传入的是指针变量的,即传入的是首节点地址,则cur=hdr->next->next就是第二个有效节点了,通过仿真的数据可能看的比较清楚。
QQ截图20170524150636.png
此外有个问题估计楼主已经解决了,可能还没有更新帖子中的代码,就是初始化首节点的时候,没有把next设置为NULL,这样会造成异常。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

0

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2014-12-22
在线时间
39 小时
发表于 2017-5-19 20:07:04 | 显示全部楼层
cur=hdr->next是指向第二个节点
回复

使用道具 举报

0

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2014-12-22
在线时间
39 小时
发表于 2017-5-19 20:15:38 | 显示全部楼层
头节点算第一个节点
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-5-24 18:16:08 | 显示全部楼层
本帖最后由 liuchang 于 2017-5-24 18:38 编辑
ianhom 发表于 2017-5-24 15:11
估计楼主已经解决了
list_traverse(header)这里传入的是指针变量的值,即传入的是首节点地址,则cur=hdr-> ...

经常蒙受大神指教,不胜感激...

是的,问题解决了.

我当时是对"头指针指向头节点"没有理解清楚.

假设头指针是header,头节点是first(它们都是list_t *类型)

我认为header->first才是指向,而其实是header=first.是概念没有理解清楚

在此感谢大神...
电子爱好者
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-20 21:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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