鱼C论坛

 找回密码
 立即注册
查看: 3402|回复: 6

关于创建动态链表,求改错

[复制链接]
发表于 2012-2-14 17:36:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. //函数声明
  5. struct Node * create_list(void);
  6. void traverse_list(struct Node * pHead);

  7. struct Node
  8. {
  9.       int data;
  10.       struct Node *pNext;
  11. };

  12. void main()
  13. {
  14.       struct Node * pHead = NULL;
  15.       
  16.       pHead = create_list();//功能:创建一个非循环单链表
  17.       traverse_list(pHead);
  18. }

  19. struct Node * create_list(void)
  20. {
  21.       int len;   //用来存放有效节点的个数
  22.       int i;
  23.       int val;  //用来临时存放用户输入的节点的值
  24.       
  25.       //分配了一个不存放有效数据的头结点
  26.       struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));

  27.       if(NULL == pHead)
  28.       {
  29.             printf("分配内存失败,程序终止!\n");
  30.             exit(-1);
  31.       }
  32.       struct Node * pTail = pHead;   
  33.       pTail->pNext = NULL;
  34.       
  35.       printf("请输入需要生成的链表节点的个数:len = ");
  36.       scanf("%d",&len);
  37.       
  38.       for (i=0; i<len; i++)
  39.       {
  40.             printf("请输入第%d个节点的值: ",i+1);
  41.             scanf("%d",&val);
  42.             
  43.             struct Node * pNew  = (struct Node *)malloc(sizeof(struct Node));
  44.             if(NULL == pNew)
  45.             {
  46.                   printf("分配内存失败,程序终止!\n");
  47.                   exit(-1);
  48.             }
  49.             pNew->data = val;
  50.             pTail->pNext = pNew;
  51.             pNew->pNext = NULL;
  52.             pTail = pNew;
  53.       }

  54.       return pHead;
  55. }

  56. void traverse_list(struct Node * pHead)
  57. {
  58.       struct Node * p = pHead->pNext;

  59.       while (NULL != p)
  60.       {
  61.             printf("%d ",p->data);
  62.             p = p->pNext;
  63.       }
  64.       printf("\n");
  65.       return;
  66. }
复制代码
贴上代码,求改错
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-14 22:24:52 | 显示全部楼层
本帖最后由 Tazy_ong 于 2012-2-15 13:23 编辑

运行没发现有什么错误啊,就不知道有没有BUG,没有仔细调试过,不过程序运行完后记得释放内存,不然会导致内存泄露。
  1. #include <stdio.h>
  2. //#include <malloc.h> //stdlib.h头文件中已包含malloc函数了
  3. #include <stdlib.h>

  4. //函数声明
  5. struct Node * create_list(void);
  6. void traverse_list(struct Node * pHead);

  7. struct Node
  8. {
  9.       int data;
  10.       struct Node *pNext;
  11. };

  12. void main()
  13. {
  14.       struct Node * pHead = NULL;
  15.       
  16.       pHead = create_list();//功能:创建一个非循环单链表
  17.       traverse_list(pHead);
  18. }

  19. struct Node * create_list(void)
  20. {
  21.       int len;   //用来存放有效节点的个数
  22.       int i;
  23.       int val;  //用来临时存放用户输入的节点的值
  24.       
  25.       //分配了一个不存放有效数据的头结点
  26.       struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));

  27.       if(NULL == pHead)
  28.       {
  29.             printf("分配内存失败,程序终止!\n");
  30.             exit(-1);
  31.       }
  32.       struct Node * pTail = pHead;   
  33.       pTail->pNext = NULL;
  34.           struct Node * pNew; //定义指针变量
  35.       
  36.       printf("请输入需要生成的链表节点的个数:len = ");
  37.       scanf("%d",&len);
  38.       
  39.       for (i=0; i<len; i++)
  40.       {
  41.             printf("请输入第%d个节点的值: ",i+1);
  42.             scanf("%d",&val);
  43.             
  44.             //struct Node * pNew  = (struct Node *)malloc(sizeof(struct Node)); //最好不要在for循环中定义变量
  45.                         pNew  = (struct Node *)malloc(sizeof(struct Node)); //创建动态内存空间
  46.             if(NULL == pNew)
  47.             {
  48.                   printf("分配内存失败,程序终止!\n");
  49.                   exit(-1);
  50.             }
  51.             pNew->data = val;
  52.             pTail->pNext = pNew;
  53.             pNew->pNext = NULL;
  54.             pTail = pNew;
  55.       }

  56.       return pHead;
  57. }

  58. void traverse_list(struct Node * pHead)
  59. {
  60.       struct Node * p = pHead->pNext;
  61.           struct Node *pToFree = p;

  62.       while (NULL != p)
  63.       {
  64.             printf("%d ",p->data);
  65.             p = p->pNext;
  66.                         free(pToFree); //记得释放动态内存空间,不然会导致内存泄露
  67.                         pToFree = p; //拷贝地址
  68.       }
  69.       printf("\n");
  70.           free(pHead); //释放内存空间
  71.       return;
  72. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-15 10:40:24 | 显示全部楼层

在vc++6.0当中,我用后缀名为.c,运行就出错,但是.cpp就不出错。。。这是什么原因呢?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 13:19:30 | 显示全部楼层
本帖最后由 Tazy_ong 于 2012-2-15 13:25 编辑
猫礼 发表于 2012-2-15 10:40
在vc++6.0当中,我用后缀名为.c,运行就出错,但是.cpp就不出错。。。这是什么原因呢?

我差点忘了这是 C语言,程序本身没有错,只是 C语言 没有那么智能化,和面向对象语言不同,C语言 的语法里强制限制所有要用的变量必须事先定义,不能在任何执行语句之后再定义,否则编译不会通过。
.c 是 C语言 的后缀,而 .cpp 是 C++ 的后缀,所以把后缀名改为 .cpp 机器会把它当做 C++ 来编译,而 C++ 的语法是允许在任何时候定义的,所有编译运行都会通过。改一下代码顺序就行了,代码如下:
  1. #include <stdio.h>
  2. //#include <malloc.h> //stdlib.h头文件中已包含malloc函数了
  3. #include <stdlib.h>

  4. struct Node *create_list(void);
  5. void traverse_list(struct Node *);

  6. struct Node
  7. {
  8.         int data;
  9.         struct Node *pNext;
  10. };

  11. int main(void)
  12. {
  13.         struct Node *pHead = NULL;
  14.         
  15.         pHead = create_list();
  16.         traverse_list(pHead);

  17.         return 0;
  18. }

  19. struct Node *create_list(void)
  20. {
  21.         int len;
  22.         int i;
  23.         int val;
  24.         struct Node *pHead = (struct Node *)malloc(sizeof(struct Node));
  25.         struct Node *pTail = pHead;   
  26.         struct Node *pNew; //定义指针变量

  27.         pTail->pNext = NULL; //全部定义完以后再使用

  28.         if(NULL == pHead)
  29.         {
  30.                 printf("分配内存失败,程序终止!\n");
  31.                 exit(-1);
  32.         }
  33.         
  34.         printf("请输入需要生成的链表节点的个数:len = ");
  35.         scanf("%d", &len);
  36.         
  37.         for (i=0; i<len; i++)
  38.         {
  39.                 printf("请输入第%d个节点的值: ", i+1);
  40.                 scanf("%d", &val);
  41.                
  42.                 //struct Node * pNew  = (struct Node *)malloc(sizeof(struct Node)); //最好不要在for循环中定义变量
  43.                 pNew  = (struct Node *)malloc(sizeof(struct Node));

  44.                 if(NULL == pNew)
  45.                 {
  46.                         printf("分配内存失败,程序终止!\n");
  47.                         exit(-1);
  48.                 }

  49.                 pNew->data = val;
  50.                 pTail->pNext = pNew;
  51.                 pNew->pNext = NULL;
  52.                 pTail = pNew;
  53.         }
  54.         
  55.         return pHead;
  56. }

  57. void traverse_list(struct Node * pHead)
  58. {
  59.         struct Node *p = pHead->pNext;
  60.         struct Node *pToFree = p;
  61.         
  62.         while (NULL != p)
  63.         {
  64.                 printf("%d ", p->data);
  65.                 p = p->pNext;
  66.                 free(pToFree); //记得释放动态内存空间,不然会导致内存泄露
  67.                 pToFree = p; //拷贝地址
  68.         }

  69.         printf("\n");
  70.         free(pHead); //释放内存空间

  71.         return;
  72. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-15 16:19:56 | 显示全部楼层
Tazy_ong 发表于 2012-2-15 13:19
我差点忘了这是 C语言,程序本身没有错,只是 C语言 没有那么智能化,和面向对象语言不同,C语言 的语法里 ...

非常感谢,因为我再看数据结构培训的时候,老师直接用C++编译的,我忽略了C语言的语法,这次记清楚了,非常感谢
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 16:39:04 | 显示全部楼层
哈,应该是 郝斌老师的数据结构 吧?  我也正在看。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 16:40:14 | 显示全部楼层
猫礼 发表于 2012-2-15 16:19
非常感谢,因为我再看数据结构培训的时候,老师直接用C++编译的,我忽略了C语言的语法,这次记清楚了,非 ...

不客气!大家一起互相学习,一起解决问题挺好的!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-11 08:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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