实现算法预览

这次博主写的单链表主要实现了以下算法。所有功能可进行循环运行测试欢迎各位指正

LinkList.h

#pragma once
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#define _CRT_SECURE_NO_WARNINGS
typedef struct LinkNode LinkNode;
typedef struct LinkNode
{int data;LinkNode* next;
}LinkNode;//初始化链表数据
LinkNode* initLinkList();//插入结点 根据查询的值的在其前面插入新的值
int insertLinkList(LinkNode* pHeader, int oldVal, int newVal);//获取链表结点个数
int getLengthLinkList(LinkNode* pHeader);//遍历链表进行打印结点
int printLinkList(LinkNode* pHeader);//删除结点 根据查询的值删除相应的结点
int deleteLinkList(LinkNode* pHeader, int val);//清空链表 保留头结点,仍然可以进行单链表相关操作
int clearLinkList(LinkNode* pHeader);//销毁链表 连头结点都释放
int destroyLinkList(LinkNode* pHeader);//loc 插入到链表的第几个位置,从1开始 loc <=1 放在第一个位置 ,超过结点最后一个位置放在尾结点
int insertPositionLinkList(LinkNode* pHeader, int loc, int val);//删除第loc位置的元素,loc 如果不合法(<1或>结点个数不删除元素),通过指针将结点数据返回
int delPositionLinkList(LinkNode* pHeader, int loc, int* val);//链表反转
int reverseLinkList(LinkNode* pHeader);//利用递归进行逆序遍历
void printRerverseLinkList(LinkNode* pHeader);#endif // !__LINKLIST_H__

单链表简要介绍

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

单链表代码展示

LinkList.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"LinkNode* list = NULL;
//初始化链表数据
LinkNode* initLinkList()
{LinkNode *head = (LinkNode *)malloc(sizeof(LinkNode));LinkNode* cur = head;while (1){printf("请输入结点数据(-1退出):");int val = 0;scanf("%d", &val);if (val == -1){break;}LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));node->next = NULL;node->data = val;cur->next = node;cur = node;}return head;
}//插入结点 往查询的值的前面插入新的值
int insertLinkList(LinkNode* pHeader, int oldVal, int newVal)
{if (pHeader == NULL){return 0;}LinkNode* pre = pHeader;LinkNode* cur = pHeader->next;while (cur!=NULL){if (cur->data == oldVal){break;}pre = pre->next;cur = cur->next;}//创建新结点LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));newNode->data = newVal;newNode->next = NULL;pre->next = newNode;newNode->next = cur;return 1;
}
//获取链表结点个数
int getLengthLinkList(LinkNode* pHeader)
{if (pHeader == NULL){return 0;}LinkNode* cur = pHeader;int length = 0;while (cur->next != NULL){cur = cur->next;length++;}return length;
}//打印结点
int printLinkList(LinkNode* pHeader)
{if (pHeader == NULL){return 0;}if (pHeader->next == NULL){printf("当前链表为空!\n");}LinkNode* cur = pHeader->next;int num = 1;while (cur!=NULL){printf("第%d个结点data: %d\n", num, cur->data);cur = cur->next;num++;}return 0;
}
//删除结点
int deleteLinkList(LinkNode* pHeader,int val)
{if (pHeader == NULL){return 0;}LinkNode* pre = pHeader;LinkNode* cur = pHeader->next;while (cur != NULL){if (cur->data == val){break;}pre = pre->next;cur = cur->next;}if (cur != NULL){pre->next = cur->next;free(cur);cur = NULL;}return 1;
}
//清空链表 保留头结点
int clearLinkList(LinkNode* pHeader)
{if (pHeader == NULL){return 0;}LinkNode* cur = pHeader->next;while (cur != NULL){LinkNode* next = cur->next;free(cur);cur = next;}pHeader->next = NULL;return 1;
}
//销毁链表
int destroyLinkList(LinkNode* pHeader)
{if (pHeader == NULL){return 0;}clearLinkList(pHeader);free(pHeader);return 1;
}
//loc 插入到链表的第几个位置,从1开始 loc <=1 放在第一个位置 ,超过结点最后一个位置放在尾结点
int insertPositionLinkList(LinkNode* pHeader,int loc, int val)
{if (pHeader == NULL){return 0;}LinkNode* cur = pHeader;int i = 1;while (cur->next!=NULL && i<loc){i++;cur = cur->next;}//cur 为插入元素的前驱结点LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));newNode->data = val;newNode->next = cur->next;cur->next = newNode;return 1;
}
//删除第loc位置的元素,loc 如果不合法(<1或>结点个数不删除元素),通过指针将结点数据返回
int delPositionLinkList(LinkNode* pHeader, int loc, int* val)
{if (pHeader == NULL || loc < 1){return 0;}LinkNode* cur = pHeader;int i = 1;while (cur->next != NULL&&i<loc){i++;cur = cur->next;}//cur 为删除元素的前驱结点if (i == loc && cur->next!=NULL){LinkNode* del = cur->next;*val = del->data;cur->next = del->next;free(del);del = NULL;return 1;}return 0;
}
//链表反转
int reverseLinkList(LinkNode* pHeader)
{if (pHeader == NULL){return 0;}LinkNode* pre = NULL;LinkNode* cur = pHeader->next;LinkNode* next = NULL;while (cur !=NULL){//保存当前节点的下一个结点next = cur->next;//将当前节点的next域指向前一个结点cur->next = pre;//pre、cur 往后移动pre = cur;cur = next;}//循环结束 pre 指向最后一个结点,将头结点指向 它pHeader->next = pre;return 1;
}void printRerverseLinkList(LinkNode * pHeader)
{LinkNode* cur = pHeader->next;if (cur == NULL){return;}printRerverseLinkList(cur);printf("%d ", cur->data);
}void fun01_init()
{list = initLinkList();printLinkList(list);return;
}
void fun02_valueInsert()
{int oldVal = 0, newVal = 0;printf("请输入查询的值:");scanf("%d", &oldVal);printf("请输入要插入值:");scanf("%d", &newVal);int ret = insertLinkList(list, oldVal, newVal);if (ret){printf("插入成功\n");}else{printf("插入失败\n");}printLinkList(list);return;
}
void fun03_valueInsertPosition()
{int loc = 0, newVal = 0;printf("请输入插入的位置:");scanf("%d", &loc);printf("请输入要插入值:");scanf("%d", &newVal);int ret = insertPositionLinkList(list, loc, newVal);if (ret){printf("插入成功\n");}else{printf("插入失败\n");}printLinkList(list);return;
}
void fun04_valueDel()
{int val = 0;printf("请输入要删除的值:");scanf("%d", &val);int ret = deleteLinkList(list,val);if (ret){printf("删除成功\n");}else{printf("删除失败\n");}printLinkList(list);return;
}
void fun05_valueDelPosition()
{int loc = 0,val = 0;printf("请输入删除元素的位置:");scanf("%d", &loc);int ret = delPositionLinkList(list, loc,&val);if (ret){printf("删除成功,删除元素的值:%d\n",val);}else{printf("删除失败\n");}printLinkList(list);return;
}
void fun06_reverseLinkList()
{reverseLinkList(list);printLinkList(list);return;
}
void fun07_clearLinkList()
{clearLinkList(list);return;
}
void fun08_destroyLinkList()
{destroyLinkList(list);return;
}int main(int argc, char *argv[])
{int menu = 0;while (1){printf("---菜单-----------------------\n");printf("---1、初始化链表--------------\n");printf("---2、通过结点值插入结点------\n");printf("---3、通过位置插入结点--------\n");printf("---4、通过结点值删除结点------\n");printf("---5、通过位置删除结点--------\n");printf("---6、反转链表----------------\n");printf("---7、清空链表----------------\n");printf("---8、销毁链表----------------\n");printf("---9、遍历链表----------------\n");printf("--10、链表长度----------------\n");printf("--11、逆序遍历----------------\n");printf("---0、退出--------------------\n请输入:");scanf("%d",&menu);if (menu == 0){break;}switch (menu){case 1:fun01_init();break;case 2:fun02_valueInsert();break;case 3:fun03_valueInsertPosition();break;case 4:fun04_valueDel();break;case 5:fun05_valueDelPosition();break;case 6:fun06_reverseLinkList();break;case 7:fun07_clearLinkList();break;case 8:fun08_destroyLinkList();break;case 9:printLinkList(list);break;case 10:printf("链表元素个数:%d\n",getLengthLinkList(list));break;case 11:printRerverseLinkList(list);printf("\n");break;default:break;}}return 0;
}

运行结果测试

  

  

数据结构与算法:单链表(超详细实现)相关推荐

  1. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  2. 【数据结构】——单链表超详细介绍(独家介绍,小白必看!!!)

    被滑走别滑走,我这一万字的文章,写的真的很痛苦的,希望能得到一点点支持!!! 重点内容和易错点都用彩笔标注了,干货满满,耐心看完,我真的真的有在认真更新o(╥﹏╥)o 上一篇文章介绍完顺序表后,我们就 ...

  3. 数据结构之单链表超详细

    目录 单链表介绍和内存布局 单链表的应用实例 单链表的创建和和遍历分析 单链表的创建和和遍历代码 单链表按顺序插入节点 代码实现 单链表结点的修改 删除结点 经典面试题 求单链表的结点个数 查找单链表 ...

  4. 头歌平台数据结构与算法 单链表实验 第1关:倒置链表

    任务描述 相关知识 实验目的 实验任务 实验说明 编程要求 测试说明 任务描述 本关任务:请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证. 相关知识 实验目的 理解线 ...

  5. [数据结构与算法] 单链表的简单demo

    Vc6之下编译通过.. 1 /******************************************************* 2 * @: Project: 单链表数据结构演示 3 * ...

  6. 常考数据结构与算法:单链表的排序

    题目描述 给定一个无序单链表,实现单链表的排序(按升序排序). 输入 [1,3,2,4,5] 返回值 {1,2,3,4,5} public class SortInListME {public sta ...

  7. 数据结构与算法-单链表的常见面试题(单链表的长度,单链表倒数第k个数据)

    单链表的长度,单链表倒数第k个数据 求单链表中节点的个数 思路分析 完整代码 查找单链表中倒数第k个节点 思路如下: 全量代码 求单链表中节点的个数 在上一节代码的基础上我们来学习 思路分析 我们创建 ...

  8. 韩老师——数据结构与算法—单链表的生成及增删改查操作和常见关于链表的面试题java代码实现

    话不多说直接上代码. public class SingleLinkedListDemo {public static void main(String[] args) {//测试HeroNode n ...

  9. 数据结构与算法——单链表、双向链表

    目录 ​编辑 特点: 一.单链表 1.增加数据到链表尾部 2.增加数据到链表指定位置 思路: 代码实现: 3.修改单链表数据 3.单链表数据删除 4.单链表相关面试题 二.双向链表 1.双向链表遍历 ...

  10. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

最新文章

  1. javascript打印
  2. yum php devel_yum源里找不到 php54w-devel,求可用yum源
  3. 获取手机通讯录跟sim卡通讯录
  4. 一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized...
  5. 1805. 字符串中不同整数的数目
  6. spring—Bean实例化三种方式
  7. C++学习之路 | PTA乙级—— 1041 考试座位号 (15 分)(精简)
  8. laravel修改.env不生效原因以及解决办法
  9. linux path 文件,linux基础,文件目录管理,PATH,cp,mv,cat
  10. #Java编程题-百钱百鸡
  11. 第八届蓝桥杯第五题取数位
  12. 本地安装的smushit,如何压缩图片
  13. 十大硬盘数据恢复软件简评
  14. TCP和UDP以及IP报文格式
  15. free pascal语言学习笔记(一)
  16. 电气版CAD学习笔记
  17. 关键词细分优化的策略方法
  18. 学习Nginx这一篇就够了(非本人原创文章)
  19. Vue中error ‘XXXXX‘ is not defined no-undef解决办法
  20. lavarvel框架路由

热门文章

  1. shell mysql_shell操作mysql
  2. .so文件反编译_java加密防止反编译-VirboxProtector
  3. Mysql数据库常用命令,mysql速学实用教程。
  4. CANopen | 拓展知识 - CANopen,CAN总线与OSI模型的关系
  5. Qt学习之Qt基础入门(下)
  6. 进行判断使用class_记一次使用 Arthas 热更新线上代码
  7. thinkPHP 阿里云OSS 上传文件、直接下载
  8. mui HTML5 plus 下载文件
  9. Java笔记-Linux环境中因编码问题导致中文String解析有问题
  10. Arduino笔记-解决ESP8266上传代码时出现error: espcomm_upload_mem failed问题