如果对代码的一些函数或者概念不清楚请读前面两节
定义一个节点,包括数据data,指针next
typedef struct node
{
datatype data;
struct node *next;
}Linklist;
Linklist *head,*p;
理解指针 next
!!!一定要调试,可以画画图,标出地址,起新名字。这样更好理解
1、next,head,p都是同一类型指针,可以相互赋值
2、指针可以理解为,有指向性的地址。也就是说指针里面的值是地址,0x0000或其他,
3、当next,head,p为空(p=NULL),它的值是某个地址,不指向任何地方
实际代码调试理解(首插法)
代码的原理:输入一个字符,非'$'字符,创建一个节点。
#include <stdio.h>
#define datatype int
typedef struct node
{
datatype data;
struct node *next;
}Linklist;
Linklist *head,*p;
void main()
{
char ch;
ch=getchar();
while(ch!='$')
{
p=(Linklist *)malloc(sizeof(Linklist));
p->data=ch;
p->next=head;
head=p;
ch=getchar();
}
}
对一些语句的理解:
1、指针就是,带有指向性的地址,它的值就是一片内存单元的首地址,你可以通过指针来访问那片内存单元,可以把某个内存单元的值改掉。
为什么指针会有类型呢?我的理解是,前面说指针的值就是一片内存单元的首地址,那么一片是多大呢,就靠这个类型来约束它,如,int,两个字节,char,四个字节。
2、malloc函数,前面有详细介绍了,但再加深理解。作用就是,申请一片内存单元,多大的一片呢,sizeof(Linklist)这么大。返回一个指针,它的定义呢,是一个空类型的,好像能访问任何类型数据,但我们要强制转换为,Linklist类型的指针。这个指针的值是内存空间的首地址。
我们通过malloc函数申请到一片内存空间了,那我们得用啊。
现在我们只有它的首地址,是一个指针,那我们只能通过指针操作来,写它的值了。
这里是结构体指针,它的内存空间可以分片,一部分放数据,int类型,也就是数据域。一部分放结构体指针,Linklist结构体,也就是指针域。
设置两个断点,可以看到初始化时,head,p的值都是0,它们不指向任何地址。
黄色箭头指的是代码将运行的下一条代码
输入字符‘K’,ascii码 75,ch=75
next=0x0000000,代表着它指向了NULL。
head=p=0x004a3e68,它们都是存储'K'节点的首地址,别忘了指针有指向性
可以看到它们的结构,
head=p=0x004a3e68指向的节点,里面有data和next
next又指向下一个节点,首地址为0x00000000,只不过它是空节点,没有分配内存。
继续创建两个个节点,输入‘换行键’ ascii码为10,和‘J’ ascii码为74
我们可以很清楚的看到它的结构。我的理解是:
head,p,p->next都是指针,存的值是首地址。
p为节点申请一块空间地址,p的值就是这块空间的首地址。
head用于保存最近的非‘$’的节点首地址。如果p申请地址成功就把首地址即p值赋值给head。
当再输入一个字符‘$’创建一个新节点,while判断到结束条件,即结束循环。
最后head的值是最后一个节点的首地址。