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,它们不指向任何地址。
黄色箭头指的是代码将运行的下一条代码
输入字符‘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的值是最后一个节点的首地址。