链表的创建以及链表节点的增加和删除

单链表的创建过程有以下几步:

1 ) 定义链表的数据结构;

2 ) 创建一个空表;

3 ) 利用malloc ( )函数向系统申请分配一个节点;

4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;

5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;

单链表的输出过程有以下几步

1) 找到表头;

2) 若是非空表,输出节点的值成员,是空表则退出;

3 ) 跟踪链表的增长,即找到下一个节点的地址;

4) 转到2 ).

  接下来来一步步实现链表的创建: (1)定义一个结构体类型来存储这个节点   链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。

                图1:节点存储

struct node
{
    int data;  //整形data用来存储具体的数值
    struct node *next; //存储下一个节点的地址,类型相同,所以指针类型必须也是struct node *类型的指针
};   //注意结构体定义后面需要;

(2)链表创建

  单链表有一个头节点head,指向链表在内存的首地址。当链表还没有建立的时候头指针为空(NULL)。

struct node *head;
head = NULL; //头指针为空

  创建第一个节点,并用临时指针p指向这个节点。(利用malloc函数)

struct node *p;
p = (struct node *)malloc(sizeof(struct node));

  接下来分别设置新创建的这个节点的左部分和右部分。

scanf("%d",&a);
p ->data = a;   //将数据存储到当前节点da中
p ->next = NULL; //设置当前节点的下一个节点为空
//->结构体指针运算符,访问结构体内部成员

  完整代码如下:

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};
int main()
{
    struct node *head,*p,*q,*t;
    int i,n,a;
    scanf("%d",&n);
    head = NULL; //头指针为空

    for(i=1;i<=n;i++)   //循环读入n个数
    {
        scanf("%d",&a);
        p = (struct node *)malloc(sizeof(struct node));
        p ->data = a;
        p ->next = NULL;
        if (head==NULL)
            head = p;  //如果这是第一个创建的节点,则将头指针指向这个节点
        else
            q ->next = p;  //上一个节点的后继指针指向当前节点
        q = p;  //指针q也指向当前节点
    }
    //输出链表中的所有数
    t = head;
    while(t!=NULL)
    {
        printf("%d",t ->data);
        t = t ->next;  //继续下一个结点
    }
    getchar();
    return 0;
}

待续….

参考文献: ①malloc函数详解: http://blog.csdn.net/xw13106209/article/details/4962479

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spring相关

带返回值的函数,闭包,沙箱,递归详解

那了解了函数 this 指向的不同场景之后,我们知道有些情况下我们为了使用某种特定环境的 this 引用, 这时候时候我们就需要采用一些特殊手段来处理了,例如...

302
来自专栏极客猴

彻底理解Iterable、Iterator、generator

我们一般称 Iterable 为可迭代对象。Python 中任意的对象,只要它定义了可以返回一个迭代器的 __iter__ 方法,或者定义了可以支持下标索引的 ...

682
来自专栏梧雨北辰的开发录

Swift学习:泛型

本篇将详细总结介绍Swift泛型的用法; Swift泛型代码让你能够根据自定义的需求,编写出适用于任意类型、灵活可重用的函数及类型。它能让你避免代码的重复,用...

752
来自专栏编程

C语言编程精华——《指针》

C语言编程精华--《指针》 使用指针有两方面的优势: 1、用指针能够更好完成某些任务; 2、有些任务只能是用指针才能够完成。 一、指针定义 1、计算机的内存 计...

1750
来自专栏北京马哥教育

Python高级编程技巧

正文: 本文展示一些高级的Python设计结构和它们的使用方法。在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求、对数据一致 性的要求或...

3544
来自专栏C/C++基础

控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象。通常情况下,对象创建在堆上还是在...

622
来自专栏zaking's

用js来实现那些数据结构08(链表02-双向链表)

  其实无论在任何语言中,一种数据结构往往会有很多的延伸和变种以应对不同场景的需要。其实前面我们所学过的栈和队列也是可以用链表来实现的。有兴趣的小伙伴可以自己尝...

2766
来自专栏微服务生态

Scala学习笔记(一)

lazy val forLater = someTimeConsumingOperation()

551
来自专栏walterlv - 吕毅的博客

Roslyn 语法树中的各种语法节点及每个节点的含义

2018-07-18 12:24

1141
来自专栏Crossin的编程教室

可变对象与不可变对象

前阵子我们聊了下函数的参数传递以及变量赋值的一些内容:关于函数参数传递,80%人都错了。

1112

扫码关注云+社区