C 语言链表一步步深入学习

怎么讲链表这部分的吧,主要思路是带着同学们 step by step 地从无到有实现链表,在逐步改进的过程中体会,而不是直接给大家一个最终完善的代码看。

首先,对于这几种操作,数组是有点麻烦的:删除数组中的一个元素、在数组中插入一个元素、在数组末尾添加一个元素。

因此人们想能否有一个办法,处理上面的问题,实现:–当需要添加一个元素时,会自动添加;–当需要减少一个元素时,会自动放弃该元素原来占有的内存;–可以较方便地插入新的元素。

下面,分步骤实现。

我用的编辑器是 Mac 上的 Xcode。

  1. 定义链表单个节点的数据结构。
#include <stdio.h>

struct node
{
	int data;
	node *next;
};

void main()
{
	struct node p;
	p.data = 1;
}
  1. 尝试用指针的方式来实现,但下面代码会异常,编辑器不会报错。
#include <stdio.h>

struct node
{
	int data;
	node *next;
};

void main()
{
	struct node *p;
	(*p).data = 1;
}
  1. 改进下,使用指针前需要先分配存储空间
#include <stdio.h>
#include <stdlib.h>

struct node
{
	int data;
	node *next;
};

void main()
{
	struct node *p;
	p=(strcut node *)malloc(sizeof(struct node));
	(*p).data = 1;
}

  1. 实现两个节点的串联,并可以单步跟踪,观察节点在内存中的链接关系。
#include <stdio.h>
#include <stdlib.h>

struct node
{
	int data;
	node *next;
};

void main()
{
	struct node *p1,*p2;
	p1=(struct node *)malloc(sizeof(struct node));
	(*p1).data = 1;

	p2=(struct node *)malloc(sizeof(struct node));
	(*p2).data = 2;

	p1->next = p2;
}