C语言链表

一、链表是一种特殊的数据结构,它是由很多的结构体组成,每个结构体都包含一个数据域和指针域,前者用来存放数据,后者用来连接下一个结构体,从而形成一种链状的数据结构。

1.组成链表的结构体也很特殊,里面会有一个结构体指针,用于指向下一个结构体

typedef struct Lnode//定义一种新类型
{
    int data;//数据域,用于存放数据
    struct Lnode * next;//指针域,在结构体里定义结构体指针用于指向下一个结构体
}node;

这里说一下typdef,它在C语言里是一个关键字,表示定义一种新类型,上面就是定义一种新的结构体类型叫node,意思是,之后的代码可以用node来定义结构体。

2.malloc函数free函数

malloc函数(全称动态内存分配)是c标准库里的一个函数,它只有一个参数就是内存大小,该函数的返回值是一个不确定的指针。该函数的作用是在堆内存上申请一块内存,大小为参数大小。free与malloc是一对,free是销毁一块内存,参数为一个指针,具体用法如下:

node * n=(node *)malloc(sizeof(node));//定义一个结构体指针n,为该结构体分配一块内存并强制转化成结构体指针,大小为sizeof(node)
free(node);//销毁这块内存

这里说简答说一下内存,内存分为堆区,栈区,静态区,代码区。 全局变量和静态变量存放在静态区,局部变量存在在栈区。

  • 栈区(stack):存放函数形参和局部变量(auto类型),由编译器自动分配和释放
  • 堆区(heap):该区由程序员申请后使用,需要手动释放否则会造成内存泄漏。如果程序员没有手动释放,那么程序结束时可能由OS回收。
  • 全局/静态存储区:存放全局变量和静态变量(包括静态全局变量与静态局部变量),初始化的全局变量和静态局部变量放在一块,未初始化的放在另一块。
  • 程序代码区:存放程序的二进制代码,内存由系统管理。

局部变量与全局变量

局部变量数在函数里定义的变量,只在该函数内部起作用,在其他函数内不能随意使用,存放在栈内存,随函数的销毁而销毁。

全局变量定义在函数外部,源程序的任何函数都可以使用,不能在函数内部被修改。

下面是一个简单的的链表的创建,会有两种方法(尾插法和头插法)

#include<stdio.h>
#include<windows.h>
#include<string.h>
typedef struct Lnode//定义结构体
{
	int data;
	struct Lnode *next;
}node;
void InitList(node *&s)//初始化链表,头节点的数据域为空
{
	s = (node *)malloc(sizeof(node));
	s->next = NULL;
}
//void InsertList(node *&s, int data)//第一种方法,头插法
//{
//	node *n = (node *)malloc(sizeof(node));
//	n->data = data;
//	
//	n->next = s->next;//每次在第一个和第二个结构体之间插入
//	s->next = n;
//}
void InsertList(node *&s, int data, node *&p)//第二中方法,尾插法
{
	node *n = (node *)malloc(sizeof(node));
	n->data = data;
	p->next = n;//每次在最后一个结构体之后插入
	p = n;
	n->next = NULL;
}
void printList(node *&s)//遍历结构体
{
	while (s->next)//由于头指针的数据域是空的,所以从第二个节点开始遍历
	{
		printf("%d ", s->next->data);
		s = s->next;//每次遍历一个指针向后移动
	}
}
int main()
{
	int i;
	node *s;定义一个结结构体指针
	InitList(s);//初始化链表
	node *p = s;
	for (i = 0; i < 10; i++)
	{
		InsertList(s, i,p);//每次向链表插入一个数据
	}
	printList(s);//遍历链表
	system("pause");
	return 0;
}

尾插法: 

头插法

链表可以看成由很多个结构体组成的一个东西,由于指针可以指向一块内存,所以就可以用指针把这些结构体联系起来,然后通过指针来访问这些数据,从而形成一种链状的数据结构。指针的这种特性为c语言创建多种数据类型提供了很多的可能,比如循环链表(环形的链表),双向链表,树,图等。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值