今天我们来使用malloc申请动态空间来创建一个单向链表;
一:malloc申请动态空间注意以下事项:
1,malloc申请动态空间时必须声明类型;
2,使用malloc申请的空间在使用完成之后必须使用free释放;
3,malloc申请空间的类型必须和指向他的指针类型匹配;such as:
int *p;
p=(int *)malloc(sizeof(所要存储数据的类型));
free(p);
//在这里要注意的是在第三点中所说的类型匹配指的是指针p的int类型和malloc前面的int 类型匹配,与sizeof括号里的无关;
二:链表的创建
我们来创建一个链表用来存储5个从键盘输入的整数;
先来了解什么是节点:在链表中我们把申请的一个动态空间称之为节点,每一个节点分为两个域,数据域和指针域,数据域用来存贮你要存的数据,指针域用来存储下一个节点的地址;
1,我们首先使用结构体将节点的两个域分别定义出来;
typedef struct node{
int date; //用来存储整数的数据域
struct node *next; //这里定义了一个指向结构体的结构体指针,即节点的指针域;
}Elemsn; //为了方便书写的方便我们为结构体起一个别名,Elemsn,等价于struct node;
2,申请动态空间作为节点,可以理解为链表的"一个"环;并用一个指针指向他,当然类型匹配指针的类型也要为结构体类型指针;
Elemsn *p;
p=(Elemsn *)malloc(sizeof(Elemsn));//申请的空间大小为sizeof(Elemsn);
3,准备工作做完,我们开始建链表;
我们使用函数的调用完成链表的建立
#include<stdio.h>
#include<stdlib.h>
#define N 5
#define null 0 //方便书写,我们声明null=0;
Elemsn *Creatlink(int a[]); //声明函数,该函数为创建链表的函数
void Printlink(Elemsn *h); //声明函数,该函数为输出链表的函数
int main(void) // 主函数
{
int a[N]; // 定义整形数组a用来存放从键盘输入的5个值
int i;
for(i=0;i<N;i++)
scanf("%d",a+i); //从键盘输入5个值
Elemsn *head=null; /*在主函数中定义指向链表头部的指针,我们称为头指针,领他的指针域为空*/
head=Creatlink(a); /*调用函数,函数将返回已创建好的链表,我们只需用在主函数中定义好的头指针将他指住,这样我们的链表也就建好了;这里我们将要存入链表中的数组传到形参中去,所以我们将数组第一个单元的首地址传过去*/
Printlink(head); //将整个链表传过去,调用输出函数将链表存的值输出
free(head); //free释放
return 0;
}
Elemsn *Creatlink(int a[]) //用指针a来接数组的地址,开始创建链表
{
Elemsn *head,*tail,*p; /*定义指向链表头部的头指针和指向尾部的tail指针,以及创建节点的指针p*/
int i;
head=tail=(Elemsn *)malloc(sizeof(Elemsn));//刚开始的时候头和尾在同一个节点上
head->date=a[0]; //令头节点的数据域存a[0];
head->next=null; //因为此时还没有创建下一个节点,所以头指针指针域为空,没有指向;
for(i=1;i<N;i++) //利用要存入数据的个数使用循环创建节点
{
p=(Elemsn *)malloc(sizeof(Elemsn));
p->date=a[i];
p->next=null; //这里同上为创建节点并给 ‘域’ 赋值
tail->next=p; /*这里很重要,此处令尾部指针 tail 所
指向节点的指针域保存所创节点的地址,即为挂链*/
tail=p; //然后将尾部指针后移,移到p的位置,此时tail与p都指向所创的节点,然后反复循环创建节点,挂链,后移直到循环结束,此时最后一个节点的指针域为空,即为null
}
return head; //返回头指针所保存的地址,指针释放,主函数中用已经定义好的head指针去接收返回的地址就好了;
}
void Printlink(Elemsn *h) //用指针h来接受链表,指向链表头部
{
Elemsn *p;
for(p=h;p!=null;p=p->next)
printf("%d\t",p->date);
}
原谅字丑