使用战舰开发板+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
", cur->value);
printf("i = %d
", 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)指向的是头节点,头结点数据是无效的啊,应该是不需要打印的啊.
恳请大神指教...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
list_traverse(header)这里传入的是指针变量的值,即传入的是首节点地址,则cur=hdr->next->next就是第二个有效节点了,通过仿真的数据可能看的比较清楚。
此外有个问题估计楼主已经解决了,可能还没有更新帖子中的代码,就是初始化首节点的时候,没有把next设置为NULL,这样会造成异常。
经常蒙受大神指教,不胜感激...
是的,问题解决了.
我当时是对"头指针指向头节点"没有理解清楚.
假设头指针是header,头节点是first(它们都是list_t *类型)
我认为header->first才是指向,而其实是header=first.是概念没有理解清楚
在此感谢大神...
一周热门 更多>