/* 结构体不能含有同类型的结构,但是可以含有指向同类型结构的指针。这样的定义是定义一个链表的基础。 */
1 typedef int Element;
2
3 typedef struct node{
4 Element e;
5 struct node* next;//这里只是声明了一个名为next的指针,指针本身也占内存空间,里面存放的始终是地址。 struct node* 表示指针的类型是 struct node,即指向的地址里存放的是一个结构体
6 }LNode, *Linklist;  //LNode等价于struct node; *LinkList 等价于 struct node* 
  • 等号 = 左右 的 p 和 p->next 意义不同,要注意甄别;
  • pre 单独出现的时候代表一个节点 ,如head,就代表head节点;
  • pre在 = 左边 出现时代表一个节点,在= 右边 出现时代表节点pre的地址;
    •   p = head; //节点p指向节点head的地址
  • p->next 在= 左边 出现时 节点p的指针域;在 = 右边 出现时代表节点 p 的下一个节点地址(即下一节点数据域的地址);
    •   p->next = pre->next; //p 的指针域指向原先 pre 节点的下一个节点地址
    •   pre->next = p; //pre的指针域指向节点 p 的地址
  • 单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址"
 1 /**
2 * 插入元素
3 */
4 Linklist insert(Linklist head, int k, Element e){
5 int getLength(Linklist head);
6
7 Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
8 Linklist pre = (Linklist)malloc(sizeof(LNode));//申请一个新节点
9 int length = getLength(head);
10 pre = head;
11
12 if(k == length+1){ //在链表末尾添加新节点
13 while(pre->next) {
14 pre = pre->next; //单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址" 
15 }//循环结束时,pre已经到达链表末尾
16 p->e = e;
17 pre->next = p;
18 p->next = NULL;
19 }else if(k > 0 && k <= length){//在链表中间添加节点 ,插入位置从1开始算
20 int j = 1;
21 while(j < k) {
22 pre = pre->next;//单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址" 
23 j++;
24 }//循环结束时,pre是要插入位置的前驱节点
25 p->e = e;
26 p->next = pre->next; // p 的指针域指向原先 pre 节点的下一个节点的地址 
27 pre->next = p; // pre的指针域指向节点 p 的地址
28 }else{
29 printf("插入的位置有误!\n");
30 }
31 return head;
32 }

c链表中指针的一些用法要点的更多相关文章

  1. go中指针类型的用法小结

    代码 // 指针的用法 package main import ( "fmt" ) func main() { var i int = 100 // 输出i的地址 fmt.Prin ...

  2. 编程基础-c语言中指针、sizeof用法总结

    1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...

  3. Alan Cox:单向链表中prev指针的妙用

    之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...

  4. 剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  5. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  6. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  7. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. 关于leetcode中链表中两数据相加的程序说明

    * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ ...

  9. C语言中怎么将文件里的数据创建到(读到)链表中?

    定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 struct student *next; //next 指针 指向 struct student 类型的变量 ...

随机推荐

  1. C 标准库函数手册摘要

    <stdlib.h> int abs( int value ); long int labs( long int value ); 返回参数的绝对值 int rand( void ); v ...

  2. vue基础-动态样式&表单绑定&vue响应式原理

    动态样式 作用:使用声明式变量来控制class和style的值 语法: :class/:style 注意:尽可能不要把动态class和静态class一起使用,原因动态class起作用的时间会比较晚,需 ...

  3. [对对子队]事后总结Beta

    设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要做一个游戏,定义的很清楚,实现出来的效果贴近定义,对用户和场景有清晰描述 我们达到目标了么(原计划的功 ...

  4. 零基础入门Linux有什么好的学习方法吗?(超详细)

    本节旨在介绍对于初学者如何学习 Linux 的建议,在这里不具体分析Linux的学习节点只分析对于零基础的伙伴的学习方法.那么如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Li ...

  5. STM32串口通信配置(USART1+USART2+USART3+UART4) (转)

    一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...

  6. 深入理解Linux C语言内存管理

    问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...

  7. PWN环境搭建

    目录 PWN环境搭建 需要的工具或系统 安装PWN工具 pwntools (CTF库.漏洞利用库) pwngdb(GDB插件) checksec(查保护) ROPGadget(二进制文件查找工具) o ...

  8. 修改 openssh 版本号

    1.查看 sshd 位置 #which sshd 2.查看 /usr/sbin/sshd(二进制文件) 内容 #strings /usr/sbin/sshd | grep nicai 3.修改版本号, ...

  9. Linux 守护进程原理及实例(Redis、Nginx)

    1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束.可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组I ...

  10. MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...