作业要求:
1.栈区和堆区的区别:
1>栈区是借助栈的思想实现,先进后出,先定义变量,后分配内存,栈区的地址从大地址到小地址申请。堆区是借助队列的思想实现,先进先出,先定义变量申请内存,堆区的地址申请从小地址到大地址申请
2>栈区空间由计算机自动申请,自动释放,堆区手动申请,手动释放
3>栈的大小一般在几M,堆区的大小一般在几G
4>栈区内存申请一般比较连续,堆区容易出现片段化,类似于链表,从第一个空内存进行比较,如果查到合适大小,则申请给变量,把空内存删除。
5>堆栈溢出:表示栈内存不足,例如:递归,当递归调用较深时,计算机需要不断在栈申请内存
2.程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
int n;
printf("please input n:");
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++)
{
printf("please input %d num",i+1);
scanf("%d",&arr[i]);
}
int x;
printf("please input x:");
scanf("%d",&x);
int j=0;
for(int i=0;i<10;i++)
{
if(arr[i]!=x)
{
arr[j]=arr[i];
j++;
}
}
for(int i=0;i<j;i++)
{
printf("%-3d",arr[i]);
}
printf("数组长度:%d\n",j);
return 0;
}
运行结果:
3程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
//定义节点结构体,节点:数据域 指针域
typedef struct Node
{
datatype data; //数据域:存储数据元素
struct Node *next;//指针域:存储下一个节点的地址
}*Linklist;
//堆区申请空间
Linklist create()
{
Linklist s=(Linklist)malloc(sizeof(struct Node));
if(NULL==s)
return NULL;
//成功初始化
s->data=0;
s->next=NULL;
return s;
}
//头插
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;
}
//尾插
Linklist insert_rear(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;
}
//单向链表遍历
void output(Linklist head)
{
Linklist p=head;
if(NULL==head)
{
puts("empty");
return;
}
while(p!=NULL)
{
printf("%-3d",p->data);
p=p->next;
}
puts("");
}
//单链表头删
Linklist delete_head(Linklist head)
{
if(NULL==head)
return head;
else
{
Linklist del=head;
head=head->next;
free(del);
return head;
}
}
//单链表尾删
Linklist delete_rear(Linklist head)
{
if(NULL==head)
return head;
else if(NULL==head->next)
{
free(head);
head=NULL;
return head;
}
else
{
Linklist del=head;
while(del->next->next!=NULL)
{
del=del->next;
}
free(del->next);
del->next=NULL;
return head;
}
}
//单链表释放内存
Linklist free_speace(Linklist head)
{
if(NULL==head)
return head;
Linklist p=head;
Linklist del;
while(p!=NULL)
{
del=p->next;//保存节点
free(p);
p=del;//移动到下一个节点
}
return p;
}
int main(int argc, const char *argv[])
{
Linklist head=NULL;//定义单链表的头指针
int n;
datatype element;//插入的值
printf("please input n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("please input %d element:",i+1);
scanf("%d",&element);
head=insert_head(head,element);//头插
// head=insert_rear(head,element);//尾插
}
//单向链表遍历
output(head);
//单链表头删
// head=delete_head(head);
// output(head);
//单链表尾删
head=delete_rear(head);
output(head);
//空间释放
head=free_speace(head);
output(head);
return 0;
}
运行结果:
尾插头删:
头插尾删: