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

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[]; // 创建链表
node *stuList = CreatNode();
PrintList(stuList); // 插入节点
printf("\n请输入要插入的学生学号和姓名,输入0 0表示结束.");
scanf_s("%d%s", &num, name, );
stuList = InsertNode(stuList, num, name);
PrintList(stuList); // 删除节点
printf("\n请输入要删除的学生学号:");
scanf_s("%d", &num, );
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 = ;
char name[];
int cycle = ; head = (node *)malloc(sizeof(node)); // 为头结点分配内存空间
head->next = nullptr;
p = head; // p指向头节点 while (cycle)
{
printf("\n请输入学生的学号和姓名:");
scanf_s("%d%s", &num, name, ); if (num != )
{
s = (node *)malloc(sizeof(node));
s->num = num;
memcpy(s->name, name, );
printf("%d%s", s->num, s->name);
p->next = s; // 指向新插入的节点
p = s; // p指向当前节点
}
else
{
cycle = ;
}
} 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 = ;
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->D
node *old_head; // 原来链表的头
node *new_head; // 新链表的头
node *cur_head; // 获得原来链表的头 if (head == NULL || head->next == NULL)
return head; new_head = head; // A
cur_head = head->next; // B
while (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[]; // 姓名
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.然后同上处理:

 原始链表:

   

  新链表:

     

  。。。。。。

C++ 单链表基本操作的更多相关文章

  1. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  2. java单链表基本操作

    /** * */ package cn.com.wwh; /** * @Description:TODO * @author:wwh * @time:2021-1-18 19:24:47 */ pub ...

  3. Java单链表实现

    /** * * 单链表基本操作 * * @author John * */ class LinkList { private Node first; private int pos = 0; publ ...

  4. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  5. 用Java实现单链表的基本操作

    笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...

  6. PHP单链表的基本操作

    链表的实现 数据结构第一个就是链表了,链表分为两种有直接的数组形式的顺序链,这里不讨论,什么array_push(),array_pop(),函数基本能满足日常的需求,但报告老板,我就是想装个X 上代 ...

  7. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

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

    #include <stdio.h> #include <stdlib.h> /** * 含头节点单链表定义及基本操作 */ //基本操作函数用到的状态码 #define TR ...

  9. 用java简单的实现单链表的基本操作

    package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 ...

随机推荐

  1. 深入理解MYSQL的MDL元数据锁

    1 前言 2 MDL锁与实现 3 MDL锁的性能与并发改进 4 MDL锁的诊断 前言 好久没更新,主要是因为Inside君最近沉迷于一部动画片——<新葫芦娃兄弟>.终于抽得闲,完成了本篇关 ...

  2. iOS开发,hook系统Objective-C的函数

    我们都知道在windows下可以通过API轻松的hook很多消息,IOS也可以实现hook的功能. 建立一个 TestHookObject类 // // TestHookObject.m // Tes ...

  3. [原创]SSIS-执行包任务调用子包且子包读取父包变量

    背景:       有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的E ...

  4. j疑难杂症:ava.lang.NoSuchMethodError: com.opensymphony.xwork2.util.finder.ClassFinder.<init>

    严重: Exception starting filter struts2java.lang.NoSuchMethodError: com.opensymphony.xwork2.util.finde ...

  5. APP快速通过苹果AppStore审核九大诀窍

    [IT168技术]对于移动应用开发者来说, 最令人沮丧的可能莫过于辛辛苦苦开发的应用, 没能通过苹果AppStore的审核,或者在应用更新时遭遇下架.苹果的AppStore的审核流程和标准, 一向不透 ...

  6. linux中mail函数不能发送邮件怎么办

    原因分析: 1.检查下本机25端口是否有开放 2.mail是利用linux自带的sendmail服务来发送邮件的,service sendmail status 查看下该服务的状态 发送命令:mail ...

  7. NoSQL数据库的分布式算法&&memcache集群的实现

    NoSQL数据库的分布式算法  http://blog.nosqlfan.com/html/4139.html 一致性hash算法在memcache集群中的应用   http://alunblog.d ...

  8. MTD NANDFLASH驱动相关知识介绍

    转:http://blog.csdn.net/zhouzhuan2008/article/details/11053877 目录 MTD总概述 MTD数据结构 MTD相关层实现 MTD,Memory ...

  9. C# 之 反射

    一.反射的定义: 审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等, System.Reflection ...

  10. excel 批量替换换行符

    在excel批量替换换行符操作步骤: 全选需要查找换行符的范围 CTRL+H调出查找和替换 在查找内容内输入"ctrl+enter"两个组合键 点击查找全部即可. 在excel中输 ...