数据结构--双向链表

#include<stdio.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct linode
{
    STDataType data;
    struct linode* next;
    struct linode* prve;
}SL;
//双向链表实现的函数功能有 :1.申请动态内存空间 2.初始化 3.双向链表的头,尾的插入与删除,在合法的任意位置进行插入和删除 4.释放链表,5.打印链表
//申请动态内存空间
SL* Bylist(STDataType x)//会写到插入函数中
{
    SL* newnode = (SL*)malloc(sizeof(SL));
    newnode->data = x;
    newnode->next = NULL;
    newnode->prve = NULL;

    return newnode;
}
//初始化(创建一个链表的头
SL* ListCreate()
{
    SL* phead = Bylist(0);
    phead->next = phead;
    phead->prve = phead;
    return phead;
}
SL* plist = ListCreate();//创建返回链表的头结点
//尾插法
void ListPushBack(SL* pHead, STDataType x)
{
    SL* end = pHead->prve;//表尾
    SL* newnode = Bylist(x);//创建一个节点
    end->next = newnode;
    newnode->prve = end;//存放尾节点的地址
    newnode->next = pHead;//将现在的表尾指向表头
    pHead->prve = newnode;//再让表头指向上一个的指针
}
//尾删法
void ListPopBack(SL* pHead)
{
    SL* end = pHead->prve;//找到最后一个节点
    SL* cur = end->prve;//倒数第二个节点
    cur->next = pHead;
    pHead->prve = cur;
    free(end);
    end = NULL;
}
//头插法
void ListPushFront(SL*pHead, STDataType x)
{
    SL* cur = pHead->next;//表头的下一个节点
    SL* newnode = Bylist(x);
    pHead->next = newnode;
    newnode->prve = pHead;
    cur->prve = newnode;    
}
//头删法
void ListPopFront(SL* pHead)
{
    SL* cur = pHead->next;
    SL* cur2 = cur->next;//第三个节点
    pHead->next = cur2;
    cur2->prve = pHead;
    free(cur);
}
//查找
SL* ListFind(SL* pHead, STDataType x)//查找
{
    SL* cur = pHead->next;
    while (cur != pHead)
    {
        if (cur->data == x)
            return cur;
        cur = cur->next;
    }

    return NULL;
}
SL* pos = ListFind(plist, 5);
//对pos前一个位置进行插入数据(略)
//对pos这个位置进行深处(略)
//链表的打印
void ListPrint(SL* pHead)//打印链表
{
    SL* cur = pHead->next;//表头的下一个数据
    while (cur != pHead)
    {
        printf("%d->", cur->data);
        cur = cur->next;
    }
    printf("pHead");
}
//链表的释放
void ListDestory(SL* pHead)
{
    SL* cur = pHead->next;
    while (cur != pHead)
    {
        SL* cur2 = cur->next;
        free(cur);
        cur = cur2;
    }
    free(pHead);
    pHead = NULL;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值