链表
数组是一种支持随机访问,但不支持在任意位置插入或删除元素的数据结构。与之相对应,链表支持在任意位置插入或删除,但只能按顺序依次访问其中的元素。我们可以用一个struct 表示链表节点,其中可以存储任意数据;另外用prev和next两个指针指向前后相邻的两个节点,构成一个常见的双向链表结构。为了避免在左右两端或空链表中访问越界,我们建立两个额外的节点head与tail代表链表头尾,把实际数据节点存储在head与tail之间,来减少链表便捷处的判断,降低编程复杂度。
链表的正规形式一般通过动态分配内存、指针等实现,为了避免内存泄露,方便调试,使用数组模拟链表、下标模拟指针也是常见做法。两种实现形式的参考程序:
struct Node{
int value; //数据
Node *prev,*next; //指针
} ;
Node *head,*tail;
void initialize(){ //建新链表
head=new Node();
tail=new Node();
head->next=tail;
tail->prev=head;
}
//在p后插入包含数据val的新节点
void insert(Node *p,int val){
q=new Node();
q->value=val;
p->next->prev=q;
q->next=p->prev;
p->next=q;q-