单链表操作(带头节点)
时间:2020-03-06
本文章向大家介绍单链表操作(带头节点),主要包括单链表操作(带头节点)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//带头节点的单链表
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{ //定义单链表
int data;
struct LNode *next;
}Node , *LinkList;
bool InitList(LinkList &); //初始化单链表
bool ListInsert(LinkList & , int , int); //在指定位置插入数据
bool Empty(LinkList); //判断链表是否为空
bool HListInsert(LinkList & , int , int); //在指定节点前面插入数据
bool RListInsert(LinkList & , int , int); //在指定节点后面插入数据
void output(LinkList); //输出链表
bool ListDelete(LinkList & , int , int &); //删除指定位置的数据
bool HeadInsert(LinkList , int); //头插法
bool TailInsert(LinkList , int); //尾插法
Node* GetElem(LinkList , int); //查找指定位置的值
int LocateElem(LinkList , int); //查找指定的值在哪个位置
int main(void){
LinkList L;
InitList(L);
HeadInsert(L,5);
HeadInsert(L,2);
TailInsert(L,7);
TailInsert(L,4);
printf("当前单链表中的数据是:");
output(L);
printf("\n");
Node* r = GetElem(L,3);
printf("你要查找的值是%d",r->data);
printf("\n");
int x = LocateElem(L,7);
printf("你要查找的值在第%d位",x);
printf("\n");
int e = -1;
ListDelete(L,2,e);
printf("删除的哪个元素是:%d",e);
printf("\n");
printf("当前单链表中的数据是:");
output(L);
printf("\n");
if(Empty(L)){
printf("当前链表为空!");
}else{
printf("当前链表不为空! ");
}
return 0;
}
//初始化单链表
bool InitList(LinkList &L){
L = (Node*)malloc(sizeof(Node));
if(L == NULL){
return false;
}
L->next = NULL;
return true;
}
//遍历单链表
void output(LinkList L){
Node *p = L->next;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
}
//判断单链表是否为空
bool Empty(LinkList L){
if(L->next == NULL){
return true;
}else{
return false;
}
}
//在指定的位置插入数据
bool ListInsert(LinkList &L ,int i , int e){
if(i < 1){
return false;
}
Node *p = L;
int j = 0;
while(p != NULL && j < i-1){
p = p->next;
j ++;
}
if(p == NULL){
return false;
}
Node *s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//在指定节点前面插入数据
bool HListInsert(LinkList &L , int i , int e){
if(i < 1){
return false;
}
Node *p = L;
int j = 0;
while(p != NULL && j < i){
p = p->next;
j ++;
}
if(p == NULL){
return false;
}
Node *s = (Node *)malloc(sizeof(Node));
s->data = p->data;
p->data = e;
s->next = p->next;
p->next = s;
return true;
}
//在指定节点后面插入数据
bool RListInsert(LinkList &L , int i , int e){
if(i < 1){
return false;
}
Node *p = L;
int j = 0;
while(p != NULL && j < i){
p = p->next;
j ++;
}
if(p == NULL){
return false;
}
Node *s = (Node *)malloc(sizeof(Node));
s->next = p->next;
p->next = s;
s->data = e;
}
//删除指定位置的数据
bool ListDelete(LinkList &L , int i , int &e){
if(i < 1){
return false;
}
Node *p = L;
int j = 0;
while(p != NULL && j < i-1){
p = p->next;
j ++;
}
if(p == NULL || p->next == NULL){
return false;
}
Node *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
//头插法
bool HeadInsert(LinkList L , int e){
Node *s = (Node *)malloc(sizeof(Node));
//L->next = NULL; //使用头插法建立单链表时需要初始化next
s->data = e;
s->next = L->next;
L->next = s;
return true;
}
//尾插法
bool TailInsert(LinkList L , int e){
Node *p = L;
while(p->next != NULL){
p = p->next;
}
Node *s = (Node *)malloc(sizeof(Node));
s->next = p->next;
p->next = s;
s->data = e;
return true;
}
//查找指定位置的值
Node* GetElem(LinkList L , int i){
if(i < 1){
return NULL;
}
Node *p = L;
int j = 0;
while(p != NULL && j < i){
p = p->next;
j ++;
}
return p;
}
//查找指定的值在哪个位置
int LocateElem(LinkList L , int e){
Node *p = L->next;
int j = 1;
while(p != NULL && p->data != e){
p = p->next;
j ++;
}
if(p == NULL){
return -1;
}else{
return j;
}
}
原文地址:https://www.cnblogs.com/Timesi/p/12425972.html
- AssemblyExecuteAdapter
- MySQL入门学习笔记——七周数据分析师实战作业
- 左手用R右手Python系列——七周数据分析师学习笔记R语言、Python版
- Python Numpy学习教程(一)Python篇
- MySQL数据库基础——本地文件交互
- 左手用R右手Python系列之——noSQL基础与mongodb入门
- 左手用R右手Python系列之——数据框与apply向量运算
- 左手用R右手Python系列之——迭代器与迭代对象
- 【关关的刷题日记61】Leetcode 102. Binary Tree Level Order Traversal
- 【关关的刷题日记62】Leetcode 104. Maximum Depth of Binary Tree
- DataAnnotations - InverseProperty Attribute:
- 【关关的刷题日记63】Leetcode 111 Minimum Depth of Binary Tree
- Configure Many-to-Many relationship:
- 【关关的刷题日记64】Leetcode 110 Balanced Binary Tree
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 动态规划算法练习(5)--medium
- phpstudy漏洞分析原因到修复
- 哈?命令注入外带数据的姿势还可以这么骚?
- 记一次曲折的RCE挖掘
- pytest文档49-命令行参数--tb的使用
- pytest文档50-命令行参数--durations统计用例运行时间
- pytest文档51-内置fixture之cache使用
- pytest文档53-命令行实时输出错误信息(pytest-instafail)
- pytest文档52-命令行参数--setup-show查看fixture的执行过程
- pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)
- SAS-免费的描述性统计程序自动化创建
- Godot游戏开发实践之四:搬运Unity的Pluggable AI教程
- TypeScript 4.1 新特性:字符串模板类型,Vuex 终于有救了?
- 使用 Node.js 定制你的技术雷达:上篇
- 使用 Node.js 定制你的技术雷达:中篇