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

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.hqwc.cn/news/455355.html

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

相关文章

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…

Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES

&#x1f4c1;前情提要&#xff1a;Springboot整合Elasticsearch&#xff08;一&#xff09;&#xff1a;Linux下安装 Elasticsearch 8.x 上回说到&#xff0c;Elasticsearch 已经安装完成&#xff0c;不过我们使用7.17.5 版本继续后文&#xff1a; 一、使用 elasticsearch-hea…

【Java EE】----Spring框架创建和使用

1.Spring框架创建 创建一个maven项目 添加Spring框架支持 <dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></depende…

技术债解决思考v2

1、在实际情况中可能得先理解技术是为业务服务的&#xff0c;具体可见&#xff1a;BRD MRD PRD的概念、关系、区别 - 知乎 (zhihu.com) 2、理解之后&#xff0c;再根据上述办法来解决技术债&#xff0c;其中说服人的办法可以有借鉴五步说服人法&#xff1a;如何用五步有逻辑地…

使用代理IP有风险吗?如何安全使用代理IP?

代理IP用途无处不在。它们允许您隐藏真实IP地址&#xff0c;从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而&#xff0c;正如任何技术工具一样&#xff0c;代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…

【数据分享】1929-2023年全球站点的逐年平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

【RT-DETR有效改进】轻量级下采样方法ContextGuided(参数量下降700W,轻量又涨点)

&#x1f451;欢迎大家订阅本专栏&#xff0c;一起学习RT-DETR&#x1f451; 一、本文介绍 本文给大家带来的是改进机制是一种替换Conv的模块Context Guided Block (CG block) &#xff0c;其是在CGNet论文中提出的一种模块&#xff0c;其基本原理是模拟人类视觉系统依赖上…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

编译原理与技术(二)——词法分析(一)正则表达式

一、词法分析的概貌 一个程序&#xff0c;在我们看来往往是像下图这样的。 实际上&#xff0c;上面的程序本质上就是一个字符串&#xff0c;所以&#xff0c;它等价于下面这样的。 上面的字符串&#xff08;字符流&#xff09; &#xff0c;就是编译器接收到的程序的形式。 所…

wins 安装 tensorflow keras

1.python版本 python版本3.12&#xff0c;安装tensorflow会报错&#xff1a; 经过多次实验&#xff0c;使用的python版本是3.9.0 2.安装tensorflow a. pip install --trusted-host http://mirrors.aliyun.com/pypi/simple/ tensorflow2.6.0 速度有点慢&#xff0c;半个多小…

《爬虫职海录》卷二 • 爬在广州

HI&#xff0c;朋友们好&#xff0c;「爬虫职海录」第二期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xf…