1.链表
链表(linked list)就一些包含数据的独立数据结构(通常称为节点)的集合。链表中的每个节点通过链或指针连接在一起,程序通过指针访问链表中的节点,通常节点是动态分配的。
2.单链表
在单链表中,每个节点包含一个指向链表下一个节点的指针,链表最后一个节点的指针字段的值为NULL,提示链表后面不再有其他节点。
为了记住链表的起始位置,可以使用一个根指针(root pointer),根指针指向链表的第1个节点。
单链表可以通过链从开始位置遍历链表直到结束位置,但链表无法从相反的方向进行遍历。需要始终保存一个指向链表当前节点之前的那个节点的指针
实例:
typedef struct NODE
{
struct NODE link;
int value;
} Node;
/*************************************************************************
插入到一个有序单链表,函数的参数是一个指向链表第一个节点的指针,以及一个需要值
**************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#define FALSE 0
#define TURE 1
int sll_insert (register Node **linkp, int newValue)
{
register Node *current;
register Node new;
/
**寻找正确的插入位置,方法是按序访问链表,直到到达一个其值大于或等于新值的节点
*/
while ((current = *linkp) != NULL && current->value < newValue)
{
*linkp = ¤t->link;
}
/*
**为新节点分配内存,并把新值存储到新节点中,如果内存分配失败,则返回
*/
new = (Node )malloc(sizeof(Node));
if (new == NULL)
{
return FALSE;
}
new->value = newValue;
/
**在链表中插入新节点,并返回TRUE
*/
new->link = current;
*linkp = new;
return TRUE;
}
3.双链表
单链表的替代方案是双链表,在一个双链表中,每个节点都包含两个指针(指向前一个节点的指针和指向后一个节点的指针),使得我们任何方向的遍历。
typedef struct NODE
{
struct NODE fwd;
struct NODE bwd;
int value;
} Node;
根节点的fwd字段指向链表的第1个节点,根节点的bwd字段指向链表的最后一个节点。如果链表为空,这两个字段都为NULL。
/*********************************************************************************************************
把一个新值插入到一个双链表中,rootp是一个指向根节点的指针
**value 是需要插入的新值
*********************************************************************************************************/
#include <stdlib.h>
#include <stdio.h>
int dll_insert(register Node *rootp, int value)
{
register Node *this;
register Node *next;
register Node newNode;
/
**查看value是否已存在于链表中,如果是就返回
**否则,为新值创建一个新节点
**“this”将指向应该在新节点之前的那个节点
**next将指向应该在新节点之后的那个节点
*/
for (this = rootp; (next = this->fwd) != NULL; this = next)
{
if (next->value == value)
return 0;
if (next->value > value)
break;
}
newNode = (Node )malloc(sizeof(Node));
if (newNode == NULL)
return -1;
newNode->value = value;
/
**把新节点添加到链表中
*/
newNode->fwd = next;
this->fwd = newNode;
if (this != rootp)
newNode->bwd = this;
else
newNode->bwd = NULL;
if (next != NULL)
next->bwd = newNode;
else
rootp->bwd = newNode;
return 1;
}
}
双链表中的每个节点包含两个link字段:其中一个指向链表的下一个节点,另外一个指向链表的前一个节点,双链表有两个根指针,分别指向第一个节点和最后一个节点。