链式栈、队列

1、链式栈:

声明:

#ifndef _STACK_H
#define _STACK_H
#include<stdlib.h>

typedef int DataType;

typedef struct snode    //节点
{
    DataType data;
    struct snode *pnext;
}SNode_t;

typedef struct stack    //链表 
{
    SNode_t *ptop;
    int clen;
}Stack_t;

extern Stack_t *create_stack();
extern int push_stack(Stack_t *stack,DataType data);
extern int pop_stack(Stack_t *stack , DataType data);
extern int get_stack_top(Stack_t *stack,DataType *data);
extern void clear_stack(Stack_t *stack);
extern void destroy_stack(Stack_t *stack);
extern int is_empty_stack(Stack_t *stack);
extern void print_stack(Stack_t *stack);



#endif

链表:

Stack_t *create_stack()
{
    Stack_t *stack = malloc(sizeof(Stack_t));
    if(stack == NULL)
    {
        perror("create fail\n");
        return NULL;
    }
    stack->ptop = NULL;
    stack->clen =  0;
    return stack;
}

int push_stack(Stack_t *stack,DataType data)
{
    SNode_t *snode = malloc(sizeof(SNode_t));
    if(NULL == snode)
    {
        perror("fail malloc\n");
        return 0;
    }
    
    snode->data = data;
    snode->pnext = NULL;
    
    snode->pnext = stack->ptop;
    stack->ptop = snode;
    stack->clen++;
    return 1;
}

int get_stack_top(Stack_t *stack,DataType *data)
{
   if(stack->ptop == NULL) 
   {
    return 0;
   }
   *data = stack->ptop->data;
   printf("%d\n",*data);
   return 1;
}

int is_empty_stack(Stack_t *stack)
{
   return stack->ptop == NULL; 
}
int pop_stack(Stack_t *stack,DataType *data)
{
    if(is_empty_stack(stack))
    {
        return 0;
    }
    SNode_t *snode = stack->ptop;
    *data = snode->data;
    if(snode->pnext != NULL)
    {
    stack->ptop = snode->pnext;
    stack->clen--;
    }
    else
    {
        stack->ptop = NULL;
    }
    free(snode);
    return 1;
}

void destroy_stack(Stack_t *stack)
{
    DataType data;
    while(!(is_empty_stack(stack)))
    {
        pop_stack(stack,&data);
    }
    free(stack);
    return;
}

void clear_stack(Stack_t *stack)
{
    if(is_empty_stack(stack))
    {
        return;
    }
    SNode_t *snode = stack->ptop;
    while(stack->ptop != NULL)
    {
        snode = stack->ptop;
        stack->ptop = snode->pnext;
        free(snode);
    }
    stack->clen = 0;
}

void print_stack(Stack_t *stack)
{
    if(is_empty_stack(stack))
    {
        printf("stack empty");
        return;
    }
    SNode_t *snode = stack->ptop;
    while(snode != NULL)
    {
        printf("%d\n",snode->data);
        snode = snode->pnext;
    }
}

主函数调用:

#include<stdio.h>
#include"stack.h"

int main()
{
    DataType data;
    Stack_t *stack = create_stack();
    
    push_stack(stack,1);
    push_stack(stack,2);
    push_stack(stack,3);
    push_stack(stack,4);
    print_stack(stack);
    pop_stack(stack,&data);
   
    print_stack(stack);
    get_stack_top(stack,&data);
    //clear_stack(stack);
    //print_stack(stack);
    printf("----------\n");
    destroy_stack(stack);
    return 0;
}

2、队列

声明:

#ifndef _QUEUE_H
#define _QUEUE_H
#include <pthread.h>
#include<stdlib.h>

typedef int QDataType;

typedef struct qnode           //节点
{
    QDataType data;
    struct qnode *pnext;
}Qnode_t;

typedef struct queue   //队列
{
    Qnode_t *pfront;
    Qnode_t *prear;
    int clen;
    pthread_mutex_t mutex;
}Queue_t;

Queue_t *create_queue();
int is_empty_queue(Queue_t*queue);
int push_queue(Queue_t* queue,QDataType data);
int pop_queue(Queue_t *queue,QDataType *data);
int get_queue_front(Queue_t *queue,QDataType *data);
void clear_queue(Queue_t *queue);
void destroy_queuey(Queue_t *queue);
extern void print_queue(Queue_t *queue);

#endif

队列:

#include<stdio.h>
#include"queue.h"

Queue_t *create_queue()
{
    Queue_t *queue = malloc(sizeof(Queue_t));
    if(queue == NULL)
    {
        perror("fail create_queue ");
        return NULL;
    }
    queue->pfront = NULL;
    queue->prear = NULL;
    queue->clen = 0;
    return queue;
}

int is_empty_queue(Queue_t *queue)
{
    return queue->pfront == NULL;
}

int push_queue(Queue_t *queue,QDataType data)
{
    Qnode_t *qnode = malloc(sizeof(Qnode_t));
	if (NULL == qnode)
	{
		perror("fail malloc");
		return -1;
	}
	qnode->data = data;
    qnode->pnext = NULL;
    if(is_empty_queue(queue))
    {
        queue->pfront = qnode;
        queue->prear = qnode;
    }
    else
    {
        queue->prear->pnext = qnode;
        queue->prear = qnode;
    }
    queue->clen++;
    return 0;
}
void print_queue(Queue_t *queue)
{
    Qnode_t *qnode = queue->pfront;
    while(qnode != NULL)
    {
        printf("%d",qnode->data);
        qnode = qnode->pnext;
    }
    printf("\n");
}
int pop_queue(Queue_t *queue,QDataType *data)
{
    if(is_empty_queue(queue))
    return 0;
    Qnode_t *qnode = queue->pfront;
    queue->pfront = qnode->pnext;
    if(data != NULL)
    {
        *data = qnode->data;
    }
    free(qnode);
    if(NULL == queue->pfront)
    {
        queue->prear = NULL;
    }
    queue->clen--;
    return 1;
}

int get_queue_front(Queue_t *queue,QDataType *data)
{
    if(is_empty_queue(queue))
        return 0;
    if(data == NULL)
        return 0;
    *data = queue->pfront->data;
    
    printf("*data = %d\n", *data);

    return 1;
}

void clear_queue(Queue_t *queue)
{
    while(!is_empty_queue(queue))
    {
        pop_queue(queue,NULL);
    }
}

void destroy_queuey(Queue_t *queue)
{
    clear_queue(queue);
    free(queue);
}

主函数调用

#include<stdio.h>
#include"queue.h"

int main(void)
{
    QDataType data;
    int ret;
    Queue_t *queue = create_queue();
    if(queue == NULL)
    {
        perror("fail create");
        return 0;
    }
    push_queue(queue,1);
    push_queue(queue,2);
    push_queue(queue,3);
    push_queue(queue,4);
    
    print_queue(queue); // 1234 
    pop_queue(queue,&data); //234
    pop_queue(queue,&data);  //34
    print_queue(queue);
    ret = get_queue_front(queue,&data);
    if(ret != 0)
    {
        printf("get head = %d\n",ret);
    }
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值