ahua的头发

导航

数据结构::双链表

数据结构::双链表

基本操作与单链表相似 增加了前置结点

#pragma GCC positionimize(3,"Otrst","inline")
//#include "emplace.hpp"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int INF=0x3f3f3f;
const double pi = 3.141592653;
const double E = 2.71828182846;
const ll mod=1e9+7;
const int M=1e3+5;
const double eps=1e-8;
#define ci(x) scanf("%lld",&x)
#define co(x) printf("%lld\n",x)
#define InitSize 10
///带头结点
typedef struct DNode
{
    int data;
    struct DNode *prior,*next;
}DNode,*DLinkList;
//使用DNode是想强调这是个结点
//使用DLinkList是想强调这是个链表
bool InitDLinkList(DLinkList &L)
{
    L=(DNode *)malloc(sizeof(DNode));
    if(L==NULL)
        return false;
    L->next=NULL;
    L->prior=NULL;
    return true;
}
bool ListEmpty(DLinkList L)
{
    if(L->next==NULL)
        return false;
    else
        return true;
}
bool InsertNextDNode(DNode *p,DNode *s)//在p结点之后插入s结点
{
    if(p==NULL||s==NULL)
        return false;
    s->next=p->next;
    if(p->next==NULL)
        p->next->prior=s;
    s->prior=p;
    p->next=s;
    return true;
}
bool DeleteNextDNode(DNode *p)
{
    if(p==NULL)
        return false;
    DNode *q=p->next;
    if(q==NULL)
        return false;
    p->next=q->next;
    if(q->next!=NULL)
        q->prior=p;
    free(q);
    return true;
}
void DestroyList(DLinkList &L)//销毁链表
{
    while(L->next!=NULL)
        DeleteNextDNode(L);
    free(L);
    L=NULL;
}
bool FindNode(DLinkList &L)//链表的遍历
{
    DNode *p=L;
    while(p!=NULL) //后向遍历
        p=p->next;
    while(p!=NULL) //前向遍历
        p=p->prior;
    while(p->prior!=NULL) //不包含头结点的遍历
    {
        p=p->prior;
    }
    return true;
}
int main()
{
    DLinkList L;
    //头插法
    //尾插法

    return 0;
}

//单链表的一些操作 使用时做一些修改即可
/*
bool InitList(LinkList &L)
{
    L=(LNode *)malloc(sizeof(LNode));
    if(L==NULL)
        return false;
    L->next=NULL;
    return true;
}
LNode * GetElem(LinkList L,int i)
 {
     if(i<1)
        return NULL;
     LNode *p;
     p = L;  //L指向头结点
     int j=0;
     while(p!=NULL&&j<i)
     {
         p=p->next;
         j++;
     }
     return p;
 }
 LNode * LocateElem(LinkList L,int e) //按值查找
 {
     LNode *p;
     p=L->next;
     while(p!=NULL&&p->data!=e)
        p=p->next;
     return p; //找到返回p结点 否则返回NULL
 }
 int GetLengh(LinkList L)
 {
     int len=0;
     LNode *p=L;
     while(p->next!=NULL)
     {
         p=p->next;
         len++;
     }
     return len;
 }
 bool ListNextInsert(LNode *p,int e) //在p节点之后插入新的元素
{
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}
bool ListInsert(LinkList &L,int i,int e) //  在第i个位置插入元素e
{
    if(i<=1)
        return false;
    LNode *p=GetElem(L,i-1);   //找到第i-1个节点
    /*if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;//将节点s连到p之后
    return true;
    return ListNextInsert(p,e);
}

bool ListPriInsert(LNode *p,int e)
{
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->next=p->next;
    p->next=s;
    s->data=p->data;
    p->data=e;
    return true;
}

 bool ListDelet(LinkList &L,int i,int &e)//删除第i个节点
 {
     if(i<=1)
        return false;
    /*LNode *p;
    int j=0;
    p=L;
    while(p!=NULL && j<=i-1)
    {
        p=p->next;
        j++;
    }
    LNode *p=GetElem(L,i-1);
    //以上为了找到i-1个节点
    if(p==NULL)
        return false;
    if(p->next==NULL)
        return false;
    LNode *q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);
    return true;
 }
 bool DeletNode(LNode *p) //删除p节点
 {
     if(p==NULL)
        return false;
     LNode *q=p->next;
     p->data=p->next->data;
     p->next=q->next;
     free(q);
     return true;
 }
 LinkList List_TailInsert(LinkList &L) //建立后插操作
 {
     L=(LNode *)malloc(sizeof(LNode));
     LNode *s,*r=L;
     int x;
     while(scanf("%d",&x)!=EOF)
     {
         s=(LNode *)malloc(sizeof(LNode));
         s->data=x;
         r->next=s;
         r=s;//r指向新的表位结点
     }
     r->next=NULL;
     return L;
 }
LinkList List_HeadInsert(LinkList &L)//逆向建立单链表
{
    L=(LinkList)malloc(sizeof(LNode));
     LNode *s;
     int x;
     L->next=NULL;
     while(scanf("%d",&x)!=EOF)
     {
         s=(LNode *)malloc(sizeof(LNode));
         s->data=x;
         s->next=L->next;
         L->next=s;
     }
     return L;
}*/

 

posted on 2020-05-28 17:16  ahua的头发  阅读(151)  评论(0编辑  收藏  举报