QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

鱼友Ⅱ

Rank: 3

积分
282
查看: 4429|回复: 72

[技术交流] 我的链表学习笔记

  [复制链接]
最佳答案
0 
累计签到:113 天
连续签到:0 天
yiye3376 发表于 2013-6-19 12:11:19 442972 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 yiye3376 于 2013-6-19 12:18 编辑

        这几天开始学习链表,写一个学习笔记算是对自己这几天的学习做个概括总结吧,毕竟学习是需要一个反思的过程的,这样有利于下面的学习。
        函数不多就创建链表,获得链表长度(好吧,没看概念,不知道链表是说个数还是长度:P) ,插入数据,删除数据,遍历输出链表数据,在群里面大神们的建议批评下,前后修改了好几次,算是能入各位法眼了。非常感谢他们!!
        我在cpp文件写的,要是在c文件下写,请在前面定义好变量,再在下面使用变量。
      
      一开始先创立一个最简单的链表结构
  1. typedef struct Node    //未修改版本
  2. {
  3.         int data;
  4.         struct Node *pNext;
  5.         
  6. }Node,*pNode;
复制代码
      然后创立链表
  1. pNode create_list()    //未修改版本
  2. {
  3.         int num,val;
复制代码
      下面就是获得链表个数函数,一开始我用遍历链表得到链表个数的,但是大神们说要是链表个数1000个,1w个以上呢,你遍历得花多久呢,还有你的变量名得有意义,变量名相当于一个小注释,不要用无意义的变量名,循环中用i,j,k可以,其他的变量名起的要求意义,然后我修改了我一开始的链表结构,添加了一个变量保存链表个数,也将所有函数中的变量名修改了一些,让人更容易理解
  1. typedef struct Node
  2. {
  3.         int data;
  4.         struct Node *pNext;
  5.         int count;            //记录是共有几个链表
  6. }Node,*pNode;
复制代码
    那下面创立链表函数就得将链表个数保存到pHead->count中了
  1. pNode create_list()
  2. {
  3.         int listnum,val;
  4.         
  5.         pNode pNew;        
  6.         pNode pTail;   //尾节点
  7.         
  8.         pNode pHead = (pNode)malloc(sizeof(Node));
  9.         if (!pHead)
  10.         {
  11.                 printf("分配内存失败,程序中止!");
  12.                 exit (-1);
  13.         }
  14.         pTail = pHead;
  15.         pTail->pNext= NULL;
  16.         
  17.         printf("请输入你需要生成链表节点的个数:listnum=");
  18.         scanf("%d",&listnum);
  19.         
  20.         for (int count_i=0; count_i<listnum; count_i++)  //这边定义变量,代表最后用它作为链表的个数
  21.         {
  22.                
  23.                 printf("请输入第%d个节点的值",count_i+1);
  24.                 scanf("%d",&val);
  25.                
  26.                 pNew = (pNode)malloc(sizeof(Node));
  27.                 if (!pNew)
  28.                 {
  29.                         printf("分配内存失败,程序中止!");
  30.                         exit(-1);        
  31.                 }
  32.                 pNew->data = val;
  33.                 pNew->pNext = NULL;
  34.                
  35.                 pTail->pNext = pNew;
  36.                 pTail = pNew;
  37.         }
  38.         pHead->count = count_i;     //存入链表数量
  39.         
  40.         return pHead;
  41.         
  42. }
复制代码
  链表是否为空和链表个数函数
  1. bool is_empty(pNode pHead)
  2. {
  3.         if (!(pHead->pNext))
  4.         {
  5.                 printf("链表为空!");
  6.                 return false;
  7.         }
  8.         return true;
  9. }

  10. int get_list_num(pNode pHead)      //不需要遍历直接得出链表个数,其实我这个函数感觉有点多余了,懒得删了,                     
  11. {                                                    //就放在上面了
  12.         return (pHead->count);        
  13. }
复制代码



下面就是插入元素到链表中。在函数中最好插入检差参数是否合法的检测,保证参数的正确性
  1. bool insert_list(pNode pHead,int val, int position)   //插入position之前
  2. {
  3.         pNode p = pHead;
  4.         int front_pos=0;     
  5.         
  6.         if ((position<1) || (NULL == p))  //先检测参数的正确性
  7.         {
  8.                 return false;
  9.         }
  10.         
  11.         
  12.         while ((NULL != p) && (front_pos < position-1))   //定位插入位置,遍历到插入位置前面的链表上
  13.         {
  14.                 p = p->pNext;
  15.                 front_pos++;
  16.         }
  17.         
  18.         if ((front_pos>position-1) || !p)
  19.         {
  20.                 return false;
  21.         }
  22.         
  23.         pNode pNew = (pNode)malloc(sizeof(Node));
  24.         if (!pNew)
  25.         {
  26.                 printf("分配内存失败!");
  27.                 exit(-1);
  28.         }
  29.         pNew->data = val;
  30.         pNew->pNext = p->pNext;
  31.         p->pNext = pNew;
  32.         pHead->count +=1;                     //插入一个链表,所以链表个数+1
  33.         printf("一共有%d个链表\n",pHead->count);
  34.         
  35.         return true;
  36. }
复制代码
删除元素函数
  1. bool delete_list(pNode pHead,int position)
  2. {
  3.         if ((!pHead) || (position<1))
  4.         {
  5.                 return false;
  6.         }
  7.         
  8.         pNode p = pHead;
  9.         int front_pos = 0;
  10.         while((NULL != p)&& (front_pos<position-1))  //遍历到指定位置前一个链表上
  11.         {
  12.                 p = p->pNext;
  13.                 front_pos++;
  14.                
  15.         }
  16.         if ((front_pos>position-1) || !p)
  17.         {
  18.                 return false;
  19.         }
  20.         
  21.         pNode free_p = p->pNext;      
  22.         p->pNext = free_p->pNext;
  23.         free(free_p);
  24.         pHead->count -=1;
  25.         printf("一共有%d个\n",pHead->count);

  26.         return true;
  27. }
复制代码
就搞了这几个函数,链表还有什么操作我不知道了,抱歉
未命名.jpg

下面是源文件
游客,如果您要查看本帖隐藏内容请回复


写链表总感觉很晕, 逻辑总是感觉很乱,运行出错,然后又慢慢找错误,改了几次,发现我的问题了,p->next指的是下一个链表,而我思维惯性,看到p总以为是p这个链表,所以写程序之前,先搞清楚逻辑,思路,而不是先写,错了再改,这样会让人陷入痛苦之中。




上面的函数我都测试了好几遍,没发现什么问题,要是有问题,或者有更好的写法,请麻烦告之,谢谢


楼层
跳转到指定楼层
最佳答案
0 
累计签到:73 天
连续签到:1 天
一站幸福 发表于 2013-6-19 12:45:55 | 显示全部楼层
淡定,淡定,淡定……
最佳答案
0 
累计签到:73 天
连续签到:1 天
一站幸福 发表于 2013-6-19 12:47:48 | 显示全部楼层
淡定,淡定,淡定……
最佳答案
0 
累计签到:716 天
连续签到:1 天
a02zz 发表于 2013-6-19 12:53:41 | 显示全部楼层
来看看是什么样子的
最佳答案
0 
累计签到:149 天
连续签到:0 天
QQ还没找回来 发表于 2013-6-23 22:22:20 | 显示全部楼层
嗯,不错的总结
最佳答案
0 
累计签到:4 天
连续签到:0 天
篱笆外的小孩儿 发表于 2013-6-24 13:07:20 | 显示全部楼层
带着好奇心,过来一看{:1_1:}
最佳答案
0 
累计签到:276 天
连续签到:0 天
11年__那些事儿 发表于 2013-6-24 14:41:07 | 显示全部楼层
支持学数据结构!
最佳答案
0 
累计签到:270 天
连续签到:1 天
Crazy迷恋. 发表于 2013-6-24 14:53:28 | 显示全部楼层
学的有点头大
最佳答案
0 
累计签到:7 天
连续签到:0 天
在茫茫人海中静 发表于 2013-6-24 15:18:36 | 显示全部楼层
前辈多谢了!
   
最佳答案
0 
累计签到:42 天
连续签到:0 天
i`ABC~ 发表于 2013-6-28 11:53:25 | 显示全部楼层
:o:o:o:o:o:o:o:o表示惊讶,我何时到达这地步
最佳答案
0 
累计签到:32 天
连续签到:1 天
wulongxiang2009 发表于 2013-6-30 06:34:34 | 显示全部楼层
淡定淡定,能写出来就是进步
最佳答案
0 
累计签到:67 天
连续签到:1 天
喵星人 发表于 2013-6-30 08:01:51 | 显示全部楼层
带着好奇心,过来一看{:1_1:}
最佳答案
0 
累计签到:12 天
连续签到:0 天
Cocol 发表于 2013-6-30 14:50:11 | 显示全部楼层
我就是过来看看的
最佳答案
0 
累计签到:11 天
连续签到:0 天
我挖 发表于 2013-6-30 16:16:40 | 显示全部楼层
谢谢楼主分享
最佳答案
0 
累计签到:10 天
连续签到:0 天
coko 发表于 2013-6-30 18:42:45 | 显示全部楼层
学习了,谢谢楼主
最佳答案
0 
累计签到:64 天
连续签到:1 天
over_ag 发表于 2013-6-30 19:15:35 | 显示全部楼层
支持个:victory:
最佳答案
0 
累计签到:19 天
连续签到:1 天
/mg风之雪 发表于 2013-6-30 20:24:55 | 显示全部楼层
谢谢分享,收藏了
最佳答案
0 
累计签到:7 天
连续签到:0 天
fishmo 发表于 2013-6-30 21:09:16 | 显示全部楼层
只想顶。。。。。。
最佳答案
0 
累计签到:35 天
连续签到:0 天
qq342909729 发表于 2013-7-2 17:56:49 | 显示全部楼层
学习下!;P:lol
最佳答案
0 
累计签到:64 天
连续签到:1 天
monk-half 发表于 2013-7-8 15:26:15 | 显示全部楼层
回复看看源文件

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /3 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-22 15:39

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