2024/02/02

一、简答题

1、请简述栈区和堆区的区别

(1)栈区是借助栈的思想实现,先进后出,先声明的变量后分配内存

     堆区是借助队列的思想实现,先进先出,先声明的变量先分配内存

(2)栈区的内存分配是从高地址到低地址。堆区的内存分配是从低地址到高地址

(3)栈区的内存较小,一般为几M,堆区的内存较大,一般在几G。

(4)栈区的内存分配是连续的,堆区的内存分配不连续,比较片面化。

(5)栈区的内存是计算机自动分配自动释放的,堆区的内存是程序员手动申请释放的

二、编程题

1.有一个整形数组:int arr[](数组的值由外部输入决定),一个整型变量: x(也
由外部输入决定)。要求:
1)删除数组中与x的值相等的元素
2)不得创建新的数组
3)最多只允许使用单层循环
4)无需考虑超出新数组长度后面的元素,所以,请返回新数组的长度
例如:(1,2,3,5,7,3,5,9) x=3
原数组的有效部分变为: (1,2,5,7,5,9)、

//main.c

	//单链表任意元素删除
	datatype key;
	printf("please enter delete key:");
	scanf("%d",&key);
	head=delete_key(head,key);
	output(head);

//test.c

//单链表任意元素删除
Linklist delete_key(Linklist head,datatype key)
{
	//链表为空
	if(NULL==head)
	{
		puts("empty");
		return NULL;
	}
	//查找
	while(search_key_r(head,key)!=-1)
	{
		//调用任意位置删除函数
		int pos=search_key_r(head,key);
	    head=delete_pos(head,pos);
	}
	return head;
 
}


2.请编程实现单链表的头插,头删、尾插、尾删

//main.c

int main(int argc, const char *argv[])
{
	//单链表循环输入
	Linklist head=NULL;//定义单向链表的头指针
	int n;
	datatype element;//插入的值
	printf("please enter n:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("pelase enter %d element:",i+1);
		scanf("%d",&element);
		//单链表头插
//		head=insert_head(head,element);
		//单链表尾插
		head=insert_tail(head,element);
	}

//test.c

//单向链表头插
Linklist insert_head(Linklist head,datatype element)
{
	//创建新节点s
	Linklist  s=create();
	s->data=element;

	//判断链表是否为空
	if(NULL==head)
	{
		head=s;
	}
	else
	{
		s->next=head;
		head=s;
	}
	return head;//返回形参head

}

//单链表遍历输出
void output(Linklist head)
{
	//判断链表是否为空
	if(NULL==head)
	{
		puts("empty");
		return;
	}
	Linklist h=head;
	while(h!=NULL)
	{
		printf("%d ",h->data);
		h=h->next;//后移一位
	}
	printf("\n");
}


//单链表尾插
Linklist insert_tail(Linklist head,datatype element)
{
	//创建新节点s
	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;
}



//单链表头删
Linklist delete_head(Linklist head)
{
	//链表为空
	if(NULL==head)
	{
		puts("empty");
		return head;
	}
	Linklist del=head;
	head=head->next;
	free(del);
	del=NULL;
	return head;
}

//单链表尾删
Linklist delete_tail(Linklist head)
{

	//链表为空
	if(NULL==head)
	{
		puts("empty");
		return head;
	}
	//一个节点
	else if(head->next==NULL)
	{
		free(head);
		head=NULL;
		return head;

	}
	//多个节点
	else
	{
		Linklist s=head;
		while(s->next->next!=NULL)
		{
			s=s->next;
		}
		free(s->next);
		s->next=NULL;
		return head;
	}
}

头插

头删

尾插

尾删

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值