双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日
1.请编程实现双向链表的头插,头删、尾插、尾删

头文件:

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
enum{FALSE=-1,SUCCSE};
typedef struct Node
{datatype data;struct Node *next;struct Node *prev;
}*Doublelist;Doublelist create();
Doublelist insert_head(Doublelist head,datatype element);
Doublelist insert_rear(Doublelist head,datatype element);
void output(Doublelist head);
Doublelist delete_head(Doublelist head);
Doublelist delete_rear(Doublelist head);#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{Doublelist head=NULL;int n;printf("please enter n:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("please enter %d element:",i+1);scanf("%d",&element);head=insert_head(head,element);//head=insert_rear(head,element);}output(head);puts("");head=delete_head(head);output(head);puts("");head=delete_rear(head);output(head);return 0;
}

自定义函数:

#include"head.h"
/** function:    节点创建* @param [ in] * @param [out] 成功返回首地址,失败返回空* @return      */
Doublelist create()
{Doublelist s=(Doublelist)malloc(sizeof(struct Node));if(s==NULL)return NULL;s->data=0;s->next=s->prev=NULL;return s;
}
/** function:    头插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_head(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{s->next=head;head->prev=s;head=s;}return head;
}
/** function:    尾插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_rear(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{Doublelist p=head;while(p->next)p=p->next;p->next=s;s->prev=p;}return head;
}
/** function:    遍历输出* @param [ in] 头* @param [out] * @return      */
void output(Doublelist head)
{if(head==NULL){puts("empty");return;}Doublelist p=head;while(p){printf("%-5d",p->data);p=p->next;}
}
/** function:    头删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_head(Doublelist head)
{if(head==NULL)return NULL;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist del=head;head=head->next;free(del);head->prev=NULL;del=NULL;return head;
}
/** function:    尾删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_rear(Doublelist head)
{if(NULL==head)return head;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist p=head;while(p->next)p=p->next;Doublelist del=p;p->prev->next=NULL;free(del);del=NULL;return head;
}

头插、头删、尾删:

尾插、头删、尾删:


⒉请编程实现双向链表按任意位置插入、删除、修改、查找

头文件:

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
enum{FALSE=-1,SUCCSE};
typedef struct Node
{datatype data;struct Node *next;struct Node *prev;
}*Doublelist;Doublelist create();
Doublelist insert_head(Doublelist head,datatype element);
Doublelist insert_rear(Doublelist head,datatype element);
void output(Doublelist head);
Doublelist delete_head(Doublelist head);
Doublelist delete_rear(Doublelist head);
Doublelist insert_pos(Doublelist head,int pos,datatype element);
Doublelist delete_pos(Doublelist head,int pos);
void find_pos(Doublelist head,int pos);
int revise_pos(Doublelist head,int pos,datatype element);#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{Doublelist head=NULL;int n;printf("please enter n:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("please enter %d element:",i+1);scanf("%d",&element);//head=insert_head(head,element);head=insert_rear(head,element);}output(head);puts("");
/*	head=delete_head(head);output(head);puts("");head=delete_rear(head);output(head);
*/	int pos;
/*	printf("please enter pos:");scanf("%d",&pos);printf("please enter insert element:");scanf("%d",&element);head=insert_pos(head,pos,element);output(head);printf("please enter pos:");scanf("%d",&pos);head=delete_pos(head,pos);output(head);
*/	printf("please enter pos:");scanf("%d",&pos);find_pos(head,pos);printf("please enter pos:");scanf("%d",&pos);printf("please enter insert element:");scanf("%d",&element);int num=revise_pos(head,pos,element);if(num==-1)puts("ERROR");elseoutput(head);return 0;
}

自定义函数:

#include"head.h"
/** function:    节点创建* @param [ in] * @param [out] 成功返回首地址,失败返回空* @return      */
Doublelist create()
{Doublelist s=(Doublelist)malloc(sizeof(struct Node));if(s==NULL)return NULL;s->data=0;s->next=s->prev=NULL;return s;
}
/** function:    头插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_head(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{s->next=head;head->prev=s;head=s;}return head;
}
/** function:    尾插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_rear(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{Doublelist p=head;while(p->next)p=p->next;p->next=s;s->prev=p;}return head;
}
/** function:    遍历输出* @param [ in] tou* @param [out] * @return      */
void output(Doublelist head)
{if(head==NULL){puts("empty");return;}Doublelist p=head;while(p){printf("%-5d",p->data);p=p->next;}
}
/** function:    头删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_head(Doublelist head)
{if(head==NULL)return NULL;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist del=head;head=head->next;free(del);head->prev=NULL;del=NULL;return head;
}
/** function:    尾删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_rear(Doublelist head)
{if(NULL==head)return head;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist p=head;while(p->next)p=p->next;Doublelist del=p;p->prev->next=NULL;free(del);del=NULL;return head;
}
/** function:    计算长度* @param [ in] 头* @param [out] 长度* @return      */
int lengh(Doublelist head)
{int len=0;while(head){len++;head=head->next;}return len;
}
/** function:    按任意位置插入* @param [ in] 头 位置 插入元素* @param [out] 头* @return      */
Doublelist insert_pos(Doublelist head,int pos,datatype element)
{if(NULL==head || pos<1 || pos>lengh(head)+1){puts("POS ERROR OR EMPTY");return head;}if(pos==1){head=insert_head(head,element);return head;}else if(pos==lengh(head)+1){head=insert_rear(head,element);return head;}Doublelist s=create();s->data=element;Doublelist p=head;for(int i=1;i<pos-1;i++)p=p->next;s->next=p->next;p->next->prev=s;s->prev=p;p->next=s;return head;
}
/** function:    任意位置删除* @param [ in] 头 位置* @param [out] 头* @return      */
Doublelist delete_pos(Doublelist head,int pos)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return head;}if(pos==1)head=delete_head(head);else if(pos==lengh(head))head=delete_rear(head);else{Doublelist p=head;for(int i=1;i<pos-1;i++)p=p->next;Doublelist del=p->next;p->next=del->next;del->next->prev=p;free(del);del=NULL;}return head;
}
/** function:    任意位置查找* @param [ in] 头 位置* @param [out] * @return      */
void find_pos(Doublelist head,int pos)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return;}Doublelist p=head;for(int i=1;i<pos;i++)p=p->next;printf("The pos element is %d\n",p->data);
}
/** function:    任意位置修改* @param [ in] 头 位置 修改后的元素* @param [out] 成功返回0,失败返回-1* @return      */
int revise_pos(Doublelist head,int pos,datatype element)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return FALSE;}Doublelist p=head;for(int i=1;i<pos;i++)p=p->next;p->data=element;return SUCCSE;
}

任意位置插入:

任意位置删除:

任意位置查找:

任意位置修改:

3.请简述栈和队列的区别?

1、栈和队列的出入方式不同:栈是先进后出,队列是先进先出。

2、栈和队列的实现时操作位置不同:栈是出入在一端,后入先出,队列是出入在两端先进先出。

4.请简述什么内存泄露?

程序员释放在堆区申请的内存时,指针未指向释放内存的首地址,导致前部分内存未释放,且没有指针指向导致内存泄漏。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…

Visual Studio 20XX控制台程序鼠标点击阻塞问题

文章目录 方法一方法二 在Visual Studio 20xx编写的控制台程序中&#xff0c;当鼠标点击控制台时&#xff0c;会阻塞控制台程序运行&#xff0c;不按回车无法继续运行。 方法一 右击控制台标题栏&#xff0c;选择属性&#xff0c;去掉快速编辑模式(Q)的勾选&#xff0c;如&…

进程状态、排队

进程状态 1. 进程排队2. 进程各个状态3. 查看一个进程的状态4. linux内核描述进程状态5. 孤儿进程 1. 进程排队 进程为什么要排队呢&#xff1f;答案就是资源不够。需要等待某个软硬件资源&#xff0c;就像我们常用的scanf函数就是等待键盘资源。 之前的文章我们有个结论&#…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作&#xff0c;在MySQL中&#xff0c;这种JOIN操作有很多类型&#xff0c;包括内联接、左外连接、右外连接等等&#xff0c;而每种连接的含义都不一样&#xff0c;如果死记硬背&#xff0c;不仅很难记住&#xff0c;而且也容易搞混淆&#xff…

pytorch 利用Tensorboar记录训练过程loss变化

文章目录 1. LossHistory日志类定义2. LossHistory类的使用2.1 实例化LossHistory2.2 记录每个epoch的loss2.3 训练结束close掉SummaryWriter 3. 利用Tensorboard 可视化3.1 显示可视化效果 参考 利用Tensorboard记录训练过程中每个epoch的训练loss以及验证loss&#xff0c;便于…

前端工程化之:webpack3-5(css module)

目录 一、css module 1.思路 2.实现原理 3.如何应用样式 4.其他操作 &#xff08;1&#xff09;全局类名 &#xff08;2&#xff09;如何控制最终的类名 5.其他注意事项 一、css module 通过命名规范来限制类名太过死板&#xff0c;而 css in js 虽然足够灵活&…

京东首页移动端-web实战

设置视口标签以及引入初始化样式 <link rel"stylesheet" href"./css/normalize.css"><link rel"stylesheet" href"./css/index.css"> body常用初始化样式 body {width: 100%;min-width: 320px;max-width: 640px;margin:…

mysql 多数据源

依赖 <dependencies><!--mysql连接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--多数据源--><dependency><g…

VLM 系列——Llava1.6——论文解读

一、概述 1、是什么 Llava1.6 是llava1.5 的升级暂时还没有论文等&#xff0c;是一个多模态视觉-文本大语言模型&#xff0c;可以完成&#xff1a;图像描述、视觉问答、根据图片写代码&#xff08;HTML、JS、CSS&#xff09;&#xff0c;潜在可以完成单个目标的视觉定位、名画…

Qt PCL学习(一):环境搭建

参考 (QT配置pcl)PCL1.12.1QT5.15.2vs2019cmake3.22.4vtk9.1.0visual studio2019Qt5.15.2PCL1.12.1vtk9.1.0cmake3.22.2 本博客用到的所有资源 版本一览&#xff1a;Visual Studio 2019 Qt 5.15.2 PCL 1.12.1 VTK 9.1.0https://pan.baidu.com/s/1xW7xCdR5QzgS1_d1NeIZpQ?pw…

计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

React+Antd+实现省、市区级联下拉多选组件

1、效果 是你要的效果&#xff0c;咱们继续往下看&#xff0c;搜索面板实现省市区下拉&#xff0c;原本有antd的Cascader组件&#xff0c;但是级联组件必须选到子节点&#xff0c;不能只选省&#xff0c;满足不了页面的需求 2、环境准备 1、react18 2、antd 4 3、功能实现 …

IntelliScraper 更新 --可自定义最大输出和相似度 支持Html的内容相似度匹配

场景 之前我们在使用IntelliScraper 初代版本的时候&#xff0c;不少人和我反馈一个问题&#xff0c;那就是最大输出结果只有50个&#xff0c;而且还带有html内容&#xff0c;不支持自动化&#xff0c;我声明一下&#xff0c;自动化目前不会支持&#xff0c;以后也不会支持&am…

Java集合为什么不能使用foreach删除元素

文章目录 前言foreach为什么不能使用foreach操作ArrayList迭代器解析 前言 相信各位程序猿在开发的过程中都用过foreach循环&#xff0c;简单快捷的遍历集合或者数组&#xff0c;但是在通过foreach进行集合操作的时候就不可以了&#xff0c;这是为什么&#xff1f;这里先把问题…

正点原子-STM32定时器学习笔记(1)未完待续

1. 通用定时器简介&#xff08;F1为例&#xff09; F1系列通用定时器有4个&#xff0c;TIM2/TIM3/TIM4/TIM5 主要特性&#xff1a; 16位递增、递减、中心对齐计数器&#xff08;计数值&#xff1a;0~65535&#xff09;&#xff1b; 16位预分频器&#xff08;分频系数&#xff…

[晓理紫]AI专属会议截稿时间订阅

AI专属会议截稿时间订阅 关注{晓理紫}&#xff0c;每日更新最新AI专属会议信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新AI专属会议信…

C语言-4

排序算法简介 /*学习内容&#xff1a;冒泡排序&#xff08;最基本的排序方法&#xff09;选择排序&#xff08;冒泡的优化&#xff09;插入排序&#xff08;在合适的位置插入合适的数据&#xff09; *//*排序分类&#xff1a;1.内部排序待需要进行排序的数据全部存放到内存中&…

[职场] C++开发工程师的岗位职责 #学习方法#笔记

C开发工程师的岗位职责 C开发工程师是利用C语言设计完成软件系统底层模块功能&#xff1b;测试软件模块和软集成产品&#xff0c;进行软件故障的诊断、定位、分析和调试&#xff0c;实施产品测试方案&#xff1b;向业务部门提供软件的后期技术支持。C开发工程师是负责使用C编程…

知识融合前沿技术:构建多模态、公平高效的大规模知识表示

目录 前言1 无监督对齐&#xff1a;构建智能实体关联2 多视角嵌入&#xff1a;提高数据利用效率3 嵌入表示增强&#xff1a;挑战节点相似性&#xff0c;对抗训练解决4 大规模实体对齐&#xff1a;克服模糊性和异构性结论 前言 在信息时代&#xff0c;知识融合成为推动人工智能…

全链游戏的未来趋势与Bridge Champ的创新之路

为了充分探索全链游戏的特点和趋势&#xff0c;以及Bridge Champ如何作为一个创新案例融入这一发展脉络&#xff0c;我们需要深入了解这两者之间的互动和相互影响。全链游戏&#xff0c;或完全基于区块链的游戏&#xff0c;代表了游戏行业的一个重要转型&#xff0c;它们利用区…