| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖
标题:单向链表 尾部不能插入,请说明原因
只看楼主 加入收藏
jianghong_02
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:143
专家分:476
注 册:2010-10-2
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
单向链表 尾部不能插入,请说明原因
// printer_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string.h>
#include  <stdlib.h>



typedef struct tag_gpio_elem
{

    unsigned int nNum;     
    unsigned int nAddr;   
    unsigned int nPins;   

    struct tag_gpio_elem *pNext;
}GPIO_ELEM, *PGPIO_ELEM;

GPIO_ELEM     *gl_pGPIOList = 0;


GPIO_ELEM *GPIOElem_New(unsigned int nNum, unsigned int nAddr, unsigned int nPinCount)
{
    PGPIO_ELEM pNew;
   

    pNew = (PGPIO_ELEM)malloc(sizeof(GPIO_ELEM));
    if (!pNew)
        return 0;

    pNew->nNum = nNum;
    pNew->nAddr = nAddr;
    pNew->nPins = nPinCount;

   

    pNew->pNext = 0;
    return pNew;
}


void GPIOElem_Insert(GPIO_ELEM *pNew)
{
    GPIO_ELEM *pPre, *pNow;

    if (!pNew)
        return;

    if (!gl_pGPIOList)
    {
        gl_pGPIOList = pNew;
        return;
    }



    pPre = gl_pGPIOList;
    pNow = pPre->pNext;

    if (!pNow) {

        pNow = pNew;
        return;
    }

    while (pNow)
    {
        pNow = pPre->pNext;
    }
    pPre = pNew;

}

int main()
{
   
    for (int i = 0; i < 4; i++) {
        GPIO_ELEM *GPIO;
        GPIO = GPIOElem_New(i + 4, i + 5, i + 6);
        
        GPIOElem_Insert(GPIO);
    }

    GPIO_ELEM *GPIO,*gpio_next;
    GPIO = gl_pGPIOList;
    gpio_next = GPIO->pNext;

    while (gpio_next) {
        printf("%d  %d  %d \n", gpio_next->nAddr, gpio_next->nNum, gpio_next->nPins);
        gpio_next = gpio_next->pNext;
    }
    getchar();
    return 0;
}

搜索更多相关主题的帖子: 链表 int include unsigned return 
2017-07-26 23:44
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:4 
能把一个尾部插入写的这么拖沓啰嗦也是本事。

PS:你自己明白你在写什么吗?


for(this=root;this;this=this->next)
    ;
this = new;

差不多就是这样。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-27 06:40
jianghong_02
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:143
专家分:476
注 册:2010-10-2
收藏
得分:0 
回复 楼主 jianghong_02
话说之前请先理解:
1.我问的是为什么(即不是知其然,而要知其所以然),不是说怎么写。
2.我哪句话说了这是我写的
2017-07-27 06:51
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
如果要尾部插入的话加个尾指针像队列一样或许可以方便很多~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-27 09:23
jianghong_02
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:143
专家分:476
注 册:2010-10-2
收藏
得分:0 
回复 3楼 jianghong_02
其实不是 要怎么写法的问题,问题在于这本身就是一个陷阱,1.无头链表,2.指向问题。
既然就无头链表,必然是遍历方法时需要考虑其头节点本身问题,那么这样一来问题就容易发现,
先不管别人怎么写的,你的先明白人家哪有问题。
while (pNow)
  {
      pNow = pPre->pNext;
  }
顺着这思路,那么他这个可以这样写
while(pNow->next){
    pNow = pNow->next;
}
pNow->next = pNew;
若 他那样会是这样的结果:
pNow = pPre->pNext ;

(pPre->pNext)(*(0)) 那么 pNOw的地址 也应该是(*(0))
在赋值时就相当于你把0地址的指针指向了一个新地址,这个地址与原来想插入的地址没有丝毫关系,所以最终不报错,弄死结果也不正常

2017-07-29 09:31
快速回复:单向链表 尾部不能插入,请说明原因
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016642 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved