C语言中的存储空间和变量以及链表的插入方式

本文介绍了C语言中的存储空间划分及其使用方式,包括静态存储区和动态存储区的不同部分,并详细阐述了局部变量和全局变量的区别。此外,还探讨了链表的基本概念及三种插入方法:头插入、尾插入和中间插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中的存储空间和变量

一.存储空间

1. 静态储存区

 a. bss:未初始化的全局变量和静态变量

 b.data:初始化后的全局变量和静态变量

2.动态存储区

a.常量区:用于存放常量和字符串
b.栈:由编译器分配和释放的内存空间,用于存储函数参数和普通变量例:局部变量等。c. 堆:动态内存区,有程序员手动释放;如果程序员不释放,则可能由OS回收;并且,堆里的所有东西都是匿名的,不能有名字取查找,只能由指针去指向。
栈:栈是先进后出的;但注意一下满栈和空栈的情况:a.满栈:入栈,先移动指针后存入数据;出栈是先出数据在移动指针;(因为满栈下指针指向的位置是已经用的位置)b.空栈:入栈,先出数据后后移动指针;出栈是先移动指针后出数据。

#include<stdio.h>
	struct student
	{
	int num;
	int name;
};
int main()
	{
	struct student*p;
	p=(struct student*)malloc(sizeof(struct student));
	/*如果改为
	struct student p;
	p=(struct student)malloc(sizeof(struct student));
	则错了
	*/
}

二. 变量

2.局部变量(动态变量):

定义在函数体内的变量(形参也是局部变量),离开该函数再调用则无效;每次调用时都从零开始,不保存原有数据。


 3.全局变量(静态变量):

定义在所以函数外部的变量(一般写在开头,因为程序是依次执行的),作用域是整个程序,包过.c和.h文件。 插入链表的三种方法 插入链表的三种方法

#include<stdio.h>
	int a=100;//全局变量
void fun1()
	{
	int n,m,q;//局部变量
	printf("请输入m的值");
	scanf("%d,%d",&m,&q);//注意:如果是在gc++编译器里编译的话,输入格式必须为%d,%d的格式,不然会出错。
	n=m+a*q;
	printf("n=%d",n);
	printf("b is %d",b);//这里的b在下边才被执行到,所以这里不能输出的
}
int b=99;//全局变量
void fun2()
	{
	printf("b is %d",b);
}

  二.插入链表的三种方法

 什么是链表?

1.是动态的进行储存分配的一种结构,和数组相比,它不用事先去确定存储空间,而是根据需要开辟单元,也就是说链表其实是一个功能极为强大的数组,它可以在节点中定义多种类型,也可以根据需要随意增添和删除,插入节点。
 2.单向链表:一环扣一环的(利用指针);节点分为数据域(用于存放各种数据)和指针域(用于存放下一个节点的位置);头节点只有指针区域没有数据区域,是一个指针变量;二尾节点的指针是空指针(代表没有下一个节点了)。
3.这样看来,就清晰了,链表就像车链子一样,第一个元素指向第二个,第二个指向第三个....

1.头插入

顾名思义,就是将要节点插入到链表的第一个;

void student(student*(&L))//传过来的是链表
	{
	student*s;//定义一个节点
	L->next=NULL;//将头指针置零
	s->next=L-next//将L的后继节点赋值给s的后继节点
	L-next=s//将s的值赋值给L的后继节点
}

2.尾插入

void W(student*(&L),int n, DataType)//链表和节点数和数据
	{
	int j=0;
	student*s;
	student*r;
	r=L;//r指向头节点
	s=Locate_student(L,n)//找到尾指针
		r-next=s;
		s=r;
}

3. 中间插入

利用之间值代换

void ZJ(student*(&L),int n,DataType x)
	{
	struct student *p,*q;
	p=Locate_student(L,n-1)//找到第n-1个节点
	if(!p)
		{
		printf("n有误");
		return 0;
	}
	q=(student*)malloc(sizeof(student));
	if(!q)
		{
		printf("申请空间失败");
		return 0;
	}
	q->data=x;
	q-next=p->next;
	p->next=q;
	return (1);
}

                      

本文内容转载至: http://blog.qmgua.com/?id=154

原文链接:http://blog.qmgua.com/?id=154

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值