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();
	}	
}

 设置两个断点,可以看到初始化时,head,p的值都是0,它们不指向任何地址。

黄色箭头指的是代码将运行的下一条代码

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

输入字符‘K’,ascii码 75,ch=75

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

next=0x0000000,代表着它指向了NULL。

head=p=0x004a3e68,它们都是存储'K'节点的首地址,别忘了指针有指向性

可以看到它们的结构,

head=p=0x004a3e68指向的节点,里面有data和next

next又指向下一个节点,首地址为0x00000000,只不过它是空节点,没有分配内存。

继续创建两个个节点,输入‘换行键’ ascii码为10,和‘J’ ascii码为74

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

我们可以很清楚的看到它的结构。我的理解是:

head,p,p->next都是指针,存的值是首地址。

p为节点申请一块空间地址,p的值就是这块空间的首地址。

head用于保存最近的非‘$’的节点首地址。如果p申请地址成功就把首地址即p值赋值给head。

当再输入一个字符‘$’创建一个新节点,while判断到结束条件,即结束循环。

最后head的值是最后一个节点的首地址。