C++ 单链表基本操作
链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的。本文主要有单链表的创建、插入、删除节点等。
1、概念
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。如下图:
2、链表的基本操作
SingleList.cpp:
#include "stdafx.h" #include "SingleList.h" #include <cstdlib> #include <iostream> #include <string.h> #include <conio.h> #include <stdio.h>/*c++实现简单的单链表操作*/ using namespace std;SingleList::SingleList() {int num;char name[128];// 创建链表node *stuList = CreatNode();PrintList(stuList);// 插入节点printf("\n请输入要插入的学生学号和姓名,输入0 0表示结束.");scanf_s("%d%s", &num, name, 100);stuList = InsertNode(stuList, num, name);PrintList(stuList);// 删除节点printf("\n请输入要删除的学生学号:");scanf_s("%d", &num, 100);stuList = DeleteNode(stuList, num);PrintList(stuList);// 逆序printf("\n逆序后的链表为:\n");stuList = ReverseList(stuList);PrintList(stuList);system("PAUSE"); }SingleList::~SingleList() { }//建立单链表 node *SingleList::CreatNode() {node *head, *p, *s;int num = 0;char name[128];int cycle = 1;head = (node *)malloc(sizeof(node)); // 为头结点分配内存空间head->next = nullptr;p = head; // p指向头节点while (cycle){printf("\n请输入学生的学号和姓名:");scanf_s("%d%s", &num, name, 100);if (num != 0){s = (node *)malloc(sizeof(node));s->num = num;memcpy(s->name, name, 128);printf("%d%s", s->num, s->name);p->next = s; // 指向新插入的节点p = s; // p指向当前节点 }else{cycle = 0;}}head = head->next;p->next = NULL;printf("头节点学生信息为: %d%s\n", head->num, head->name);return head; }//单链表插入 node *SingleList::InsertNode(node *head, int num, char* name) {node *s, *p1, *p2 = NULL;p1 = head;s = (node *)malloc(sizeof(node));s->num = num;strcpy_s(s->name, name);while ((s->num > p1->num) && p1->next != NULL){p2 = p1;p1 = p1->next;}if (s->num <= p1->num){if (head == p1){// 插入首节点s->next = p1;head = s;}else{// 插入中间节点p2->next = s;s->next = p1;}}else{// 插入尾节点p1->next = s;s->next = NULL;}return head; }// 计算单链表长度 int SingleList::GetLength(node *head) {int length = 0;node *p;p = head;while (p != NULL){p = p->next;length++;}return length; }//单链表删除某个元素 node *SingleList::DeleteNode(node *head, int num) {node *p1, *p2 = nullptr;p1 = head;while (num != p1->num && p1->next != NULL){p2 = p1;p1 = p1->next;}if (num == p1->num){if (p1 == head){head = p1->next;}else{p2->next = p1->next;}free(p1);}else{printf("找不到学号为%d 的学生!\n", num);}return head;}//单链表逆序 node *SingleList::ReverseList(node *head) {// A->B->C->Dnode *old_head; // 原来链表的头node *new_head; // 新链表的头node *cur_head; // 获得原来链表的头if (head == NULL || head->next == NULL)return head;new_head = head; // Acur_head = head->next; // Bwhile (cur_head){old_head = cur_head->next; // 将原来链表的头取出,并将第二个节点作为头节点cur_head->next = new_head; // 将取出的头设为新链表的头new_head = cur_head; // 新链表的头就是目前新链表的头cur_head = old_head; // 接着处理 }head->next = NULL;head = new_head;return head; }//打印单链表 void SingleList::PrintList(node *head) {node *p;int n;n = GetLength(head);printf("\n打印出 %d 个学生的信息:\n", n);p = head;while (p != NULL){printf("学号: %d ,姓名: %s\n", p->num, p->name);p = p->next;} }
SingleList.h:
#pragma once typedef struct student {int num; // 学号char name[128]; // 姓名struct student *next; }node;class SingleList { public:SingleList();~SingleList();//建立单链表 node *CreatNode();//单链表插入node *InsertNode(node *head, int num, char* name);// 计算单链表长度int GetLength(node *head);//单链表删除某个元素 node *DeleteNode(node *head, int num);//单链表逆序node *ReverseList(node *head);//打印单链表void PrintList(node *head);};
关于逆序逻辑,研究了一下:
1、主要思路:
- 假设有单链表A->B->C->D,首先取出首节点A作为新逆序出来的链表
这样,原链表就为:B->C->D,逆序后的新链表为:A
2. 按照上述方法,依次取出B、C、D放入新链表
2、图形表示:
原始的单链表:
初始状态时,单链表如上图所示,head指向头节点A。
1. 取出原始链表的第一个节点A,然后将该节点作为新链表的头节点
原始链表:
新链表:
2.然后同上处理:
原始链表:
新链表:
。。。。。。
转载于:https://www.cnblogs.com/xiaobaiobject/p/singleList.html
C++ 单链表基本操作相关推荐
- 7-4 单链表基本操作
7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...
- 237删除链表中的节点(单链表基本操作)
1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...
- C语言单链表基本操作总结
C语言单链表基本操作 本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...
- 数据结构-单链表基本操作-C语言代码
单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...
- 【数据结构|链表】单链表基本操作
文章目录 一.链表 二.链表分类 三.单链表基本操作 3.1 单链表存储结构Init 3.2 遍历链表visitlist函数 3.3 求表长length 3.4 查找listfind ...
- 单链表基本操作的实现
单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...
- 【数据结构-C】单链表基本操作及图解分析
目录 单链表介绍 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点 3. 尾插法向单链表中插入结点 4.头删法删除单链表结点 5.尾删法删除单链表结点 6.返回单链 ...
- C 语言单链表基本操作
复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...
- C语言实现单链表基本操作
C语言实现单链表基本操作的 目录
- 图解链表 —— JAVA中的单链表基本操作
文章目录 1. 什么是链表 2. 链表的种类 3. 创建单链表 3.1 创建 Node 类(车厢类) 3.2 创建 MySingleList (火车类) 4. 单链表的基本操作 4.1 增加链表元素 ...
最新文章
- WINKEY功能键你会用吗??
- 从技术视角看考拉海购的云原生之路
- HDU - 5572 An Easy Physics Problem(几何-碰撞问题)
- Django从理论到实战(part10)--URL命名与反转
- 实验7-3-1 字符串逆序 (15分)
- C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用
- android studio 触摸锁,学习AndroidStudio布局,并编写一个图案解锁demo
- java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner
- 基于tcpdump实例讲解TCP/IP协议
- 企业应用大数据探索发展新路径
- 搭建Jetbrains家族IDE授权服务器
- 最佳软件开发实践指导
- 设置vim默认显示行号
- 六级考研单词之路-十五
- 用星号打印出一个如图所示的空心菱形
- 面试官都叫好的Synchronized底层实现,这工资开多少一个月?
- 阿里云centos7配置php mysql_阿里云centos7安装NGINX+MYSQL+PHP-FPM环境
- 跟李沐学AI:实用机器学习 | 第五章
- php爬虫教程(一) 简单的页面抓取
- Android获取歌曲详细信息
热门文章
- python2和python3共存时,设置默认python为python3
- 整理 linux常用命令及工具
- OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
- 一篇通俗易懂的讲解OpenGL ES的文章
- 软件测试第五周 - 编码的 UI 测试
- 深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods)...
- DBCA静默建库中的两个小问题
- 初探facebook的iOS/Mac OS X动画框架pop
- 11.性能之巅 洞悉系统、企业与云计算 --- 云计算
- 61.Linux/Unix 系统编程手册(下) -- SOCKET: 高级主题