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

  • 了解单链表中节点的构成



    从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义:
/* 定义链表 */
typedef struct Node{
int data; // 数据域
struct Node *next; // 指针域(后节点)
// struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表
}Node, *LinkedList;
  • 尾插法思想

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



    !

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 <iostream>
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;
}

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

  • 不带头结点与带头结点的区别

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





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 <iostream>
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;
}

C/C++中创建(带头结点、不带头结点的)单链表的更多相关文章

  1. JAVA单链表的实现-不带头结点但带有尾指针

    1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

  2. Python实现不带头结点的单链表

    1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...

  3. C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

    昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...

  4. PHP数据结构之三 线性表中的单链表的PHP实现

    线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素.用这种方法存储的线性表简称线性链表. 链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分 ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. [CareerCup] 2.6 Linked List Cycle 单链表中的环

    2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of ...

  7. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  8. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  9. java编写带头结点的单链表

    最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

随机推荐

  1. C# JackLib系列之自定义鼠标风格的实现

    在我们开发的过程中,有时需要我们来自定义鼠标的形状和大小,刚巧前一阵子正好用到了这个技术,找了好多资料,基本上都是黑白色的鼠标风格实现,而我要的则是自定义大小和彩色风格的光标样式.百度上的资源又太少, ...

  2. 编写高质量代码改善C#程序的157个建议——建议143:方法抽象级别应在同一层次

    建议143:方法抽象级别应在同一层次 看下面代码: class SampleClass { public void Init() { //本地初始化代码1 //本地初始化代码2 RemoteInit( ...

  3. JS 前端构建工具gulpjs的使用介绍及技巧

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  4. elasticsearch常用JAVA API 实例

    1.引入dependency <dependency> <groupId>org.springframework.data</groupId> <artifa ...

  5. [原创] 改善 Firemonkey Canvas 几何绘图质量问题(移动平台)

    说明: Fiiremonkey 的跨平台能力,大家有目共睹(一码同介面跨四平台),唯独移动平台在几何绘图方面,质量始终不尽人意,我也曾试着去修正(如:修正曲线平滑问题),也曾找过第三方案(如:AggP ...

  6. SOLR企业搜索平台 三 (schema.xml配置和solrj的使用)

    标签:solrj 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://3961409.blog.51cto.com/3951409/8 ...

  7. C#判断一个字符串是否是数字或者含有某个数字

    第一种就是 最常见的 用Try..Catch.. 再try中强转你要确认的string 类型 成功就是int  catch 就不是 string a = "avdfd"; try ...

  8. H5活动产品设计指南基础版

    本文来自 网易云社区 . H5一般页面不会很多,看似简单,实际上会有很多细节需要注意,我自己在做过了几个H5之后,发现了一些常犯的问题,做了小结,希望给新开始做H5的产品相关的同学提供一些帮助.  首 ...

  9. centos6.3 配置 smb 服务

    1.安装 samba 以及相关依赖包:yum install samba samba-client samba-swat 2.添加 smb 服务用户:smbpasswd -a user_name(之后 ...

  10. 本地Windows环境下安装MySql

    Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,你需要在 MySQL 下载中下载 Windows 版本的 MySQL 安装包. Download Link: ...