美文网首页
链表的创建,malloc动态申请空间

链表的创建,malloc动态申请空间

作者: nicetomeetutoo | 来源:发表于2018-06-16 20:33 被阅读0次

今天我们来使用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);

}

原谅字丑

相关文章

  • 链表的创建,malloc动态申请空间

    今天我们来使用malloc申请动态空间来创建一个单向链表; 一:malloc申请动态空间注意以下事项: 1,mal...

  • C语言(四-链表)

    链表 因为数组必须事先确定大小,不能实现动态申请、释放。而使用malloc动态内存分配也无法实现,malloc申请...

  • 内存泄漏Memory leak

    是什么? 程序使用 new / malloc / realloc 动态存储分配函数 向系统在堆申请了内存空间,使用...

  • 链表 Linked List

    链表和动态数组的比较 动态数组回造成内存空间的大量浪费 链表可以做到用多少内存就申请多少内存 链表 是一种链式存储...

  • c/c++ 动态数组

    注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间) C语言:malloc...

  • 5.6

    一面 1.动态规划:连续子数组最大和 2.链表判断是否有环(创建链表记记记!malloc之后在输入就可以咯) 3....

  • (二十二)动态创建对象

    回顾malloc/free malloc仅仅是申请一块指定大小的内存,而不是创建对象 用new/delete创建/...

  • C 堆变量,栈变量,指针参数,非指针参数 它们的区别你了解嘛

    1.基本概念 堆(Heap)程序可以动态申请的存储空间,通过malloc系列函数分配,全局可访问。 栈(Stack...

  • 单向链表

    单向链表 相比于链表,动态数组有一个很大的缺点,就是会造成很大的空间浪费;链表则可以做到用多少就申请多少内存; 链...

  • C概念

    概念 栈:局部变量,程序运行完自动释放 堆:只能手动申请和释放,如malloc申请的空间在堆上,malloc()和...

网友评论

      本文标题:链表的创建,malloc动态申请空间

      本文链接:https://www.haomeiwen.com/subject/fuaveftx.html