鱼C论坛

 找回密码
 立即注册
查看: 14869|回复: 72

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

  [复制链接]
发表于 2013-6-19 12:11:19 | 显示全部楼层 |阅读模式

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

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

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

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

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


下面就是插入元素到链表中。在函数中最好插入检差参数是否合法的检测,保证参数的正确性
bool insert_list(pNode pHead,int val, int position)   //插入position之前
{
        pNode p = pHead;
        int front_pos=0;     
        
        if ((position<1) || (NULL == p))  //先检测参数的正确性
        {
                return false;
        }
        
        
        while ((NULL != p) && (front_pos < position-1))   //定位插入位置,遍历到插入位置前面的链表上
        {
                p = p->pNext;
                front_pos++;
        }
        
        if ((front_pos>position-1) || !p)
        {
                return false;
        }
        
        pNode pNew = (pNode)malloc(sizeof(Node));
        if (!pNew)
        {
                printf("分配内存失败!");
                exit(-1);
        }
        pNew->data = val;
        pNew->pNext = p->pNext;
        p->pNext = pNew;
        pHead->count +=1;                     //插入一个链表,所以链表个数+1
        printf("一共有%d个链表\n",pHead->count);
        
        return true;
}
删除元素函数
bool delete_list(pNode pHead,int position)
{
        if ((!pHead) || (position<1))
        {
                return false;
        }
        
        pNode p = pHead;
        int front_pos = 0;
        while((NULL != p)&& (front_pos<position-1))  //遍历到指定位置前一个链表上
        {
                p = p->pNext;
                front_pos++;
                
        }
        if ((front_pos>position-1) || !p)
        {
                return false;
        }
        
        pNode free_p = p->pNext;      
        p->pNext = free_p->pNext;
        free(free_p);
        pHead->count -=1;
        printf("一共有%d个\n",pHead->count);

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

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


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




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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-19 12:45:55 | 显示全部楼层
淡定,淡定,淡定……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-19 12:47:48 | 显示全部楼层
淡定,淡定,淡定……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-19 12:53:41 | 显示全部楼层
来看看是什么样子的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-23 22:22:20 | 显示全部楼层
嗯,不错的总结
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-24 13:07:20 | 显示全部楼层
带着好奇心,过来一看{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-24 14:41:07 | 显示全部楼层
支持学数据结构!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-24 14:53:28 | 显示全部楼层
学的有点头大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-24 15:18:36 | 显示全部楼层
前辈多谢了!
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-28 11:53:25 | 显示全部楼层
:o:o:o:o:o:o:o:o表示惊讶,我何时到达这地步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 06:34:34 | 显示全部楼层
淡定淡定,能写出来就是进步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 08:01:51 | 显示全部楼层
带着好奇心,过来一看{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 14:50:11 | 显示全部楼层
我就是过来看看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 16:16:40 | 显示全部楼层
谢谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 18:42:45 | 显示全部楼层
学习了,谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 19:15:35 | 显示全部楼层
支持个:victory:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 20:24:55 | 显示全部楼层
谢谢分享,收藏了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 21:09:16 | 显示全部楼层
只想顶。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-2 17:56:49 | 显示全部楼层
学习下!;P:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-8 15:26:15 | 显示全部楼层
回复看看源文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 08:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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