循环链表和双向链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sjdjdjdjahd/article/details/91407388

循环链表

循环链表是链式存储结构的另一种形式,特点是单链表的最后一个结点(终端结点)的指针域不为空,而是指向链表的头结点,使整个链表形成一个环。

在这里插入图片描述

例子:

/*
    将值为x的新结点插入到有序循环链表的适当位置
*/
int InsertData(LinkList L,int x){
    ListNode *s,*p,*q;      //s新结点  q当前结点  p当前结点的前趋节点
    s = (ListNode *)malloc(sizeof(ListNode));   //申请结点存储空间
    s->next = x;    p = L;
    q = p->next;                    //q指向开始结点
    while (q->data > x && q != L)   //查找插入位置
    {
        p = p->next;                //p指向q的前趋结点
        q = p->next;                //q指向当前结点
    }
    p->next = s;    //插入s结点
    s->next = q;
}

双向链表

在单链表的结点类型中增加一个指向其直接前驱的指针域prior,这样形成的链表中有两条不同方向的链,称为双向链表。00

在这里插入图片描述

双向链表结构如下:
typedef int DataType; 
typedef struct dlnote
{
    DataType data;
    struct dlnote *prior, *next;
}DLNote;
typedef DLNote * DLinkList;
DLinkList head;
双向链表的插入与删除
/*
    将值得x的新结点插入到带头结点的双向链表中指定结点*p之前
*/
void DLInsert(DLNote *p,DataType x){
    DLNote *s = (DLNote *)malloc(sizeof(DLNote));   //申请新结点
    s->data = x;
    s->prior = p->prior;s->next = p;
    p->prior->next = s;  //p的直接前驱结点指向s
    p->prior=s;          
}

/*
    删除带头结点的双向链表中指定结点P
 */
DataType DLDelete(DLNote *p){
    p->prior->next = p->next;
    p->next->prior = p->prior;
    DataType x = p->data;
    free(p);
    return x;
}

猜你喜欢

转载自blog.csdn.net/sjdjdjdjahd/article/details/91407388