链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的。本文主要有单链表的创建、插入、删除节点等。

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、主要思路:

  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++ 单链表基本操作相关推荐

  1. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

  2. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

  3. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  4. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  5. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  6. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

  7. 【数据结构-C】单链表基本操作及图解分析

    目录 单链表介绍​ 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点​ 3. 尾插法向单链表中插入结点​ 4.头删法删除单链表结点​ 5.尾删法删除单链表结点​ 6.返回单链 ...

  8. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  9. C语言实现单链表基本操作

    C语言实现单链表基本操作的 目录

  10. 图解链表 —— JAVA中的单链表基本操作

    文章目录 1. 什么是链表 2. 链表的种类 3. 创建单链表 3.1 创建 Node 类(车厢类) 3.2 创建 MySingleList (火车类) 4. 单链表的基本操作 4.1 增加链表元素 ...

最新文章

  1. WINKEY功能键你会用吗??
  2. 从技术视角看考拉海购的云原生之路
  3. HDU - 5572 An Easy Physics Problem(几何-碰撞问题)
  4. Django从理论到实战(part10)--URL命名与反转
  5. 实验7-3-1 字符串逆序 (15分)
  6. C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用
  7. android studio 触摸锁,学习AndroidStudio布局,并编写一个图案解锁demo
  8. java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner
  9. 基于tcpdump实例讲解TCP/IP协议
  10. 企业应用大数据探索发展新路径
  11. 搭建Jetbrains家族IDE授权服务器
  12. 最佳软件开发实践指导
  13. 设置vim默认显示行号
  14. 六级考研单词之路-十五
  15. 用星号打印出一个如图所示的空心菱形
  16. 面试官都叫好的Synchronized底层实现,这工资开多少一个月?
  17. 阿里云centos7配置php mysql_阿里云centos7安装NGINX+MYSQL+PHP-FPM环境
  18. 跟李沐学AI:实用机器学习 | 第五章
  19. php爬虫教程(一) 简单的页面抓取
  20. Android获取歌曲详细信息

热门文章

  1. python2和python3共存时,设置默认python为python3
  2. 整理 linux常用命令及工具
  3. OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
  4. 一篇通俗易懂的讲解OpenGL ES的文章
  5. 软件测试第五周 - 编码的 UI 测试
  6. 深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods)...
  7. DBCA静默建库中的两个小问题
  8. 初探facebook的iOS/Mac OS X动画框架pop
  9. 11.性能之巅 洞悉系统、企业与云计算 --- 云计算
  10. 61.Linux/Unix 系统编程手册(下) -- SOCKET: 高级主题