链表--头插与尾插实现队列和栈

链表

链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.
链表中的数据是以节点来表示的.节点是由数据域(data) ,以及指针域(next) 构成.数据域存放数据, 指针域存放的是下一个节点的地址.
链表在内存中存储方式是非连续的,非顺序的.
在这里插入图片描述
链式存储结构如下:

typedef struct node_s
{
        int 			data;
        struct node_s  	*next;
} node_t;

队列与栈

队列 :只允许在表的前端进行删除操作,在表的后端进行插入操作的线性表.
栈 :只能在某一端插入和删除的特殊线性表.
简单来说 ,队列是数据先进先出(first in first out,FIFO), 栈是先进后出(first in last out,FILO).

头插法与尾插法

头插与尾插, 简单来说, 新malloc一个节点, 这个节点是插入在头部还是尾部.
在这里插入图片描述

链表的free

在这里插入图片描述

通过建立一个新指针 freenode, 让freenode 等于 *head(即head指向的节点), 让head等于第二个节点. 这样 就把我们要释放的节点断开, 并保证之后的节点处于链接状态. 不丢失数据. 我们此时释放freenode, 并将freenode 指针指向的空间赋值为NULL.

free函数的实现

void Free(node_t **head)
{
        node_t  *freenode=NULL;
        freenode = *head;

        while( *head!=NULL )
        {
                freenode = *head;
        		*head = (*head)->next;
                free(freenode);
        		freenode = NULL;
                printf("%p\n", freenode);	//打印地址来判断释放内存是否完全成功, 即看打印次数
        		printf("bye\n");
        }
                return ;
}

通过尾插法实现队列

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void Free(node_t **head);

typedef struct node_s
{
        int data;
        struct node_s   *next;
} node_t;

int main (int argc, char **argv)
{ 
        node_t          *head = NULL;
        node_t          *new_node;
        node_t          *tail;
        int             i;

		//for循环实现尾插法
        for(i=0; i<10; i++)
        {
                new_node = (node_t *)malloc(sizeof(node_t));
                memset(new_node, 0, sizeof(node_t) );
                new_node->next = NULL;
                new_node->data = i+1;
                
                if( head == NULL )
                {
                        head = new_node;
                }
                else
                {
                        tail->next = new_node;
                }

                tail = new_node;
                
                new_node->next = head;
                head = new_node;
        }
        
        {
                node_t  *node=NULL;
				//遍历链表
                for(node=head; node!=NULL; node=node->next)
                {
                        printf("%d\n",node->data);
                }
        }  
        //释放链表
        Free(&head);      
        return 0;
 }
 
void Free(node_t **head)
{
        node_t  *freenode=NULL;
        freenode = *head;

        while( *head!=NULL )
        {
                freenode = *head;
        		*head = (*head)->next;
                free(freenode);
        		freenode = NULL;
                printf("%p\n", freenode);	//打印地址来判断释放内存是否完全成功, 即看打印次数
        		printf("bye\n");
        }
                return ;
}

输出结果为:
我们可以观察到一共free十次, 每释放一次就将freenode指针赋值为NULL.
在这里插入图片描述

通过头插法实现栈

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node_s
{
        int data;
        struct node_s   *next;
} node_t;

int main (int argc, char **argv)
{ 
        node_t          *head = NULL;
        node_t          *new_node;
        int             i;

        for(i=0; i<10; i++)
        {
                new_node = (node_t *)malloc(sizeof(node_t));
                memset(new_node, 0, sizeof(node_t) );
                new_node->next = NULL;
                new_node->data = i+1;
                
                new_node->next = head;
                head = new_node;
        }
        
        {
                node_t  *node=NULL;

                for(node=head; node!=NULL; node=node->next)
                {
                        printf("%d\n",node->data);
                }
        }
        return 0;
 }

输出结果为:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值