1 双链表
双链表结点中有两个指针prior和next,分别指向其前驱结点和后继节点。
双链表中结点类型的描述如下:
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct Dnode *prior, *next;
} DNode, *DLinkList;
1)双链表的插入操作
在双链表中p所指的结点之后插入结点s。
①s->next = p->next;
②p->next->prior = s;
③s->prior= p;
④p->next = s;
上述代码语句顺序不是唯一的,但也不是任意的,①②两步必须在④之前,否则p的后继结点的指针就丢掉了。
2)双链表的删除操作
删除双链表中结点p的后继结点q。
p->next = q->next;
q->next->prior= p;
free(q);
2 循环链表
1.循环单链表
循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。
在循环单链表中,表尾结点r的next域指向L,故表中没有指针域为NULL的结点,因此循环单链表的判空条件不是头结点的指针是否为空,而是它是否等于头指针。
2.循环双链表
在循环双链表中,头结点的prior指针还要指向表尾结点。
在循环双链表L中,某结点p为尾结点时,p->next = L;当循环双链表为空表时,其头结点的prior域和next域都等于L。
3 静态链表
静态链表是借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,与前面所讲的链表中的指针不同的是,这里的指针是结点的相对地址(数组下标),又称为游标。和顺序表一样,静态链表也要预先分配一块连续的内存空间。
静态链表结构类型的描述如下:
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType data; //存储数据元素
int next; //下一个元素的数组下标
} SLinkList[MAXSIZE];
静态链表以next = -1作为其结束的标志。静态链表的插入、删除操作与动态链表相同,只需要修改指针,而不需要移动元素。总体来说,静态链表没有单链表使用起来方便,但是在一些不支持指针的高级语言中,这又是一种非常巧妙的设计方法。