寒假作业:2024/2/2

作业1:堆栈的区别

栈区:

1.栈区是根据栈的思想实现的,先进后出,先申请的变量后分配内存,所以地址是从大地址到小地址

2.栈区内存是由计算机自动申请和释放的

3.栈区内存一般在几MB

4.栈区内存较小,容易造成堆栈溢出:表示内存不足,例如当递归较深时,计算机会一直分配内存,导致栈区内存不足,造成堆栈溢出

5.栈区内存申请比较连续

堆区:

1.堆区是根据队列的思想实现的,先进先出,先申请的变量先分配内存,所以地址是从小地址到大地址

2.堆区内存是由程序员手动申请和释放的

3.堆区内存一般在几GB

4.堆区也有可能造成堆栈溢出,但相较于栈区来说不容易

5.堆区内存比较片段化,类似于链表,从第一个空地址开始比较,大小合适则分配给变量,然后删除空内存

作业2:

有一个整形数组:int arr[](数组元素由外部输入),一个整形变量:x(也由外部输入),要求:

1.删除数组中与x值相等的元素

2.不得创建新数组

3.最多只允许使用单层循环

4.无需考虑超出新数组长度后面的元素,所以,请返回新数组的长度

例如:{1,2,3,5,7,3,5,9} x=3

原数组的有效部分变为:{1,2,5,7,5,9}

#include 
#include 
#include 

int length(int n,int x,int *p);

int main(int argc, const char *argv[])
{
	int n;//定义一个数组长度
	printf("please enter n:");
	scanf("%d",&n);//输入数组的长度
	int arr[n];//定义一个数组
	for(int i=0;i

效果图:

寒假作业:2024/2/2_第1张图片

作业3:

编程实现单链表的头插、头删、尾插、尾删

1.头插:

寒假作业:2024/2/2_第2张图片

2.头删:

寒假作业:2024/2/2_第3张图片 3.尾插:

寒假作业:2024/2/2_第4张图片 4.尾删:

寒假作业:2024/2/2_第5张图片

总代码: 

head.h:
#ifndef __HEAD_H__
#define __HEAD_H__
#include 
#include 
#include 
typedef int datatype;
typedef struct Node//创建链表节点结构体
{
	//数据域
	datatype data;
	//指针域
	struct Node *next;
}*Linklist;
//函数声明
Linklist create();
Linklist inster_head(Linklist head,datatype element);
Linklist delete_head(Linklist head);
Linklist inster_rear(Linklist head,datatype element);
Linklist delete_rear(Linklist head);
void output(Linklist head);

#endif
main.c:
#include "head.h"

int main(int argc, const char *argv[])
{
	Linklist head=NULL;
	int n;
	printf("please enter n:");
	scanf("%d",&n);
	datatype element;
	for(int i=0;i
test.c:
#include "head.h"
/*
 * function:    创建新节点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回节点,失败返回NULL
 */
Linklist create()
{
	//堆区申请内存创建节点
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	//失败返回NULL
	if(NULL==s)
		return NULL;
	//成功则初始化,返回节点
	s->data=0;
	s->next=NULL;
	return s;
}
/*
 * function:    单链表的头插
 * @param [ in] 
 * @param [out] 头,插入的值
 * @return      头
 */
Linklist inster_head(Linklist head,datatype element)
{
	//先创建新节点
	Linklist s=create();
	s->data=element;
	//如果链表为空
	if(NULL==head){
		head=s;
	}else{//链表不为空
		s->next=head;
		head=s;
	}
	return head;
}
/*
 * function:    单链表的头删
 * @param [ in] 
 * @param [out] 头
 * @return      头
 */
Linklist delete_head(Linklist head)
{
	//如果链表为空,直接返回NULL
	if(NULL==head)
		return NULL;
	//不为空则开始头删
	Linklist del=head;
	head=del->next;
	free(del);
	del=NULL;
	return head;
}
/*
 * function:    单链表的尾插
 * @param [ in] 
 * @param [out] 头,插入的值
 * @return      头
 */
Linklist inster_rear(Linklist head,datatype element)
{
	//先创建一个新节点
	Linklist s=create();
	s->data=element;
	//如果链表为空
	if(NULL==head){
		head=s;
	}else{//链表不为空
		Linklist p=head;
		//先循环到最后一个节点
		while(p->next!=NULL)
		{
			p=p->next;
		}
		//然后尾插
		p->next=s;
	}
	return head;
}
/*
 * function:    单链表的尾删
 * @param [ in] 
 * @param [out] 头
 * @return      头
 */
Linklist delete_rear(Linklist head)
{
	//如果链表为空
	if(NULL==head)
		return NULL;
	//如果链表只有一个节点
	if(head->next==NULL)
	{
		free(head);
		head==NULL;
		return head;
	}
	//如果链表有多个节点
	//先循环到倒数第二个节点
	Linklist p=head;
	while(p->next->next!=NULL)
	{
		p=p->next;
	}
	//再开始尾删
	Linklist del=p->next;
	p->next=NULL;
	free(del);
	del=NULL;
	return head;
}
/*
 * function:    单链表的遍历
 * @param [ in] 
 * @param [out] 头
 * @return      无
 */
void output(Linklist head)
{
	//如果链表为空,直接结束
	if(NULL==head){
		puts("empty");
		return;
	}
	//链表不为空
	Linklist p=head;
	while(p)
	{
		printf("%-4d",p->data);
		p=p->next;
	}
	puts("");
}

你可能感兴趣的:(java,jvm,开发语言)