双链表的简单实现

#include <iostream>
#include <cstdio>
#include <malloc.h>
typedef int ElemType;
using namespace std;

typedef struct DuLNode
{
    ElemType data;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,*DuLinkList;

///创建带有头结点的双链表,顺序输入
void createDuList_DL(DuLinkList &DL,int n)
{
    DL=(DuLinkList)malloc(sizeof(DuLNode));
    DL->data=0;
    DL->prior=NULL;
    DL->next=NULL;
    DuLNode *r=DL;  //last node
    for(int i=1;i<=n;i++)
    {
        DuLNode *p=(DuLinkList)malloc(sizeof(DuLNode));
        p->data=i;
        p->next=r->next;
        p->prior=r;
        r->next=p;
        r=p;
    }
}
///查找双链表中第i个位置的元素
bool GetElem_DL(DuLinkList DL,int i,ElemType &e)
{
   DuLNode *p=DL->next;
   int j=1;
   for(;p&&j<i;j++)
   {
       p=p->next;
   }
   if(!p||j>i)
    return false;
   e=p->data;
   return true;
}
///在第i个位置前面插入一个元素
bool InsertDuList_DL(DuLinkList &DL,int i,ElemType e)
{
    DuLNode *p=DL->next;
    int j=1;
    for(;p&&j<i-1;j++)
        p=p->next;
    if(!p||j>i-1)
        return false;
    DuLNode *s=(DuLinkList)malloc(sizeof(DuLNode));
    s->data=e;
    s->next=p->next;
    s->prior=p;
    if(p->next!=NULL)
        p->next->prior=s;
    p->next=s;
    return true;
}
///删除链表中第i个位置的元素,并用e返回
bool DeleteDulist_DL(DuLinkList &DL,int i,ElemType &e)
{
    DuLNode *p=DL->next;
    int j=1;
    for(;p&&j<i;j++)
        p=p->next;
    if(!p||j>i)
        return false;
    p->prior->next=p->next;
    if(p->next!=NULL)
        p->next->prior=p->prior;
    e=p->data;
    free(p);
    return true;
}
///销毁整个双链表
void FreeDuList_DL(DuLinkList &DL)
{
    if(DL)
    {
        DuLNode *p=DL;
        while(p)
        {
            DL=DL->next;
            if(DL!=NULL)
                DL->prior=NULL;
            free(p);
            p=NULL;
            p=DL;
        }
    }
}
///双链表逆序
bool ReverseDuList_DL(DuLinkList &DL)
{
    if(DL==NULL||DL->next==NULL)
        return false;
    else
    {
        DuLNode *p=DL->next;
        DuLNode *q=p->next;
        while(q)
        {
            p->next=q->next;
            if(q->next!=NULL)
                q->next->prior=p;
            q->next=DL->next;
            DL->next->prior=q;
            DL->next=q;
            q->prior=DL;
            q=p->next;
        }
        return true;
    }
}
///打印双链表中的元素
 void printDuList_DL(DuLinkList DL)
 {
     if(DL==NULL)
        printf("The list is invalid!\n");
     else if(DL->next==NULL)
        printf("The list is null!\n");
     else
     {
         DuLNode *p=DL->next;
         printf("The elements of list:\n");
         while(p)
         {
             printf("%d ",p->data);
             p=p->next;
         }
         printf("\n");
     }
 }

int main()
{
    DuLinkList DLa;
    createDuList_DL(DLa,5);
    printDuList_DL(DLa);
    ElemType e=6;
    //GetElem_DL(DLa,3,e);
    //InsertDuList_DL(DLa,6,e);
    //DeleteDulist_DL(DLa,1,e);
    //ReverseDuList_DL(DLa);
    FreeDuList_DL(DLa);
    printDuList_DL(DLa);
    //printf("e=%d\n",e);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值