【代码详解之Day10篇】

doublelist.c (双向循环链表的功能函数)

#include"doublelist.h"

创建一个空的双向循环链表

//创建一个空的双向循环链表
doublelist * DoubleListCreate()
{
    //强转,在堆区创建空间
    doublelist *head = (doublelist *)malloc(sizeof(doublelist));
    
    //自己指向自己
    head->front = head;
    head->next = head;
    
    return head;
}

插入数据

//插入数据
void DoubleListInsert(doublelist *head,DataType value)
{
    //设置一个新的指针tmp
    doublelist *tmp = (doublelist *)malloc(sizeof(doublelist));

    //初始化tmp指针
    tmp->front = NULL;
    tmp->next = NULL;
    tmp->data = value;

    tmp->next = head->next;//tmp的next指针域保存head的后继结点的地址
    tmp->front = head;//tmp的front指针域保存head的地址
	
	head->next->front = tmp; head->next 指原先的第一个结点,其front指针域的地址指向tmp
    head->next = tmp;//tmp成为head新的后继结点
 
}

遍历双向循环链表

//遍历双向循环链表
void DoubleListPrint(doublelist *head)
{
    doublelist *p = head;
    while(p->next != head)//因为是循环链表所以最后一个指向头结点,
                        //当p->next = head时,说明遍历结束
    {
        p = p->next;
        printf("%d ",p->data);
    }
    putchar(10);//相当于换行,回车的ascall码为 10
}

//判断双向循环链表是否为空
int DoubleListIsEmpty(doublelist *head)
{
    return head->next == head ? 1 : 0;//三目运算
}

头删法删除数据

//头删法删除数据
DataType DoubleListDelete(doublelist *head)
{
    if(DoubleListIsEmpty(head))
    {
        printf("删除失败,该链表为空!\n");
        return (DataType)-1;
    }
    //临时保存数据
    DataType value = head->next->data;
    //tmp指针临时保存第一个结点的地址
    doublelist *tmp = head->next;

    //head的next指针域的地址指向 tmp此时的next指针域保存的地址,也就是第二个结点的地址
    head->next = tmp->next;
    
    //因为删除第一个结点所以此时第二个结点的fornt指向head结点
    tmp->next->front = head;

    free(tmp);
    tmp = NULL;

    return value;

}

seqstack.c (顺序栈的功能函数)

创建栈

//创建栈
seqstack* SeqStackCreate()
{
    seqstack *s = (seqstack *)malloc(sizeof(seqstack));
    s->pos = -1;//初始化,栈顶指向NULL
    return s;
}

判断栈是否为满

//判断栈是否为满
int SeqStackIsFull(seqstack *s)
{
    return s->pos == N - 1 ? 1 : 0; //三目运算
}

//判断栈是否为空
int SeqSrackIsEmpty(seqstack *s)
{
    return s->pos == -1 ? 1 : 0; //三目运算
}

入栈

//入栈
void SeqStackPush(seqstack *s,DataType value)
{
    if(SeqStackIsFull(s))
    {
        printf("栈满了!\n");
        return;
    }
    s->pos++; //自增,栈顶位置往上移动一个
    s->data[s->pos] = value; //将value的值赋给s->pos位置上的数据s->data
    return;
}

出栈

//出栈
DataType SeqStackPop(seqstack *s)
{
    if(SeqSrackIsEmpty(s))
    {
        printf("栈为空!\n");
        return (DataType)-1;
    }
    DataType value = s->data[s->pos]; //将s->pos位置上的数据s->data的值赋给 value
    s->pos--; //自减,栈顶位置往下移动一个
    return value;
}

linkstack.c (链栈的功能函数)

#include"linkstack.h"

初始化栈信息

//初始化栈信息
void InitStack(stack *s)
{
    s->length = 0;
    s->top = NULL;
}

入栈

//入栈
void push(stack *s,DataType value)
{
    if(NULL == s)//如果栈s为空
    {
        printf("栈空间分配失败,初始化失败!\n");
        return;
    }
    Node *tmp = (Node *)malloc(sizeof(Node));
    //初始化指针tmp
    tmp->next = NULL;
    tmp->data = value;

    tmp->next =  s->top;//tmp入栈
    s->top = tmp; //s->top上移到栈顶
    s->lemhth++;//自增因为入栈了一个结点,所以长度加一
}

获取栈顶元素

//获取栈顶元素
DataType GetTop(stack *s)
{
    if(NULL == s)//如果栈s为空
    {
        return (DataType)-1;
    }
    if(s->top == NULL)//如果栈顶为空
    {
        return (DataType)-1;
    }
    return s->top->data; //返回栈顶结点的数据
}

出栈

//出栈
DataType pop(stack *)
{
    if(NULL == s)//如果栈s为空
    {
        return (DataType)-1;
    }
    if(s->top == NULL)//如果栈顶为空
    {
        return (DataType)-1;
    }
    Node *tmp = s->top;//定义一个指针tmp
    s->top = tmp->next;//s->top指向tmp的next指针域保存的地址,即:下移一位
    DataType value = tmp->ndata;//定义一个数据保存
    free(tmp);//释放指针tmp
    tmp = NULL;

    s->length--;//自减,因为出栈了一个结点,所以长度减一
    return value;
}

判断栈是否为空

//判断栈是否为空
int EmptyStack(stack *s)
{
    return s-top == NULL ? 1 : 0; //三目运算
}

//清空栈
int ClearStack(stack *s)
{
    if(NULL == s) //如果栈s为空
    {
        return (DataType)-1;
    }
    if(s->top == NULL)//如果栈顶为空
    {
        return (DataType)-1;
    }
    Node *tmp = s->top; //定义一个指针tmp
    while(tmp)//即 while(tmp != NULL)
    {
        s->top = tmp->next; //s->top指向tmp的next指针域保存的地址,即:下移一位
        free(tmp); //释放指针tmp现在保存的地址,相当于一次出栈
        tmp = s->top;//指针tmp再次指向s->top
        s->length--;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗子爱猫粮855

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值