带头结点单链表 和 不带头结点单链表的区别
文章目录
- 不带头结点的操作
- 代码①
- 代码②
- 代码③
- 代码④
- 带头结点的操作
- 代码⑤
下面的代码中,传递链表时,传的是头指针。如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 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;
}
带头结点单链表 和 不带头结点单链表的区别相关推荐
- c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作
链表在数据结构和算法中的重要性不言而喻.这里我们要用C来实现链表(单链表)中的基本操作.对于链表的基本概念请参考<数据结构与算法之链表>这篇博客.示例代码上传至 https://githu ...
- 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母
假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...
- 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。
[一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...
- 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。
创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...
- 带头结点单链表、不带头结点单链表(头指针单链表)
1.头结点和头指针的区别 1.1区别: 头指针表明了链表的结点,可以唯一确定一个单链表. 头指针指向链表的第一个结点,其记录第一个存储数据的结点的地址. 头结点是点链表的第一个结点,若单链表有头结点, ...
- java带头结点的单链表_java编写带头结点的单链表
/*** @ProjectName: JavaPractice * @Package: com.itwang.swordtooffer * @ClassName: LNodeOperation * @ ...
- 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4-> ...
- 建立一个带头结点的线性链表,用以存放输入的二进制数,链表的每一个节点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算;
1.题目:建立一个带头结点的线性链表,用以存放输入的二进制数,链表的每一个节点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算: 部分函数调用参考:https://blog.csdn ...
- 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!
本期例题:LeetCode 206 - Reverse Linked List[1](Easy) 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL ...
最新文章
- MySQL面试题 | 附答案解析(十六)
- 深度学习中的优化算法与实现
- windows上python3安装
- 视频导切台RGBlink 控制软件下载与测试
- 浙江省第二届大学生网络与信息安全竞赛在线预赛
- livebos--iframe使用
- 2019 java值得学吗_Java认证值得吗?
- Tensorflow2.0开启,从此忘记1.*版本
- 混合精度训练amp,torch.cuda.amp.autocast():
- JUC:ConcurrentHashMap(并发容器)
- hdu-2717(基础搜索bfs)
- flask-前端-requests之response对应关系 text
- 如何选择B2C电商仓储系统?
- MVC3中Ajax.ActionLink用法
- Javascript的函数直接量定义
- postman传数组参数
- python中输出语句的怎么写_python的输出语句怎么写
- html5怎么把图片置顶,html/css如何让图片上下居中(居中垂直)?
- python语言的就业方向_Python语言就业方向
- php 美颜,怀念以前无滤镜美颜的影视剧