免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2443 | 回复: 4
打印 上一主题 下一主题

简单的数据结构,线性链表题.求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-26 17:08 |只看该作者 |倒序浏览
遇到了一个问题..求大侠指点一下.

目的: 建立一个链表,存储 1-20 数字..然后把它们打印出来.
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. #define MAXLIST 20

  4. struct  node
  5. {
  6.         int data;
  7.         struct node *next;
  8. };

  9. //线性表的初始化
  10. //顺序表
  11. i
  12. int PInitList(void)
  13. {
  14.         struct node  *head = NULL;
  15.         struct node  *p = NULL, *q = NULL;
  16.         int i = 0;
  17.         head = (struct node *)malloc(sizeof(struct node));

  18.         head->next = NULL;
  19.         head->data = 100;
  20.        
  21.         q = head;
  22.         printf("%d line,\n head addr : %p , %p ,%d\n",__LINE__, &head, &(head->next), head->data);       
  23.         printf("q addr %p\n",&q);
  24.         printf("p addr %p\n",&p);
  25.        
  26.         if (head == NULL)
  27.         {
  28.                 printf("malloc error!\n");
  29.         }
  30.         else
  31.         {
  32.                 printf("malloc ok!\n");
  33.                
  34.                 for (i = 0; i < 20; i++)
  35.                 {
  36.                         p = (struct node *)malloc(sizeof(struct node));
  37.                         if (p != NULL)
  38.                         {
  39.                                 p->data = i;
  40.                                 p->next = head->next;
  41.                                 head->next = p;                       
  42.                         }
  43.                         printf("i %d p addr %p %d\n",i, &(p->next), p->data);
  44.                 }
  45.         }
  46.                 int j = 0;
  47.         for (j = 0; j < 21; j++)
  48.                 {
  49.                                
  50.                         printf("head addr : %p , num %d %d\n",&(head->next), j, head->data);
  51.                         head = head->next;                       
  52.                                
  53.                 }
  54.        
  55.                
  56.         return 0;
  57. }


  58. int main(void)
  59. {
  60.         PInitList();

  61.         return 0;
  62. }
复制代码
打印的结果是:

39 line,
head addr : 0xbfb0e72c , 0x804a00c ,100
q addr 0xbfb0e724
p addr 0xbfb0e728
malloc ok!
i 0 p addr 0x804a01c 0
i 1 p addr 0x804a02c 1
i 2 p addr 0x804a03c 2
i 3 p addr 0x804a04c 3
i 4 p addr 0x804a05c 4
i 5 p addr 0x804a06c 5
i 6 p addr 0x804a07c 6
i 7 p addr 0x804a08c 7
i 8 p addr 0x804a09c 8
i 9 p addr 0x804a0ac 9
i 10 p addr 0x804a0bc 10
i 11 p addr 0x804a0cc 11
i 12 p addr 0x804a0dc 12
i 13 p addr 0x804a0ec 13
i 14 p addr 0x804a0fc 14
i 15 p addr 0x804a10c 15
i 16 p addr 0x804a11c 16
i 17 p addr 0x804a12c 17
i 18 p addr 0x804a13c 18
i 19 p addr 0x804a14c 19
head addr : 0x804a00c , num 0 100
head addr : 0x804a14c , num 1 19
head addr : 0x804a13c , num 2 18
head addr : 0x804a12c , num 3 17
head addr : 0x804a11c , num 4 16
head addr : 0x804a10c , num 5 15
head addr : 0x804a0fc , num 6 14
head addr : 0x804a0ec , num 7 13
head addr : 0x804a0dc , num 8 12
head addr : 0x804a0cc , num 9 11
head addr : 0x804a0bc , num 10 10
head addr : 0x804a0ac , num 11 9
head addr : 0x804a09c , num 12 8
head addr : 0x804a08c , num 13 7
head addr : 0x804a07c , num 14 6
head addr : 0x804a06c , num 15 5
head addr : 0x804a05c , num 16 4
head addr : 0x804a04c , num 17 3
head addr : 0x804a03c , num 18 2
head addr : 0x804a02c , num 19 1
head addr : 0x804a01c , num 20 0


现在问题是:
打印出来的是结果是倒序的:
而我希望是打印出来的.是0-20...

还请大侠指点一下..谢谢~~

论坛徽章:
0
2 [报告]
发表于 2011-10-26 17:51 |只看该作者
好了..问题找到了..
把41--45行
  1. if (p != NULL)
  2.                         {
  3.                                 p->data = i;
  4.                                 p->next = head->next;
  5.                                 head->next = p;                        
  6.                         }
复制代码
这里把后一个结点的next指针指到了前一个结点上去去了,
所以这里建立了一个倒序的链表。

如果把这几句改成
  1. if (p != NULL)
  2.                         {
  3.                                 p->data = i;
  4.                                 p->next = head->next;
  5.                                 head->next = p;  
  6.                                 head = head->next;
  7.                         }
复制代码
就行了。。它就把一个倒序的链表改成了一个正顺的了。。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2011-10-26 18:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2011-10-26 19:09 |只看该作者
回复 3# pmerofc


    抱歉。。那个,是手误。。

论坛徽章:
0
5 [报告]
发表于 2011-12-29 12:56 |只看该作者
下去看看,慢慢来:wink::wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP