C语言,链表中遇到棘手问题

/*

2014年8月10日15:20:06

单链表

*/

# include

# include

typedef struct Node

{

int data;

struct Node * pNext;

}NODE, * PNODE;

PNODE Createlist(void);

void Traverse(PNODE);

int length_list(PNODE);

int main(void)

{

int len;

PNODE pHead;

pHead = Createlist();

Traverse(pHead);

len = length_list(pHead);

printf("链表的长度为:%d", len);

return 0;

}

PNODE Createlist(void)

{

int len;

int val;

PNODE pHead = (PNODE)malloc(sizeof(NODE));

if (pHead == NULL)

{

printf("动态内存分配失败!");

exit(-1);

}

PNODE pTail = pHead;

pTail->pNext = NULL;

printf("请输入要创建的节点个数:___\b\b\b");

scanf("%d", &len);

for (int i=0; i

{

printf("请输入第%d个节点的值:",i+1);

scanf("%d", &val);

PNODE pNew = (PNODE)malloc(sizeof(NODE));

if (NULL == pNew)

{

printf("动态内存分配失败!");

exit(-1);

}

pNew->data = val;

pTail->pNext = pNew;

pNew->pNext = NULL;

pTail = pNew;

}

return pHead;

}

void Traverse(PNODE pHead)

{

while (pHead->pNext != NULL)

{

printf("%d ", pHead->pNext->data);

pHead->pNext = pHead->pNext->pNext;

}

return;

}

int length_list(PNODE pHead)

{

int i = 0;

PNODE p = pHead->pNext;

while (p != NULL)

{

i = i + 1;

p = p->pNext;

}

return i;

}

这是一个链表程序,其中:void Traverse(PNODE pHead)

{

while (pHead->pNext != NULL)

{

printf("%d ", pHead->pNext->data);

pHead->pNext = pHead->pNext->pNext;

}

return;

}这段程序会导致函数length_list()出错。

当把Traverse函数程序改为:void traverse_list(PNODE pHead)

{

PNODE p = pHead->pNext;

while (NULL != p)

{

printf("%d ", p->data);

p = p->pNext;

}

return;

},这样的话,length_list()函数就能够给出正确的答案。

那么为什么用 pHead->pNext不行,而需要再定义一个指针变量p来存储pHead->pNext?

我在别的程序上也曾遇到过这样的问题。觉得不能再忽略了

------解决方案--------------------

遍历不应该改变链表,而你在Traverse遍历的时候改变了链表头的指向,也就是这句:

pHead->pNext = pHead->pNext->pNext;

循环结束了以后,pHead的pNext等于NULL了,链表变成了空链表。

再定义一个指针变量p来存储pHead->pNext,这样就不会改变main函数里的pHead,也就不会改变链表。

你可以将Traverse()和length_list()换个位置,先求长度再遍历:

len = length_list(pHead);

Traverse(pHead);

这样结果就正确了,证明你在Traverse时将链表变为了空链表。。。

------解决方案--------------------

phead虽然是值传递,但对它的->操作却是实在的指针操作,改变的是实际内存的地址

void Traverse(PNODE pHead)

{

while (pHead->pNext != NULL)

{

printf("%d ", pHead->pNext->data);

pHead = pHead->pNext;//把代码改成这样看看,改变phead的值可以,但改变phead->指向的值会有问题。

}

return;

}

------解决方案--------------------

链表代码示例

http://pan.baidu.com/s/17yIcQ

在c语言中利用链表常见问题,C语言,链表中遇到棘手有关问题相关推荐

  1. python怎么打开h5文件_python中利用h5py模块读取h5文件中的主键方法

    如下所示: import h5py import numpy as np #HDF5的写入: imgData = np.zeros((2,4)) f = h5py.File('HDF5_FILE.h5 ...

  2. 在教学中利用计算机软件,计算机软件在数学教学中的应用

    计算机软件在数学教学中的应用 职业教育是一种专业性较强的学业教育,它与自然环境和社会活动密不可分.因此,如何将教学与实践有机结合成为了教育 (本文共2页) 阅读全文>> 在高职数学教学中引 ...

  3. jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy

    jax-rs jax-ws 在以前的文章中,我演示了如何将EclipseLink JAXB(MOXy)直接集成到WebLogic(从12.1.1开始)和GlassFish(从3.1.2开始)的JAX- ...

  4. 通过JAX-WS Provider在Web服务中利用MOXy

    在先前的文章中,我演示了如何将EclipseLink JAXB(MOXy)直接集成到WebLogic(从12.1.1开始)和GlassFish(从3.1.2开始)的JAX-WS实现中 . 在本文中,我 ...

  5. 在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数

    在做研究的时候我们经常需要对模型的参数就行相应的选择,然而有没有觉得每次更改一个参数都需要运行一次仿真程序觉得很无聊呀,运行完程序还要看效果怎么样,然后再根据效果来调整参数,再次运行程序,如此反复. ...

  6. C语言中的结构体,联合,链表和枚举,位域(上)

    结构名只能表示一个结构形式, 编译系统并不对它分配内存空间. 只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间. 一.结构的定义 定义一个结构的一般形式为: struct 结构名 { 成员 ...

  7. 如何将计算思维融合到C语言程序设计中,利用案例融合计算思维与C语言教学

    摘 要: C语言程序设计的教学目标是使学生利用C语言结合算法解决简单的实际问题.要实现该目标不仅要熟练掌握C语言本身的基本语法和结构,还要具备设计合理算法的思维能力.然而,当前各高校课程教学往往忽略思 ...

  8. IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程

    IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程 目录 第一步,先安装python环境 第二步,加载本地已有的python 第一步,先安装python环境

  9. IDE之VS:利用 Visual Studio中的IDE配置C++语言进行编程

    IDE之VS:利用 Visual Studio中的IDE配置C++语言进行编程 目录 C++编译器之VS2015 1.新建项目,VisualC++,空项目,确定 2.右键项目文件夹,添加,新建 3.添 ...

最新文章

  1. CAS 4.0.0RC 配置MD5验证功能
  2. 步步为营-68-asp.net简单练习(get set)
  3. java获取文件夹下所有文件的名称
  4. cudnn7.6.5下载 solitairetheme8_.NET Framework 3.5 开启方法及微软官方原版下载
  5. CVPR 2017 CA:《Context-Aware Correlation Filter Tracking》论文笔记
  6. 四、pink老师的学习笔记——元素的显示与隐藏
  7. 1111 复习 形状的打印
  8. [HTTP] HTTP是什么
  9. 富士通大数据架构解决方案闪耀存储峰会
  10. Redis(八):Redis的复制(Master/Slave)
  11. 小米手机MIUI刷机教程(小米6等)
  12. macOS sierra 10.12 CORE Keygen系列注册机修复工具 CORE Patcher
  13. ppt制作弹跳的小球动画效果_你不能错过的PPT制作酷炫弹跳的小球教程
  14. 智慧公厕擦手纸洗手液余量实时在线统计
  15. 6大论坛,30+技术干货议题,2022首届阿里巴巴开源开放周来了!
  16. Fone Monkey的配置
  17. poj 3686 The Windy's( KM算法 )
  18. RuntimeError: stack expects each tensor to be equal size, but got [8] at entry 0 and [2] at entry 2
  19. 7-19 评委打分 (15 分)
  20. linux系统命令-查看内存使用情况

热门文章

  1. 修改am335x 制作android sd启动卡的bug
  2. [HDU]1723Distribute Message
  3. 算法高级(4)-遗传算法(Genetic Algorithm)简介
  4. MySQL内核调试_内核调试技巧
  5. 计算机组成 交换的目的,计算机组成原理试卷.docx
  6. opencv图片分类+特征图片截取
  7. Linux 权限管理之基本权限
  8. 蓝牙技术联盟宣布开放蓝牙网关架构 IoT设备无须Wi-Fi即可联网
  9. unique-substrings-in-wraparound-string(好)
  10. 解决openfire在使用MySQL数据库后的中文乱码问题(转)