链表是一种常见的重要的数据结构。它是动态的进行内存分配的一种结构。
链表由一个“头指针”变量,图中以head表示,它存放一个地址,该地址指向一个元素。链表中的每一个元素称为“结点”,每个结点都应该包含两个部分:用户需要的实际数据和下一个结点的地址。可以看出,head指向第一个元素;第一个元素又指向第二个元素......直到最后一个元素,该元素不再指向其他元素,它称为“尾表”,它的地址部分放一个"NULL"(表示”空地址“),链表到此结束。
可以看到,链表中的各元素在内存中不是连续存放的。要找到某一元素,必须先找到上一个元素,根据它提供的下一个元素地址才能找到下一个元素。如果不提供“头指针”(head),则整个链表都无法访问。我们通过观察结点的结构可以知道,采用结构体变量来作为链表中的结点是最合适的。(可以理解为一个结构体对应一个结点)。
链表分为静态链表和动态链表。静态链表不提。动态链表需要事先分配内存,而内存分配函数包括malloc函数和calloc函数和free函数
malloc函数的原型为
void *malloc (unsigned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是一个指向分配域起始地址的指针(类型为void),如果未能分配成功,那么返回值为NULL(空指针)。
calloc函数的原型为
void *calloc (unsigned n,unsigned size)
其作用是在内存的动态存储区中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;否则,返回为NULL.
free函数的原型为
void free(void *p)
其作用是释放由P指向的内存区。P是最近一次调用calloc或malloc函数时返回的值,free函数无返回值。
链表的基本操作包括:建立一个链表、输出一个链表、删除一个链表、添加一个链表。