C语言数据结构拦路虎(三)-首插法单链表的理解

如果对代码的一些函数或者概念不清楚请读前面两节

定义一个节点,包括数据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的值是最后一个节点的首地址。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值