实现单向链表

一,链表

什么是链表:

链表是一种物理存储单元上非连续非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

  • 链表由一系列结点组成,结点可以在运行时动态生成。
  • 每个结点包括两个部分:
    一个时存储单元数据元素的数据域
    另一个是存储下一个结点地址的指针域
二,malloc函数

什么是 malloc 函数:

malloc 的全称是 memory allocation ,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域。以 void* 类型返回分配的内存区域地址。

  • 当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
  • void* 类型表示未确定类型的指针。
  • C,C++ 规定,void* 类型可以通过类型转换强制转为任何其他类型的指针。
  • malloc 函数一般需要和free函数配对使用。
  • 简单应用一下
#include <stdio.h>
#include <stdlib.h>
int main(){
	int *a = (int *)malloc(sizeof(int));
}

利用 malloc 函数动态分配内存;
(int * ) 表示强制转换,因为malloc函数返回的是 viod* 类型指针,sizeof(int) 是 malloc 函数的参数,指定一个int类型大小的内存;
#include <stdlib.h>是malloc函数的头文件

三,free函数

什么是free函数

  • c语言函数
  • 头文件是malloc.h或stdlib.h
  • 作用:释放malloc(或calloc,realloc)函数给指针变量分配的内存空间的函数
  • free使用后该指针变量一定要重新指向NULL;
  • 指针定义初始化NULL;
四,NULL

什么是NULL:

  • Null,本意是"空的;元素只有零的"意思。计算机中通常表示空值,无结果,或是空集合。
  • NULL指针是一个无类型指针,并且值为0。一个指针,拥有2个属性:地址值和指针类型。
  • 两者的作用是:
    (1)地址值标识变量的首地址(32位系统下指针的地址值占4字节);
    (2)指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的等等)。
  • 空指针,指向地址为0的内存,在用法上,常用来表示不存在
if((fp=fopen("stu","rb"))==NULL)
       exit(0);

解析:如果打开的这个名为stu的文件不存在,就退出程序;

五,链表的实现

输入一个n,输入n个数,将这n个数用链表存储

#include <stdio.h>
#include <stdlib.h>

struct Haha{ //定义结构体 ,结点 
	int val;  //数据域 
	struct Haha *Next;  //指针域 
};
//输入一个N,输入N个值,用链表来存储 
int main(){	
	struct Haha *tmp, *head, *pre;  //定义一个tmp指针,定义一个头指针,定义一个pre指针 
	tmp = NULL; //tmp 指向 NULL 
	head = NULL;
	pre = NULL;
	int n, x;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d", &x);
		// 创建节点 
		tmp = (struct Haha *)malloc(sizeof(struct Haha));//动态分配内存,tmp去指向,(struct Haha *)表示强制转换
		tmp->val = x;
		tmp->Next =NULL;
		if(i == 0)
			head = tmp;
		else
			pre->Next =tmp;	
		pre = tmp;		
	} 
	pre = head;
	while(pre != NULL){
		printf("%d\n",pre->val);
		pre = pre->Next;
	}
}

假如输入6,输入123456,存储后运行结果如下
在这里插入图片描述

发布了12 篇原创文章 · 获赞 45 · 访问量 3876

猜你喜欢

转载自blog.csdn.net/weixin_45897672/article/details/103910755
今日推荐