注册 登录
编程论坛 C语言论坛

单向链表 尾部不能插入,请说明原因

jianghong_02 发布于 2017-07-26 23:44, 1399 次点击
// 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;
}

4 回复
#2
renkejun19422017-07-27 06:40
能把一个尾部插入写的这么拖沓啰嗦也是本事。

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


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

差不多就是这样。
#3
jianghong_022017-07-27 06:51
回复 楼主 jianghong_02
话说之前请先理解:
1.我问的是为什么(即不是知其然,而要知其所以然),不是说怎么写。
2.我哪句话说了这是我写的
#4
九转星河2017-07-27 09:23
如果要尾部插入的话加个尾指针像队列一样或许可以方便很多~
#5
jianghong_022017-07-29 09:31
回复 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地址的指针指向了一个新地址,这个地址与原来想插入的地址没有丝毫关系,所以最终不报错,弄死结果也不正常

1