文章目录

  • 不带头结点的操作
    • 代码①
    • 代码②
    • 代码③
    • 代码④
  • 带头结点的操作
    • 代码⑤

下面的代码中,传递链表时,传的是头指针。如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 C语言实现-线性表的链式存储(单链表)


带头结点单链表 和 不带头结点单链表的区别:

  • 带头结点单链表,在进行插入、删除操作时,不需要改变链表头指针。

  • 不带头结点的单链表,在进行插入、删除操作时,可能会涉及到链表头指针的修改(所以链表作为参数传递时,传递的是头指针的引用,具体可看代码④中head_insert方法中的指针变量带了&取地址符,而代码⑤中的没有。因为带头结点单链表进行头插操作不需要修改头指针,而不带头结点的单链表进行头插操作时需要修改头指针)

  • 具体的代码也有些许差异,可对比 代码④ 和 代码⑤

带头结点单链表 和 不带头结点的init()初始化都修改了头指针,所以指针变量带了&取地址符


不带头结点的操作

① ② ③ ④ 四组代码本质是一样的。只是我本人对地址、指针、引用、指针变量概念不是很理解,所以才写了这四组代码进行对比,方便自己以后复习理解。读者可以跳过① ② ③,直接看④的代码即可

代码①

#include <stdio.h>
#include <malloc.h>typedef struct LNode {int data;struct LNode *next;
};void init(LNode **L) {*L = NULL;
}void head_insert(LNode **L, int x) {LNode *newP = (LNode *)malloc(sizeof(LNode));newP->data = x;newP->next = *L;*L = newP;
}LNode *get(LNode *L, int k) {if (k < 1) {printf("查找位置非法!");return NULL;}int i = 1;if (L != NULL && i <= k) {L = L->next;i++;}if (i == k) {return L;}printf("查找位置非法!");return NULL;
}void print(LNode *L) {printf("\n");while (L) {printf("%4d ", L->data);L = L->next;}printf("\n");
}int main() {LNode *L;init(&L);head_insert(&L, 15);head_insert(&L, 25);head_insert(&L, 35);print(L);printf("\n%4d \n", get(L, 2)->data);return 0;
}

代码②

#include <stdio.h>
#include <malloc.h>typedef struct LNode {int data;struct LNode *next;
};void init(LNode *&L) {L = NULL;
}void head_insert(LNode *&L, int x) {LNode *newP = (LNode *)malloc(sizeof(LNode));newP->data = x;newP->next = L;L = newP;
}LNode *get(LNode *L, int k) {if (k < 1) {printf("查找位置非法!");return NULL;}int i = 1;if (L != NULL && i <= k) {L = L->next;i++;}if (i == k) {return L;}printf("查找位置非法!");return NULL;
}void print(LNode *L) {printf("\n");while (L) {printf("%4d ", L->data);L = L->next;}printf("\n");
}int main() {LNode *L;init(L);head_insert(L, 15);head_insert(L, 25);head_insert(L, 35);print(L);printf("\n%4d \n", get(L, 2)->data);return 0;
}

代码③

#include <stdio.h>
#include <malloc.h>typedef struct LNode {int data;struct LNode *next;
}*LinkList;void init(LinkList *L) {*L = NULL;
}void head_insert(LinkList *L, int x) {LinkList newP = (LinkList)malloc(sizeof(LNode));newP->data = x;newP->next = *L;*L = newP;
}LinkList get(LinkList L, int k) {if (k < 1) {printf("查找位置非法!");return NULL;}int i = 1;if (L != NULL && i <= k) {L = L->next;i++;}if (i == k) {return L;}printf("查找位置非法!");return NULL;
}void print(LinkList L) {printf("\n");while (L) {printf("%4d ", L->data);L = L->next;}printf("\n");
}int main() {LinkList L;init(&L);head_insert(&L, 15);head_insert(&L, 25);head_insert(&L, 35);print(L);printf("\n%4d \n", get(L, 2)->data);return 0;
}

代码④

#include <stdio.h>
#include <malloc.h>//结构体
typedef struct LNode {int data;struct LNode *next;
} *LinkList;//初始化
void init(LinkList &L) {L = NULL;
}//头插
void head_insert(LinkList &L, int x) {LinkList newP = (LinkList)malloc(sizeof(LNode));newP->data = x;newP->next = L;L = newP;
}//按位序查找
LinkList get(LinkList L, int k) {if (k < 1) {printf("查找位置非法!");return NULL;}int i = 1;if (L != NULL && i <= k) {L = L->next;i++;}if (i == k) {return L;}printf("查找位置非法!");return NULL;
}//遍历输出
void print(LinkList L) {printf("\n");while (L) {printf("%4d ", L->data);L = L->next;}printf("\n");
}int main() {LinkList L;init(L);head_insert(L, 15);head_insert(L, 25);head_insert(L, 35);print(L);printf("\n%4d \n", get(L, 2)->data);return 0;
}

带头结点的操作

代码⑤

#include <stdio.h>
#include <malloc.h>//结构体
typedef struct LNode {int data;struct LNode *next;
} *LinkList;//初始化
void init(LinkList &L) {LinkList newp = (LinkList)malloc(sizeof(LNode));newp->next = NULL;L = newp;
}//头插
void head_insert(LinkList L, int x) {LinkList newp = (LinkList)malloc(sizeof(LNode));newp->data = x;newp->next = L->next;L->next = newp;
}//按位序查找
LinkList get(LinkList L, int k) {if (k < 1) {printf("查找位置非法!");return NULL;}int i = 1;LinkList p = L->next;if (p != NULL && i <= k) {p = p->next;i++;}if (i == k) {return p;}printf("查找位置非法!");return NULL;
}//遍历输出
void print(LinkList L) {printf("\n");LinkList p = L->next;while (p) {printf("%4d ", p->data);p = p->next;}printf("\n");
}int main() {LinkList L;init(L);head_insert(L, 15);head_insert(L, 25);head_insert(L, 35);print(L);printf("\n%4d \n", get(L, 2)->data);return 0;
}

带头结点单链表 和 不带头结点单链表的区别相关推荐

  1. c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作

    链表在数据结构和算法中的重要性不言而喻.这里我们要用C来实现链表(单链表)中的基本操作.对于链表的基本概念请参考<数据结构与算法之链表>这篇博客.示例代码上传至 https://githu ...

  2. 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

    假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...

  3. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

  4. 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。

    创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...

  5. 带头结点单链表、不带头结点单链表(头指针单链表)

    1.头结点和头指针的区别 1.1区别: 头指针表明了链表的结点,可以唯一确定一个单链表. 头指针指向链表的第一个结点,其记录第一个存储数据的结点的地址. 头结点是点链表的第一个结点,若单链表有头结点, ...

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

    /*** @ProjectName: JavaPractice * @Package: com.itwang.swordtooffer * @ClassName: LNodeOperation * @ ...

  7. 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点

    删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4-> ...

  8. 建立一个带头结点的线性链表,用以存放输入的二进制数,链表的每一个节点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算;

    1.题目:建立一个带头结点的线性链表,用以存放输入的二进制数,链表的每一个节点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算: 部分函数调用参考:https://blog.csdn ...

  9. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!

    本期例题:LeetCode 206 - Reverse Linked List[1](Easy) 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL ...

最新文章

  1. MySQL面试题 | 附答案解析(十六)
  2. 深度学习中的优化算法与实现
  3. windows上python3安装
  4. 视频导切台RGBlink 控制软件下载与测试
  5. 浙江省第二届大学生网络与信息安全竞赛在线预赛
  6. livebos--iframe使用
  7. 2019 java值得学吗_Java认证值得吗?
  8. Tensorflow2.0开启,从此忘记1.*版本
  9. 混合精度训练amp,torch.cuda.amp.autocast():
  10. JUC:ConcurrentHashMap(并发容器)
  11. hdu-2717(基础搜索bfs)
  12. flask-前端-requests之response对应关系 text
  13. 如何选择B2C电商仓储系统?
  14. MVC3中Ajax.ActionLink用法
  15. Javascript的函数直接量定义
  16. postman传数组参数
  17. python中输出语句的怎么写_python的输出语句怎么写
  18. html5怎么把图片置顶,html/css如何让图片上下居中(居中垂直)?
  19. python语言的就业方向_Python语言就业方向
  20. php 美颜,怀念以前无滤镜美颜的影视剧

热门文章

  1. APP测试面试题快问快答(五)
  2. MATLAB绘图自定义曲线颜色
  3. 基于阿里云实现3D模型显示(WebAR项目)
  4. 隔行扫描信号与逐行扫描信号转换
  5. AirSim(五)---理解篇: Airsim世界坐标系、NED坐标系、机体坐标系以及控制相关API接口函数
  6. iOS 百度定位实现
  7. 数据结构——二叉树的先序遍历
  8. prometheus(普罗米修斯监控)部署、主机监控及docker容器监控
  9. 附庸风雅 -- 最美的十首情诗词
  10. access 数据分组