双向链表

#include<stdio.h>
#include<list>
typedef int ElemType;

enum Status
{
    OK        = 1,
    NOT_FOUND = 2,
    ERROR     = 3
};

struct LinkListNode
{
    LinkListNode():pre(NULL), next(NULL) {}
    ElemType data;
    LinkListNode* pre;
    LinkListNode* next;
};

struct LinkList
{
    LinkList():length(0), head(NULL), tail(NULL) {}
    int length;
    LinkListNode* head;
    LinkListNode* tail;
};

Status Empty(LinkList ls)
{
    if(ls.length==0)
        return OK;
    return ERROR;
}

Status LinkList_push_back(LinkList& ls, const ElemType& e)
{
    LinkListNode* node=new LinkListNode();
    node->data=e;
    ls.length++;
    if(ls.length==1)
    {
        ls.head=node;
        ls.tail=node;

        return OK;
    }

    node->pre=ls.tail;
    ls.tail->next=node;
    ls.tail=node;

    return OK;
}

Status LinkList_push_front(LinkList& ls,const ElemType& e)
{
    LinkListNode* node = new LinkListNode();
    node->data = e;
    ls.length ++;
    if( ls.length == 0)
    {
        ls.tail = node;
        ls.head = node;
        return OK;
    }

    node->next = ls.head;
    ls.head->pre = node;
    ls.head = node;

    return OK;
}

Status LinkList_insert(LinkList& ls, int i, const ElemType& e)
{
    LinkListNode* p = new LinkListNode();
    int j=1;
    p=ls.head;
    if(Empty(ls)==1)
    {
        LinkList_push_back(ls, e);
        return OK;
    }
    while(p && j<i)
    {
        p=p->next ;
        j++;
    }
    if(!p)return ERROR;
    LinkListNode* node=new LinkListNode();
    if(i==0)
    {
        LinkList_push_front(ls, e);
        return OK;
    }
    if(i==ls.length)
    {
        LinkList_push_back(ls, e);
        return OK;
    }
    node->data=e;
    node->next=p->next;
    node->pre=p;
    p->next=node;
    p->next->pre=node;
    ls.length++;
    return OK;
}

Status LinkList_Erase(LinkList& ls, int i, ElemType& e)
{
    LinkListNode* p = new LinkListNode();
    int j=1;
    p=ls.head;
    if(Empty(ls)==1)return ERROR;
    while(p && j<i)
    {
        p=p->next ;
        j++;
    }
    if(!p)return ERROR;
    LinkListNode* node=new LinkListNode();
    if(i==0)
    {
        node=p;
        e=node->data;
        ls.length--;
        ls.head=node->next;
        delete node;
        return OK;
    }
    node=p->next;
    e=node->data;
    p->next=node->next;
    if(i==ls.length-1)
    {
        ls.tail=node->pre;
    }
    else
        node->next->pre=p;
    ls.length--;
    delete node;
    return OK;
}

Status LinkList_Find(LinkList ls, int i, ElemType& e)
{
    LinkListNode* node = new LinkListNode();
    int j=0;
    node=ls.head;
    while(node && j<i)
    {
        node=node->next ;
        j++;
    }

    if(!node)return NOT_FOUND;
    e=node->data;
    return OK;
}

Status LinkList_back(LinkList& ls, ElemType& e)
{
    if(ls.length==0)
        return NOT_FOUND;
    e=ls.tail->data;
    return OK;
}

Status LinkList_front(LinkList& ls, ElemType& e)
{
    if(ls.length==0)
        return NOT_FOUND;
    e=ls.head->data;
    return OK;
}

Status LinkList_pop_front(LinkList& ls, ElemType& e)
{
    if(ls.length==0)
        return ERROR;
    LinkListNode* node = new LinkListNode();
    node=ls.head;
    e=node->data;
    ls.head=node->next;
    ls.length--;
    delete node;
    return OK;
}

Status LinkList_pop_back(LinkList& ls, ElemType& e)
{
    if(ls.length==0)
        return ERROR;

    LinkListNode* node = new LinkListNode();
    node=ls.tail;
    e=node->data;
    ls.tail=node->next;
    ls.length--;
    delete node;
    return OK;
}

int LinkList_size(LinkList ls)
{
    return ls.length;
}

Status LinkList_clear(LinkList &ls)
{
    LinkListNode* node = new LinkListNode();

    while(ls.length)
    {
        ls.length--;
        node=ls.head;
        ls.head=node->next;
        delete node;
    }
    return OK;
}
void TraverseList(LinkList ls)
{
    LinkListNode* node = new LinkListNode();
    node=ls.head;
    while(node)
    {
        printf("%d ", node->data);
        node=node->next;
    }
    printf("\n");
}

int main()
{
    LinkList list;
    int n, num, e;
    int Insert_index, Delete_index, Find_index;

    printf("请输入链表中的元素个数:");
    scanf("%d", &n);
    printf("请输入链表中的元素值:");
    for(int i=0; i<n; i++)
    {
        scanf("%d", &num);
        LinkList_push_back(list, num);
    }
    TraverseList(list);
    printf("输出链表的长度:%d\n", LinkList_size(list));

    printf("请输入插入下标和元素:");
    scanf("%d%d", &Insert_index, &e);
    if(LinkList_insert(list, Insert_index, e)==1)
    {
        printf("插入成功,输出改变后的链表:");
        TraverseList(list);
        printf("\n");
    }
    else
        printf("插入失败\n");


    printf("请输入删除元素的下标:");
    scanf("%d", &Delete_index);
    if(LinkList_Erase(list, Delete_index, e)==1)
    {
        printf("删除成功,输出被删除的元素:%d\n", e);
        printf("输出改变后的链表:");
        TraverseList(list);
        printf("\n");
    }
    else
        printf("删除失败\n");

    printf("请输入查找元素的下标:");
    scanf("%d", &Find_index);
    if(LinkList_Find(list, Find_index, e)==1)
    {
        printf("查找成功!输出查找到的元素:%d\n", e);
    }
    else
    {
        printf("查找失败!\n");
    }

    printf("请输出首元素:");
    if(LinkList_front(list, e)==2)
        printf("not_found\n");
    else
        printf("%d\n", e);

    printf("请输出尾元素:");
    if(LinkList_back(list, e)==2)
        printf("not_found\n");
    else
        printf("%d\n", e);

    LinkList_clear(list);
    printf("输出链表的长度:%d\n", LinkList_size(list));
    return 0;
}

/*
5
11 12 23 34 45
3 9
2
3
*/

 

posted @ 2017-03-31 17:30  爱记录一切美好的微笑  阅读(153)  评论(0编辑  收藏  举报