一、简答题
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;
}
}
头插
头删
尾插
尾删