您的位置:首页 > 理论基础 > 数据结构算法

[数据结构] 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐