单链表的算法之插入节点

1.访问链表中各个自己的指针
(1)只能用头指针,不能用各个节点自己的指针。因为实际中我们保存链表不会保存各个节点的指针,只能通过头指针来访问链表节点。
(2)前一个节点内部的pNext指针能帮助我们找到下一个节点。

2.将创建节点的代码封装成一个函数
(1)封装时的关键点就是函数的接口(函数参数和返回值)的设计

3.从链表尾部插入新节点

#include <stdio.h>//构建一个链表的节点
struct node
{int data;        //有效数据struct node* pNext;  //指向下一个节点的指针
};//创建一个链表的节点
//返回值:指针,指针指向我们本函数新创建的节点的首地址
struct node* creat_node(int data)
{struct node* pHeader = NULL;//每创建一个新的节点,把这个新的节点和它前一个节点关联起来//创建一个链表节点struct node* p = (struct node*)malloc(sizeof(struct node));if(NULL == p){printf("malloc failure\n");return NULL;}memset(p, 0, sizeof(struct node));//bzero(p, sizeof(struct node));p->data = data;p->pNext = NULL;  //将来要指向下一个节点的首地址,实际操作时将下一个节点malloc返回的指针赋值给它return p;
}//尾部插入
void insert_tail(struct node* pH, struct node* new)
{//分两步完成插入//第一步,先找到链表中最后一个节点struct node* p = pH;while(NULL != p->pNext){p = p->pNext;}//第二部,将新节点插入到最后一个节点尾部p->pNext = new;
}int main()
{//头指针//struct node* pHeader = NULL;struct node* pHeader = creat_node(1);insert_tail(pHeader, creat_node(2));insert_tail(pHeader, creat_node(3));insert_tail(pHeader, creat_node(4));/*pHeader = creat_node(1);pHeader->pNext = creat_node(2);pHeader->pNext->pNext = creat_node(3);*///访问链表中的各个节点的有效数据,这个访问必须注意不能使用p,p2,p3,只能使用pHeader//访问链表的第一个有效数据printf("node1 data: %d\n", pHeader->data); //pHeader->data == p->data//访问链表的第二个有效数据printf("node2 data: %d\n", pHeader->pNext->data); //pHeader->data == p->data//访问链表的第一个有效数据printf("node3 data: %d\n", pHeader->pNext->pNext->data); //pHeader->data == p->dataprintf("node3 data: %d\n", pHeader->pNext->pNext->pNext->data); //pHeader->data == p->datareturn 0;
}

4.什么是头结点
(1)链表还有另外一种用法,就是把头指针指向的第一个节点作为头节点使用。头节点的特点是:第一,它紧跟在头指针后面。第二,头节点的数据部分是空的(有时候不是空的,而是存储整个链表的节点数),指针部分指向下一个节点,也就是第一个节点。
(2)这样看来,头节点确实和其他节点不同。我们在创建一个链表时添加节点的方法也不同。头节点在创建头指针时一并创建并且和头指针关联起来;后面的真正的存储数据的节点用节点添加的函数来完成,譬如insert_tail.
(3)链表有没有头节点是不同的。体现在链表的插入节点、删除节点、遍历节点、解析链表的各个算法函数都不同。所以如果一个链表设计的时候就有头节点那么后面的所有算法都应该这样来处理;如果设计时就没有头节点,那么后面的所有算法都应该按照没有头节点来做。实际编程中两种链表都有人用,所以大家在看别人写的代码时一定要注意看它有没有头节点。

#include <stdio.h>//构建一个链表的节点
struct node
{int data;        //有效数据struct node* pNext;  //指向下一个节点的指针
};//创建一个链表的节点
//返回值:指针,指针指向我们本函数新创建的节点的首地址
struct node* creat_node(int data)
{struct node* pHeader = NULL;//每创建一个新的节点,把这个新的节点和它前一个节点关联起来//创建一个链表节点struct node* p = (struct node*)malloc(sizeof(struct node));if(NULL == p){printf("malloc failure\n");return NULL;}memset(p, 0, sizeof(struct node));//bzero(p, sizeof(struct node));p->data = data;p->pNext = NULL;  //将来要指向下一个节点的首地址,实际操作时将下一个节点malloc返回的指针赋值给它return p;
}//尾部插入
//计算添加了新的节点后总共有多少个节点,然后把这个数写进节点中
void insert_tail(struct node* pH, struct node* new)
{int count = 0;//分两步完成插入//第一步,先找到链表中最后一个节点struct node* p = pH;while(NULL != p->pNext)  //由头指针向后便利,走到最后一个节点{p = p->pNext;count++;}//第二部,将新节点插入到最后一个节点尾部p->pNext = new;  //新节点成为最后一个节点pH->data = count + 1;
}int main()
{//头指针//struct node* pHeader = NULL;struct node* pHeader = creat_node(0);insert_tail(pHeader, creat_node(1));insert_tail(pHeader, creat_node(2));insert_tail(pHeader, creat_node(3));/*pHeader = creat_node(1);pHeader->pNext = creat_node(2);pHeader->pNext->pNext = creat_node(3);*///访问链表中的各个节点的有效数据,这个访问必须注意不能使用p,p2,p3,只能使用pHeader//访问链表的头结点有效数据printf("beader data: %d\n", pHeader->data); //pHeader->data == p->data//访问链表的第1个有效数据printf("node2 data: %d\n", pHeader->pNext->data); //pHeader->data == p->data//访问链表的第2个有效数据printf("node3 data: %d\n", pHeader->pNext->pNext->data); //pHeader->data == p->data//访问链表的第3个有效数据printf("node3 data: %d\n", pHeader->pNext->pNext->pNext->data); //pHeader->data == p->datareturn 0;
}

单链表的算法之尾部插入节点相关推荐

  1. 经典算法题 -- 判断单链表是否成环及寻找成环节点

    引言 判断单链表是否成环是一个计算机领域的经典算法问题 如何通过程序判断传入的链表是否存在环,并且求出环长度.成环点等问题 下面就是一个存在环的单链表 基本算法 -- hash 最简单的方法是创建一个 ...

  2. python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

    本文实例讲述了Python实现数据结构线性链表(单链表)算法.分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码. #!/usr/bin ...

  3. python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

    题目 实现一个函数,一个可以删除单链表中倒数第k个节点 难度 简单 分析 本题比较简单,实现方法多种多样,这里提供一种方法 首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个 ...

  4. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  5. 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...

  6. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

    在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...

  7. 尾插法建立单链表的算法

    尾插法建立单链表的算法 实现代码: #include <iostream> #include <stdlib.h> using namespace std; #define m ...

  8. 在单链表中删除指定值的节点。

    在单链表中删除指定值的节点. 题目:给定一个链表的头节点head和一个整数num,请实现函数将值为num的节点全部删除. 例如1->2->3->4->4->null,输出 ...

  9. 【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876

    [链表] 一.单链表的倒数第 k 个节点: ✔ 要求:只遍历一遍,链表有多长未知 LeetCode19 链接: 19.删除链表的倒数第N个结点 题目: 思路: 因为没有给头结点,我们就先定义一个哑结点 ...

最新文章

  1. 初始Java DVD项目
  2. sql语句求上四分位数_SAS和R中,非常规分位数的计算方法
  3. 湖北民族学院c语言试卷,C实验参考答案(湖北民族学院计算机c语言课后习题答案).doc...
  4. 【mysql】使用tpcc-mysql进行压力测试
  5. Gradle 之 Android 中的应用
  6. Pycharm使用详解
  7. cursor_sharing='SIMILAR'将被废弃
  8. Eclipse中的Github Gists
  9. python重复输入上面指令_stdin stdout python:如何重复使用同一输入文...
  10. 怎么更改苹果账户名称_番茄todo小组件背景怎么改 苹果番茄todo小组件背景更改方法介绍...
  11. python asyncio_如何使用Python中的asyncio?
  12. CloudPaster日志
  13. 女生做一个“程序猿”,真有那么不现实吗?正在学编程的女孩子注意了!
  14. javascript Blob
  15. yii 定义controller model
  16. 力扣题目——429. N 叉树的层序遍历
  17. TYVJ1467 通往聚会的道路
  18. 设计模式(四)行为型模式
  19. C++deque双端队列
  20. 成品app直播源码,Android自屏幕底部滑出更多面板的实现

热门文章

  1. Linux Ubuntu 添加创建新用户步骤 安装 go
  2. 基于strongSwan配置预共享密钥的IPsec实验
  3. Codeforces 757F: Team Rocket Rises Again(支配树)
  4. tinyint(1)和int(1)的区别
  5. 十三届蓝桥青少组省赛Python-20220423
  6. oracle索引查询
  7. 【FreeRTOS】11 软件定时器
  8. 按图搜索1688商品接口(item_search_img-按图搜索1688商品(拍立淘接口)代码对接教程
  9. MySQL数据库 锁
  10. Java悲观锁与乐观锁