数据结构--双端链表

// double linked list.cpp : Defines the entry point for the console application.
/*-----CODE FOR FUN---------------
-------CREATED BY Dream_Whui--
-------2015-1-20--------------------*/

#include "stdafx.h"
#include <iostream>
using namespace std;

#define  ElemType char

#define   TRUE             1
#define   FALSE            0
#define   OK                 1
#define   ERROR            0
#define   OVERFLOW   -2
#define   INFEASIBLE   -1

typedef struct DuLNode//定义双端链表的结构
{
    ElemType data;
    DuLNode *prior;
    DuLNode *next;
}DuLNode,*DuLinkList;

void CreateList(DuLinkList &L, int n)//构造长度n的双端队列
{
     L = (DuLinkList)malloc(sizeof(DuLNode));
     L->next = NULL;
     L->prior = NULL;
     DuLinkList T = L;
     char e;
     for(int i =0; i<n; i++)
     {
        cin>>e;
        DuLinkList s = (DuLinkList)malloc(sizeof(DuLNode));
        s->data = e;
        s->next = T->next;
        T->next = s;
        s->prior = T;
        T = s;
     }
}

DuLinkList GetElem_Dul(DuLinkList &L, int i)//获取第i个结点
{
    DuLinkList p = L;
    int j = 0;
    while(p->next && j<i-1)//不加next,可以定位到表长+1位置上的结点,加next,只能到末尾
    {
        p = p->next;
        j++;
    }
    if(!(p->next) || j>i-1)    
        return ERROR;
    return p->next;
}

int ListInsert_Dul(DuLinkList &L, int i, ElemType e)//在第i个位置前面插入元素e
{
    DuLinkList p = GetElem_Dul(L,i);
    if(!p)
        return ERROR;
    DuLinkList s = (DuLinkList)malloc(sizeof(DuLNode));
    if(!s)
        return ERROR;
    s->data = e;
    s->prior = p->prior;
    p->prior->next = s;
    p->prior = s;
    s->next = p;
    
    return OK;
}

int ListDelete_Dul(DuLinkList &L, int i, ElemType &e)//删除第i个结点
{
    DuLinkList p = GetElem_Dul(L,i);
    if(!p)
        return ERROR;
    e = p->data;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);

    return OK;
}
int main(int argc, char* argv[])
{
    DuLinkList L;
    CreateList(L,5);
    DuLinkList T = L;
    while(T->next)
    {
        cout<<T->next->data<<" ";
        T = T->next;
    }
    cout<<endl;
    cout<<GetElem_Dul(L,2)->data<<endl;
    ListInsert_Dul(L,6,'W');
    T = L;
    while(T->next)
    {
        cout<<T->next->data<<" ";
        T = T->next;
    }
    cout<<endl;
    char e;
    ListDelete_Dul(L,3,e);
    T = L;
    while(T->next)
    {
        cout<<T->next->data<<" ";
        T = T->next;
    }
    cout<<endl;

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值