关于指针和链表中的一些问题

学习数据结构时对指针和链表很迷糊,也就自己总结 一下,如果有错误或者理解上的错误欢迎指正,谢谢

指针

指针是什么,指针就是指针类型,就和int 类型,float类型等一样,而对于指针个人当时学习的时候总被*弄得迷糊,

*的作用:

1:类型说明符,int*p,定义p是一个指向整型的指针变量,p就是这个地址,具体说明教科书有。所以有int *p;p=&a或者是int *p=&a;在这里时强调一点int* p,可以写成这种形式,是指p所指向的数据域是整型,

2:指针指向的值的运算

3:野指针

当定义一个指针变量后,需要对其进行初始化,p=NULL,或者p=&a;如果不将其初始化,那么p没有一定的指向,这时会有一定的危险,同时在调用free后,此时需要将指针p=NULL,如若不然,则此时的p为野指针,所以要将其p=NULL

链表Linklist L和Link *L的区别

1:L=(Linklist *)malloc(sizeof(lnode))对吗?

2:L=(Linklist)malloc(sizeof(lnode))对吗?

3:**L=(Linklist)malloc(sizeof(lnode))对吗?

首先看一下单链表的存储结构(参考严蔚敏的教材)

typedef struct lnode{

  Elemtype   data;

  struct  lnde *next;

  }lnode, *Linklist

首先Linklist 是什么?

Linklist是一个指针变量,指向lnode的结构体的指针变量,

Linklist L是什么?怎么去理解,我是这样理解的,我们学过了整型变量的定义 int a;a 是一个整型变量,同时我们可以理解Linklist L,定义一个变量L是Linklist型,此时的L

也是一个指针变量,指向结构体Lnode,此时的L是个一级指针,同理Linklist *L,把L换成q是没有关系的,所以就变成了Linklist *q,同理*p是个指针变量,指向lnode,此时我们又回到了指针符号*的作用上,是取值运算,取p所指向的是个指针,也就是说指针p指向指针,所以此时的指针p是个二级指针

malloc用法:

(l类型*)malloc(sizeof(lnode))是系统分配一个大小为lnode的内存,并把这个内存的首地址转换为什么类型的指针,Linklist本身是一个指针,此时Linklist *则是一个二级指针

所以第一个不对

注第二个中的L是Linklist *L中的L

我们刚才说了此时的L是二级指针,所以也不正确

看第三个**L可以这样理解*(*L),

即为取值,所以第三个也不成立

二级指针和一级指针

一级指针指向数据域,而二级指针指向指针域,具体见书本

时间: 2024-10-14 19:36:58

关于指针和链表中的一些问题的相关文章

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =

链表中头指针和头结点

线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间.来看链表的定义: struct node { int data; struct node *next; }; 其中有两个元素,data为数据域,用于存储数据,next为指针域,用于存储下个结点的位置(地址).那么什么是头指针呢?我们把指向

2015.9.10关于链表中结构体指针的错误

昨天用结构体指针写了一个双链表的程序,编译环境是VC6.0,之前写单链表的时候也是用的这个编译器,但是昨天出了一个让我很费解的问题,代码如下: /********************************************************** * C语言实现双链表 *文件名:list.c *作者:Mr Wan *编写时间:2015.9.9 *功能:实现双链表的简单操作 *版本:1.0 * ********************************************

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

彻底理解链表中为何使用二级指针或者一级指针的引用

 彻底理解链表中为何使用二级指针或者一级指针的引用 http://blog.csdn.net/u012434102/article/details/44886339 struct _node  {  void*data;  struct_node *prior;  struct_node *next;  } typedef_node Node;   //给这个_node结构体定义一个别名,任何使用_node的地方都可以用Node来替换 typedef_node* PNode;   //给这个指向

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

1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,不必多说,return NULL: (2)如果恰恰是头结点与头结点的后一个重复了,这种情况是可以发生的,那头结点就要被删除,另选新的结点作为头结点.如何处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 1 /* 2 struct

链表中的头指针和头结点(转)

链表中的头指针和头结点 链式存储 指针域(单链表),来记录下一个结点的存储位置(地址) 插入和删除结点时,只需要修改指针即可 struct node{ int data; struct node *next; } data是数据域,用于存储数据 next是指针域,用于存储下一个结点的位置(地址) 原文地址:https://www.cnblogs.com/wwqdata/p/11578861.html

链表中倒数第K个结点

题目:输入一个链表,输出改链表倒数第K个结点. 分析:常规方法可能就是,先遍历一遍链表,找到链表长度length,那么我们只需要第二次遍历length-k+1个结点就可以找到倒数第k个结点. 比较好的方法是采用两个指针,让一个指针先走K-1步,后面的指针再跟上.这样只需要遍历一遍. 注意:1.提高容错性,在链表为空 或者k为空.还有k大于链表长度. 2.链表下一个结点,我们采用p=p->next.指针指向的数组我们采用p++; typedef int Type; struct listNode{

输出链表中倒数第k个节点

题目描述 输入一个链表,输出该链表中倒数第k个结点. struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; 算法的实现:快慢指针 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL||k==0) return NULL; ListNode *fast=N