java不带头节点的创建_C/C++中创建(带头结点、不带头结点的)单链表

本文介绍了如何在C/C++中创建带头结点和不带头结点的单链表。对于带头结点的链表,采用尾插法创建,并提供了详细的代码实现。不带头结点的链表在处理第一个节点时需要特殊处理,代码同样给出。
摘要由CSDN通过智能技术生成

1、带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法)

了解单链表中节点的构成

cce65dd0e3791544652ac9cb0f336446.png 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义:

/* 定义链表 */

typedef struct Node{

int data; // 数据域

struct Node *next; // 指针域(后节点)

// struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表

}Node, *LinkedList;

尾插法思想 尾插法的思想其实很简单,通俗来讲就是每创建一个新节点都插到原来链表的后面。

86bc106e7e3ef1f78dd86ba6d7503979.png !

1a2841b16c80fa0c45b5779585dd2dca.png

35f78e8181aceb7ca55935f0f0ab89eb.png

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 带头结点 */

L = Head;

L->next = NULL;

/* 初始赋值 */

for(int i = 0; i < 3; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

L->next = LNew;

LNew->next = NULL;

L = LNew;

}

简单的代码

#include

using namespace std;

/* 定义链表 */

typedef struct Node{

int data;

struct Node *next;

}Node, *LinkedList;

/* 链表初始化 */

LinkedList LinkedListInit(){

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 带头结点 */

L = Head;

L->next = NULL;

/* 初始赋值 */

for(int i = 0; i < 10; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

L->next = LNew;

LNew->next = NULL;

L = LNew;

}

/* 返回头结点指针 */

return Head;

}

int main()

{

Node *p;

p = LinkedListInit();

p = p->next;

while(p != NULL){

cout << p->data << ' ';

p = p->next;

}

cout << endl;

return 0;

}

d70c3f4ec9a3a29b79738a055fc3e2ba.png

2、不带头结点的单链表(原理与带头结点类似)

不带头结点与带头结点的区别 由于不带头结点的单链表第一个节点需要有效,因此,在处理第一个节点时,需要做节点迁移。

3d2d789da8c846687ad515da4ea66531.png

908cca1a022a131d3c49cec216d437d8.png

1cc17224d6a5bcff9c8dc24978a2027f.png

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 不带头结点 */

L = Head = NULL;

/* 初始赋值 */

for(int i = 0; i < 4; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

LNew->next = NULL;

if(L == NULL){

L = Head = LNew;

}else{

L->next = LNew;

}

L = LNew;

}

简单的代码

#include

using namespace std;

/* 定义链表 */

typedef struct Node{

int data;

struct Node *next;

}Node, *LinkedList;

/* 链表初始化 */

LinkedList LinkedListInit(){

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 不带头结点 */

L = Head = NULL;

/* 初始赋值 */

for(int i = 0; i < 5; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

LNew->next = NULL;

if(L == NULL){

L = Head = LNew;

}else{

L->next = LNew;

}

L = LNew;

}

/* 返回头结点指针 */

return Head;

}

int main()

{

Node *p;

p = LinkedListInit();

while(p != NULL){

cout << p->data << ' ';

p = p->next;

}

cout << endl;

return 0;

}

5beb8f3dd1032ef9182afe360f3df3fa.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值