本文共 1874 字,大约阅读时间需要 6 分钟。
双向链表(又叫双链表)的每个结点中包括两个指针域,分别指向该结点的前一个结点和后一个结点。
双向链表存储结构可表示为:
typedef struct node{ DATATYPE info; //prior用来存储当前结点相邻的前一个结点的地址 //next用来存储当前结点相邻的后一个结点的地址 struct node *prior, *next;}DINKLIST;
其中DATATYPE表示结点数据域的类型,它可以是整型、字符型等类型。
对指向双向链表任一结点的指针p,有下面的关系:
p->next->prior=p->prior->next=d
上述语句表示当前结点后面的结点的前一结点是自身,当前结点前面的结点的后面的结点也是自身。
对双向链表的查找操作要从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。
删除双向链表中结点的基本步骤为:
上面步骤用代码的形式表示如下。
……//从链表中找到要删除的结点,用指针p指向该结点
p->prior->next=p->next;
p->next->prior=p->prior;
向双向链表中插入新结点,根据其插入的位置,可分为两种情况。一种是插入到某个结点之后,基本步骤为:
上面步骤用代码的形式表示如下。
p0=(struct st *)malloc(sizeof(struct st));
/*找到p0指向的新结点要插入到哪个结点的后面,用指针p1指向该结点*/
……
p0->next=p1->next;
p0->prior=p1;
p1->next->prior=p0;
p1->next=p0;
前面3. 4. 5. 的顺序可以互换,但6. 一定要在最后进行。
另一种是将新结点插入到某个结点之前,基本步骤如下:
上面的步骤用代码的形式表示如下。
p0=(struct st *)malloc(sizeof(struct st));
/*找到p0指向的新结点要插入到哪个结点的后面,用指针p1指向该结点*/
……
p0->next=p2;
p0->prior=p2->prior;
p2->prior->next=p0;
p2->prior=p0;
前面的3. 4. 5. 可以互换,但6. 一定要在最后进行
转载地址:http://zcsnl.baihongyu.com/