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

这篇感觉叙述有点乱,最好自己调试一下,把地址,结构图,画一下。

首插法虽然简单,但节点的次序和输入的顺序相反。

若要顺序一致则可以采用尾插法。

若要理解,还是要写代码,看内存啊,文章真是没法描述。

#include <stdio.h>
#include"3.h"
//尾插法
#define datatype int

typedef struct node
{
	datatype data;
	struct node *next;
}Linklist;

Linklist *head,*p,*r;

void main()
{
	char ch;
	ch=getchar();
	r=(Linklist *)malloc(sizeof(Linklist));
	head=r;

	while(ch!='$')
	{
		p=(Linklist *)malloc(sizeof(Linklist));
		p->data=ch;
		r->next=p;
		r=p;
		ch=getchar();
	}	
}

开始运行,输入字符‘K’,ch=‘K’,且申请一片内存空间,首地址值放在r,赋值给head,r=head=0x04e3fb8。内存空间内容为空,生成新节点,它也有数据域和指针域,等下我们只用指针域用于做访问入口。

r=head=0x04e3fb8,说明r和head这两个指针,都能访问0x04e3fb8地址开始的那片内存,可以写入

然后判断进入循环,再申请一片空间,地址是0x004e06e0,生成新节点1,用于放ch 。

把ch=K放入新节点的数据域,指针域先不处理,因为它要指向下一个节点,现在还没有申请。p->data=ch。

现在地址0x004e06e0开始的这片内存,放在数据,指针为空。

再把刚刚的r=head=0x04e3fb8,头结点内存的指针域,指向地址是0x004e06e0新节点1的这片内存空间。即 r->next = p = 0x004e06e0

 现在r还等于head等于0x04e3fb8,它们还能访问这片内存呢。注意区分r,r->next,都是指针,内容都是值

r=p

现在r的值终于变了,r=0x004e06e0。现在r能访问0x004e06e0开始的这片内存了,也就是新节点1.

内存里面,数据域data=75,指针域next为空

然后再输入字符‘换行符’,ch=10。

申请一片内存,首地址p=0x004e0728,生成新节点2。

p->next进行赋值,0x004e0728新节点2数据域ch=10, 指针域先不处理,因为它要指向下一个节点,现在还没有申请。

再把新节点1指针域指向新节点2,首地址p=0x004e0728,即 r->next=p

继续创建新节点,直到输入字符‘$’。我们可以从head开始访问数据了。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大大U

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

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

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

打赏作者

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

抵扣说明:

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

余额充值