数据结构的队列,链表,栈的基础操作

1:队列

 #include <stdio.h>
 #include <stdlib.h>
 #include "./02队列.h"
 
 
 /*
  * function:    创建一个空的队列
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 Sequeue* xinduilie()
 {
     Sequeue* sq = (Sequeue*)malloc(sizeof(Sequeue));         
     if(NULL == sq)
     {
         printf("创建失败!!!\n");
     }
     sq->front = sq->rear = 0;
     return sq;
 }
 /*
  * function:    判满
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 int panman(Sequeue* sq)
 {
     return  (sq->rear+1)%(N+1) == sq->front ? 1:0;
 
 }
 /*
  * function:    入队
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 void rudui(Sequeue* sq,datatype num)
     {
         if(panman(sq))
         {
             printf("插入失败,队列已满\n");
             return;
         }
        sq->data[sq->rear]= num;
        sq->rear = (sq->rear+1)%(N+1);
        printf("入队成功%d\n",num);                       
        return;
    }
/*
 * function:    出队
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void chudui(Sequeue* sq)
{
    if(sq->front == sq->rear)
    {
        printf("队列为空!!!\n");
    }
    Sequeue* num = sq->data[sq->front];
    printf("出队的值为%d\n",num);
    sq->front = (sq->front+1)%N;
    return;
}
/*
 * function:    遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void bianli(Sequeue* sq )
{
    for(int i=sq->front;i!=sq->rear;i=(i+1)%(N+1))
    {
        printf("%d ",sq->data[i]);
    }
    putchar(10);
    return;
}
/*
 * function:    判空
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pankon(Sequeue* sq)
{                                              
        return sq->rear==sq->front ? 1:0;
}
/*
 * function:    出队
 * @param [ in] 
 * @param [out] 
 * @return      
 
datatype chudui(Sequeue* sq)
{
    if(pankon(sq) == 0)
    {
        printf("出队失败,队列为空\n");
    }
    datatype num = sq->data[sq->front];
    sq->front - (sq->front+1)%(N+1);

    return num;
}
*/

/*
 * function:    计算队列个数
 * @param [ in] 
 * @param [out] 
 * @return      
 */
datatype jisuan(Sequeue* sq)
{
    return (sq->rear-sq->front+N+1)%(N+1);
}

头文件:

1 #ifndef __02队列_H__
  2 #define __02队列_H__
  3 #define N 5
  4 typedef int datatype ;
  5 typedef struct 
  6 {
  7     int front;
  8     int rear;
  9     datatype data[N+1];
 10 }Sequeue;
 11 Sequeue* xinduilie();//创建一个新的队列
 12 void rudui(Sequeue* sq,datatype num) ;//入队
 13 void chudui(Sequeue* sq);//出队 
 14 int panman(Sequeue* sq);//判满
 15 void bianli(Sequeue* sq );//遍历                                    
 16 int pankon(Sequeue* sq);//判空
 17 datatype jisuan(Sequeue* sq);//计算个数
#endif

主函数:

#include <stdio.h>
#include "./02队列.h"
int main(int argc, const char *argv[])
{
    Sequeue* sq = xinduilie();
    rudui(sq,20); 
    rudui(sq,20);
    rudui(sq,60);
    rudui(sq,27);
    rudui(sq,29);
    chudui(sq);
    bianli(sq);
    printf("队列有效个数:%d\n",jisuan(sq));         
    return 0;
}   

结果图:

2:链式队列:

功能代码

 #include <stdio.h>
 #include <stdlib.h>
 #include "./03链式队列.h"
 
 /*
  * function:    创建一个空的链式队列
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 QueueOp* create_linkqueue()
 {
     QueueOp*  fp = (QueueOp*)malloc(sizeof(QueueOp));
     fp->front = (Lnkqueue*)malloc(sizeof(Lnkqueue));
     if(fp->front == NULL)
     {
         printf("创建失败!\n");
         return NULL;
     }
     //初始化,下标地址及有效长度
     fp->front->next = NULL;
     fp->front->msg.len = 0;
     fp->rear = fp->front;
     printf("创建成功!\n");                               
     return fp;
 }
 /*
  * function:    尾插
  * @param [ in] 
 * @param [out] 
 * @return      
 */
void del_list(QueueOp* head,datatype num)
{
    Lnkqueue* temp = (Lnkqueue*)malloc(sizeof(Lnkqueue));

    if(temp == NULL)                                        
    {
        printf("创建失败,节点为空\n");
        return;
    }
    //给链表插入值
    temp->msg.data = num;
    temp->next = NULL;

    temp->next = head->rear->next;
    head->rear->next = temp;
    //更新rear指向
    head->rear = head->rear->next;
    head->front->msg.len++;
    printf("插入成功%d\n",num);
    return;
}
/*
 * function:    判空
 * @param [ in] 
 * @param [out] 
  * @return      
  */
 int isEmpty_list(QueueOp* head)
 {                                                       
     return head->front == head->rear ? 1:0;
 }
 
 /*
  * function:    出栈
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 datatype output_list (QueueOp* head)
 {
     if(isEmpty_list(head))
     {
         printf("队列为空,出队失败\n");
         return (datatype) -1;
     }
     Lnkqueue* temp = head->front->next;
     head->front->next = temp->next;
 
     datatype num = temp->msg.data;
     if(head->front->next == NULL)
     {
         head->rear = head->front;
     }
     head->front->msg.len--;
     return num;
     free(temp);
 }
 /*
  * function:    遍历                              
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 void bianli_list(QueueOp* head)
 {
     while(head->front->next != head->rear->next)
     {
         head->front = head->front->next;
         printf("%d ",head->front->msg.data);
     }
     putchar(10);
     return;
 
 }

主函数

#include <stdlib.h>
#include "./03链式队列.h"
int main(int argc, const char *argv[])
{
        QueueOp* head = create_linkqueue();
        del_list(head,10);
        del_list(head,20);
        del_list(head,30);
        del_list(head,40);
        printf("%d\n",output_list(head));        
        bianli_list(head);
    return 0;
}   

头文件函数

#ifndef __03链式队列_H__
#define __03链式队列_H__

typedef int  datatype;
typedef struct lnkq
{
    union
    {
        int len;
        datatype data;
    }msg;
    struct lnkq *next;
}Lnkqueue; 
//用于存储头结点尾节点地址
typedef struct 
{
    Lnkqueue* front;
    Lnkqueue* rear;
}QueueOp;

QueueOp* create_linkqueue();//创建链式列表成功
void del_list(QueueOp* head,datatype num);//尾插
datatype output_list (QueueOp* head);//出栈       
void bianli_list(QueueOp* head);//遍历

#endif

结果图:

3:双向链表

功能代码:

include <stdlib.h>
include <stdio.h>
include "./02双向链表.h"

*
* function:    创建一个双向链表
* @param [ in] 
* @param [out] 
* @return      
*/
oublelist* lianbiao()

   Doublelist* twolianbiao = (Doublelist* )malloc(sizeof(Doublelist));
   if(NULL == twolianbiao)
   {
       printf("创建失败,链表为空\n");
   }
   //初始化双向链表
   twolianbiao->next = NULL;
   twolianbiao->prev = NULL;
   twolianbiao->msg.len = 0;
   return twolianbiao;

*
* function:    头插
* @param [ in] 
* @param [out] 
* @return      
*/
oid headcha(Doublelist* head,datatype num)

   Doublelist* temp = (Doublelist*)malloc(sizeof(Doublelist));
   if(NULL == temp)
   {
       printf("插入失败,创建新结点失败!!!\n");
   }
   temp->msg.data = num;    //给temp赋值
   temp->next = head->next; //修改next指向
   head->next = temp;

   temp->prev = head;//修改prev指向
                                                                                    
   if(temp->next != NULL)
   {
       temp->next->prev = temp;
   }
   printf("头插入成功=%d\n",num);
   head->msg.len++;
   return;

*
* function:    尾插
* @param [ in] 
* @param [out] 
* @return      
*/
oid ledcha (Doublelist* head,datatype num)

   Doublelist* temp =(Doublelist*)malloc(sizeof(Doublelist));
   temp->msg.data = num;//创建新节点并存入值
   temp->next = NULL;

   Doublelist* p = head;
   while(p->next != NULL)
   {
       p=p->next;
   }
   temp->next=p->next;
   p->next = temp;//更改next的指向

   temp->prev = p;//更改prev的指向

   printf("尾插入成功=%d\n",num);
   head->msg.len++;
   return;

*
* function:    头删
* @param [ in] 
* @param [out] 
* @return      
*/
oid headshan(Doublelist* head)

   if(head->next == NULL)
   {
       printf("删除失败,链表为空!!!\n");
   }
   Doublelist* p=head;
   Doublelist* temp = p->next;
   datatype num = temp->msg.data;
   p->next=temp->next;//修改next的指向

   if(temp->next != NULL)
   {
       temp->next->prev = p;
   }
   printf("删除的值=%d\n",temp->msg.data);
   free(temp);
   temp->next = NULL;
   head->msg.len--;

*
* function:    尾删
* @param [ in] 
* @param [out] 
* @return      
*/
oid ledshan(Doublelist* head)

   if(head->next == NULL)
   {
       printf("删除失败,链表为空!!!\n");
   }
   Doublelist* p = head;
   while(p->next != NULL)
   {
       p = p->next;
   }
   datatype num = p->msg.data;
   p->prev->next = p->next;
   printf("删除的值=%d\n",num);
   free(p);
   head->msg.len--;
   return;


*
* function:    判空 
* @param [ in] 
* @param [out] 
* @return      
*/
nt pankon(Doublelist* head)
 return  head->next == NULL ? 1:0 ;}

*
* function:    中间插入
* @param [ in] 
* @param [out] 
* @return      
*/
oid middlecha(Doublelist* head,datatype num,int n)

   if(n<=0)
   {
       printf("插入失败,插入的位置非法!!!\n");
       return;
   }
   Doublelist* p = head;
   for(int i=0;i<n-1;i++)
   {
       p=p->next;
       printf("%d\n",head->msg.len);
         if(NULL == p)
         {                                                           
             printf("插入位置非法!!!\n");
             return;
         }
     }
     Doublelist* temp=(Doublelist*)malloc(sizeof(Doublelist));
     if(NULL == temp)
     {
         printf("创建失败!,插入失败!!!\n");
         return;
     }
     temp->msg.data = num;
     temp->next = NULL;
     temp->prev = NULL;
 
     temp->next = p->next;
     p->next = temp;
 
     temp->prev = p;
     if(temp->next != NULL)
     {
         temp->next->prev = temp;
     }
     printf("在第%d个位置插入的值是%d\n",n,num);
     head->msg.len++;
     return;
 }
 
 /*
  * function:    中间删除
  * @param [ in] 
  * @param [out] 
  * @return      
  */
 void middleshan(Doublelist* head,int n)
 {
     if(head->next ==NULL || head == NULL)
     {
         printf("删除失败,链表为空!!!%d\n");
         return;
     }
     if(n <= 0);
     {
         printf("删除位置非法!!!%d\n",n);
         return;
     }
     Doublelist* p = head;
     for(int i=0;i<n;i++)
     {
         p=p->next;
         if(NULL == p)
         {
             printf("%d删除位置非法!!!\n",n);
             return;
         }
     }
     p->prev->next = p->next;
     if(p->next != NULL)
         {
             p->next->prev = p->next;
         }
     datatype num = p->msg.data;
     free(p);
         head->msg.len --;
     return;
 }
 
 

头文件:

#ifndef __02双向链表_H__                                          
#define __02双向链表_H__

typedef int datatype;
typedef struct doublelist
{
    union
    {
        int len;
        datatype data;
    }msg;
     struct doublelist* next;
     struct doublelist* prev;
}Doublelist;


Doublelist* lianbiao();//创建一个空的双向链表
void headcha(Doublelist* head,datatype num);//头插
void ledcha (Doublelist* head,datatype num);//尾插
void headshan(Doublelist* head);//头删
void ledshan(Doublelist* head);//尾删
void middlecha(Doublelist* head,datatype num,int n);//中间插入
void middleshan(Doublelist* head,int n);//中间删除




#endif
                                                                  
                                                                  

主函数main:

 #include <stdio.h>                        
 #include "./02双向链表.h"
 int main(int argc, const char *argv[])
 {
     Doublelist* head = lianbiao();
     headcha(head,10);
     headcha(head,10);
     ledcha(head,90);
     headshan(head);
     ledshan(head);
     ledcha(head,80);
     ledcha(head,60);
     middlecha(head ,50,3);
     middleshan(head,2);
     return 0;
 }
                                           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704416.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 反射机制 -- Java 语言反射的概述、核心类与高级应用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 010 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…

镜像拉取失败:[ERROR] Failed to pull docker image

问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误&#xff1a; permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…

在Lua解释器中注册自定义函数

本文目录 1、引言2、函数注册2.1注册原理 2.2 注册函数 3、实操3.1 编写注册函数3.2编写测试代码 4、结论 文章对应视频教程&#xff1a; 暂无&#xff0c;可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在之前的博客中&#xff0c;已经介绍了如何…

JAVA小知识17:数组,从0基础到掌握

数组&#xff0c;无论在哪种编程语言当中都是最基础&#xff0c;最广泛使用的一种线性表数据结构&#xff0c;这篇文章将从多个角度来从浅入深的讲述数组。 本文讲述了数组的概念&#xff0c;定义&#xff0c;初始化方法以及如何遍历数组&#xff0c;如何赋值&#xff0c;关于数…

4. Revit API UI 之 Ribbon(界面)

4. Revit API UI 之 Ribbon&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…

剧透!「飞凌嵌入式技术创新日」3大亮点抢先看

6月25日&#xff0c;飞凌嵌入式技术创新日&#xff08;北京站&#xff09;即将开幕&#xff0c;一场嵌入式前沿科技的高端局就在眼前。 飞凌嵌入式作为国内较早专业从事嵌入式技术的企业&#xff0c;凭借18年的行业深耕和丰富的技术积累&#xff0c;已在业界赢得了广泛的影响力…

LabVIEW电源适应能力检测系统

随着工业自动化程度的提高&#xff0c;电源质量直接影响设备的稳定运行。利用LabVIEW开发一个单相电源适应能力检测系统&#xff0c;该系统通过智能化和自动化测试&#xff0c;提高了测试效率&#xff0c;减少了人为错误&#xff0c;保证了电源质量的可靠性。 项目背景 在现代…

大厂面试必备:如何轻松实现分布式Session管理?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!​​​​​​​ 大家好,我是小米,一个29岁的技术爱好者,喜欢分享各种技术干货。今天我们来聊一聊阿里巴巴面试中的一个经典问题:如何实现分布式Sess…

HCIA12 NAT网络地址转换实验

NAT&#xff08;Network Address Translation&#xff09;是将 IP 报头中的 IP 地址转换为另一个 IP 地址的过程。主要俩好处&#xff1a; • 有效避免来自外网的攻击&#xff0c;可以很大程度上提高网络安全性。 • 控制内网主机访问外网&#xff0c;同时也可以控制外网…

你的医书是假的!批评《DDD诊所——聚合过大综合症》(合集)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;《你的医书是假的&#xff01;》原文写于2023年8月&#xff0c;以系列文章方式发表&#xff0c;现合并成一篇文章&#xff09; 一、说在前面 这两天在“ Thoughtworks洞见…

Mac vscode could not import github.com/gin-gonic/gin

问题背景&#xff1a; 第一次导入一个go的项目就报红 问题分析&#xff1a; 其实就是之前没有下载和导入gin这个web框架包 gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确。 问题解决&#xff1a; 依次输入以下命令。通…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…

阿里最强开源大模型本地部署、API调用和WebUI对话机器人

阿里巴巴通义千问团队发布了Qwen2系列开源模型&#xff0c;该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。对比当前最优的开源模型&#xff0c;Qwen2-72B在包括自然语言理解、知识、代码、数学及多…

新加坡裸机云多IP服务器为何适合跨境外贸业务

新加坡裸机云多IP服务器在跨境外贸业务中展现出了卓越的适配性&#xff0c;其独特优势为外贸企业提供了强大的支持。以下将详细阐述为何新加坡裸机云多IP服务器是跨境外贸业务的理想选择。 首先&#xff0c;新加坡裸机云多IP服务器在性能上表现出色。由于去除了虚拟化层的开销&…

聚观早报 | 粉笔将推AI智能老师;比亚迪宋L DM-i车型官宣

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月13日消息 粉笔将推AI智能老师 比亚迪宋L DM-i车型官宣 真我GT7 Pro配置全面升级 理想发布最新单周销量榜单 …

如何免费用 Qwen2 辅助你翻译与数据分析?

对于学生用户来说&#xff0c;这可是个好消息。 开源 从前人们有一种刻板印象——大语言模型里好用的&#xff0c;基本上都是闭源模型。而前些日子&#xff0c;Meta推出了Llama3后&#xff0c;你可能已经从中感受到现在开源模型日益增长的威力。当时我也写了几篇文章来介绍这个…

SMT智能车间MES系统的实施方案

SMT行业中MES系统实施的关键特征&#xff1a; SMT包括上下板设备&#xff0c;印刷设备&#xff0c;贴片设备&#xff0c;回流焊炉&#xff0c;AOI。AOI的全称是自动光学检查&#xff0c;它基于光学原理来检测焊接生产中遇到的常见缺陷。测试设备&#xff0c;测试设备等MES解决…

Java多商户商城系统/pc商城/公众号/h5/小程序

>>>系统简述&#xff1a; 基于java vue uniapp 开发的一套 新零售商城系统就是集客户关系管理营销电商系统&#xff0c;能够真正帮助企业基于微信公众号、小程序、移动端等&#xff0c;实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发…

Vite 为什么这么火?

大家好&#xff0c;我是前端宝哥。 最近&#xff0c;Vite 真是火得不行&#xff0c;几乎每天都能看到关于它的讨论。这个工具到底有多厉害&#xff1f;它为什么这么火&#xff1f; 自从 2020 年 4 月发布以来&#xff0c;Vite 的人气一路飙升。在 GitHub 上已经获得了 64k 的星…