[数据结构] C++ 定义单链表、添加节点、输出链表数据【头插法、尾插法】
2019-03-30 22:10
2823 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/My_Territory/article/details/88920137
单链表
1. 定义结构体 2. 初始化 3. 头插法添加节点 4. 尾插法添加节点 5. 输出链表数据 6. 完整代码
1. 定义结构体
typedef struct LNode{ int data; struct LNode *next; //定义一个LNode的指针 }LNode;
2. 初始化
原因:初始化后,可以让每次的添加元素都不被覆盖,可以重复调用添加元素的方法
void initNode(LNode *linkList,LNode *tailList, LNode *tailNode){ linkList->next = NULL; //让最开始的链表的next为NULL tailNode->next = tailList; //让最开始的tailNode指向头结点 }
3. 头插法添加节点
HEAD -> NODE_1 -> NODE_2 1. 新节点使用头结点的 next 指向 NODE_1 2. HEAD 的 next 指向新节点
//头插法插入节点元素 void addNodeFromHead(LNode *linkList){ //传入链表头节点参数 LNode *node; //构建一个新的节点元素 for(int i=0; i<10; i++){ node = (struct LNode*)malloc(sizeof(struct LNode)); //为新节点分配空间,注意要在循环内分配,不然地址不变,一直都是一个节点 node->data = i; //为节点 data 赋值 node->next = linkList->next; //节点的 next 赋值为 L->next 就是上一个创建的节点,如果是第一次添加节点,则 L-next 值为 NULL linkList->next = node; //将 L 指向刚插入的节点 } }
4. 尾插法添加节点
HEAD -> NODE_1 -> NODE_2 <- TAILNODE // TAILNODE 永远指向尾节点 1. 利用 TAILNODE ->next -> next 使尾节点的 next 指向新节点 2. 将 TAILNODE ->next 指向新节点
//尾插法添加元素 void addLNodeFromTail(LNode *linkList, LNode *tailNode) { LNode *node; for (int i=0;i<20;i++) { node = (struct LNode*)malloc(sizeof(struct LNode)); //为新结点分配空间 node->data = i; tailNode->next->next = node; //将表尾终端结点的指针指向新结点 tailNode->next = node; //将当前的新结点定义为表尾的终端结点 } }
5. 输出链表数据
void DisPlay(LNode *linkList){ LNode *p=linkList->next; while(p!=NULL) { printf ("%d",p->data); p=p->next; } printf("\n"); }
6. 完整代码
#include <iostream> using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode; //定义结构体 void initNode(LNode *linkList,LNode *tailList, LNode *tailNode){ linkList->next = NULL; tailNode->next = tailList; } //头插法插入节点元素 void addNodeFromHead(LNode *linkList){ //传入链表头节点参数 LNode *node; //构建一个新的节点元素 for(int i=0; i<10; i++){ node = (struct LNode*)malloc(sizeof(struct LNode)); //为新节点分配空间 node->data = i; //为节点 data 赋值 node->next = linkList->next; //节点的 next 赋值为 L->next 就是上一个创建的节点,如果是第一次添加节点,则 L-next 值为 NULL linkList->next = node; //将 L 指向刚插入的节点 } } //尾插法添加元素 void addLNodeFromTail(LNode *linkList, LNode *tailNode) { LNode *node; for (int i=0;i<20;i++) { node = (struct LNode*)malloc(sizeof(struct LNode)); //生成新结点 node->data = i; tailNode->next->next = node; //将表尾终端结点的指针指向新结点 tailNode->next = node; //将当前的新结点定义为表尾的终端结点 } // tailNode->next = NULL; //表示当前链表结束 } void DisPlay(LNode *linkList){ LNode *p=linkList->next; while(p!=NULL) { printf ("%d ",p->data); p=p->next; } printf("\n"); } int main(){ LNode *linkList, *tailNode, *tailList; linkList = (struct LNode*)malloc(sizeof(struct LNode)); tailNode = (struct LNode*)malloc(sizeof(struct LNode)); tailList = (struct LNode*)malloc(sizeof(struct LNode)); initNode(linkList,tailList,tailNode); //先将 头结点 next 赋值为 NULL,第一次添加时,第一个节点的next使用 头结点 next 赋值 addNodeFromHead(linkList); addLNodeFromTail(tailList, tailNode); DisPlay(linkList); DisPlay(tailList); return 0; }
相关文章推荐
- 【郝斌数据结构自学笔记】16-23_链表的定义与分类_链表节点插入与删除_每一个链表节点的数据类型该如何表示的问题
- 定义一个不受计算机字长限制的整数类INT,要求INT与INT以及INT与C++基本数据类型int之间能进行+、-、×、÷和=运算,并且能通过cout输出INT类型的值。(持续添加)
- 【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)
- 数据结构:单链表(二)之链表节点排序,升序插入数据,删除指定的所有节点,翻转链表操作
- 数据结构_队列_用链表动态建立释放节点实现队列各种操作_C++实现
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- 03 给定链表头结点, 依次输出从尾节点到头结点的数据
- C++ linked list: 向一个链表中的某一个特定的位置添加节点
- 嵌入式内核及驱动开发-05 中断编程(添加(定义)设备节点,获取中断号,申请中断,字符设备驱动框架,传递数据给用户)
- 编译器定义的C/C++语言各种基本数据类型的取值范围用程序输出
- 很简单的数据结构:链表线性存储的创建、取数据、数据添加、数据插入、数据删除
- c++ 数据结构 用单链表实现多项式的类定义
- C++数据结构---链表(链表节点创建)
- (摘)面向对象c++数据结构之基本数据结构-链表-使用链表管理器(连载中)
- 向链表添加节点数据
- C++模板实现二叉查找树(一 树的数据结构定义与节点插入)
- 数据结构:单链表(三)输出链表值最大的节点
- C++ 类的使用(定义一个类,里面包含两个数据元素和一个成员函数,并输出数据元素较大值)
- C++模板实现二叉查找树(一 树的数据结构定义与节点插入)
- 不带头节点的链表尾插法C++实现