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

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

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 条评论
登录 后参与评论

相关文章

来自专栏文武兼修ing——机器学习与IC设计

JavaScript入门笔记(4)MapSetIterable

Map Map的定义 Map是一组键值对的结构,具有极快的查找速度。 Map是JavaScript中更像字典的一种数据结构,使用new Map()定义,可...

34210
来自专栏kalifaの日々

一个易于理解的C++全排列(permutation)实现

通常我们用这两条语句可以得到一个数组的全排列: sort(nums.begin(),nums.end()); //调用next_permutation求全排列...

2605
来自专栏塔奇克马敲代码

第5章 语句

1524
来自专栏计算机视觉

Python 函数使用记录,join函数和os.path.join用法

1.join()函数 语法:‘sep’.join(seq) 参数说明: sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典等 上面的语法即:...

2527
来自专栏北京马哥教育

史上最全的Python面向对象知识点疏理

? 面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。class 类变量:类变量...

3406
来自专栏软件开发 -- 分享 互助 成长

C++中const小结

1、const修饰普通变量(非指针变量) const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 对于一个...

1867
来自专栏锦小年的博客

python学习笔记4.3-python高级之元素的分解

序列分解为单独的变量 1.1 将一个包含N个元素的元组或者序列分解成为N个单独的变量。 在python中任何序列或者元素都可以通过一个简单的赋值来分解为...

1975
来自专栏软件开发 -- 分享 互助 成长

java中String类学习

java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度。 (3)charAT:字...

1797
来自专栏racaljk

关于C++函数返回局部对象的详细分析

以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的。因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象...

861
来自专栏java思维导图

【一分钟知识】静态变量和实例变量、构造器

1、静态变量和实例变量 静态变量 被static修饰符修饰的变量,也称为类变量 属于类,不属于类的任何一个对象 一个类不管创建多少个对象,静态变量在内存中有且仅...

35110

扫码关注云+社区