这一周, “数据结构” 这个阶段的学习结束了,也对这个阶段进行了考核。对于我来说,我是
感觉这个阶段挺重要的,也挺难的,尤其是链表,才开始学的时候,感觉跟前面的学习形成了鲜明
的对比,但经过多次的学习与编写,也大致学会了怎么使用和编写逻辑,当然可能一些细节还是有
点问题。
首先,链表是一种 逻辑结构为线性结构(先后顺序),存储结构为链式存储的 数据结构。
它不像顺序表那样,申请的空间是连续的,且空间大小是固定的,而链表是需要时才会申请空间,
因此,它的空间位置不是连续的,是任意的,且它可以一直申请空间,不会担心满(当然不要超过
存储空间的大小)。
链表有两部分,一部分存数据内容,一部分存关系(即下一个节点的地址)
如上图,p是一个头指针,用来存储数据内容的地址,方便查找链表;
head是一个头节点,通常为空,即NULL,而它的next存储了下一个节点数据内容的地址。
struct node
{//创建一个结构体,表示每个节点的内容
char name[20];
int age;//数据内容
struct node * next;//创建一个指针,存储下一个节点的数据内容的地址,即表示关系;
};
struct node * list()
{//创建链表
struct node *head=malloc(sizeof(struct node));//给结构体申请一个动态内存
if(head == NULL)//判断头节点地址(结构体存储空间地址)是否为空
{
printf("malloc error\n");
return NULL;
}
head->next=NULL;//让头节点为空,相当于现在只有一个节点 —— 头节点
return head;
}
插入节点和删除节点都要看前面一个节点,因为前面一个节点的next存了当前节点的地址。
如果要在头节点后面插入一个节点,只要创建一个新节点接在头节点后面就行,如下。
//创建新节点,以及怎么连接
struct node * new = malloc(sizeof(struct node ));//为新节点申请空间
new->next = head->next;//新节点next为空
head->next = new;//头节点next存储新节点地址
如果要在新节点后在插入一个新节点,也相同方法。
如果要删除头节点后面一个节点,只要让头节点直接接入当前删除节点后一个节点就行,然后当前删除节点就会与头节点断开关系,如下。
//删除头节点后的节点
struct node * q = head->next;//创建一个指针存储删除节点的地址
head->next = q->next;//头节点next指向删除节点后一个节点的地址
总结:链表在数据结构中很常用,才开始学时一定要多画图,找到节点与节点之间的关系。注意,在插入,删除节点时,都要找前一个节点。这是我对链表最基础,最基本的了解了,当然还有很多感觉都没有写到。反正一句话就是,多画图!多画图!找到关系就很简单了。