期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表

news2024/11/24 22:39:21

头插法 

#include <stdio.h>
#include <stdlib.h>

struct Node    //定义结构体
{
     char data;   //数据域
     struct Node * next;        //指针域
};

/* 请在这里填写答案 */

void PrintList (struct Node * head)
{
    struct Node * s;
    if(head == NULL)
    {
        printf("None");
        return;
    }
    for(s=head;s!=NULL;s = s->next)
    {
        printf("%c ",s->data);
    }
}

int main()
{
    struct Node * head = NULL;
    
    head = CreateList(head);
    
    PrintList(head);
    
    return 0;
}

头插法的步骤

1.新节点 struct  Node* p;

2.新节点开空间  p=(struct Node*)malloc(sizeof(struct Node));

3.数据存储 p -> data = ch;

4.头插法重点顺序

p->next = head;

head=p;

5.切记要再scanf("%c",&ch);-------完整循环

struct Node* CreateList (struct Node * head)
{
	struct Node* p;
	char ch;
	scanf("%c",&ch);
	
	while(ch!='\n')
	{
		p=(struct Node *)malloc(sizeof(struct Node));
		p->data=ch;
		p->next=head;
		head=p;
		scanf("%c",&ch);
	}
	return head;
}

尾插法:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {  // 定义结构体类型,并且用 typedef 简化声明
    char data;         // 数据域
    struct Node * next;// 指针域
} Node;

// 尾插法创建链表
Node * createListTailInsertion() 
{
    Node *head, *temp, *newnode;
    char ch;

    head = NULL;

    scanf("%c", &ch); // 获取第一个字符
    
    while (ch != '\n') {
        newnode = (Node*) malloc(sizeof(Node)); // 创建新节点
        newnode->data = ch;                      // 赋值给新节点的数据域
        newnode->next = NULL;                    // 设置新节点的下一个为null
        
        if (head == NULL)                        // 如果是第一个节点,则设置头指针指向新节点
            head = temp = newnode;
        else                                     // 否则将新节点添加到链表末尾
        {
            temp->next = newnode;                // 将最后一个节点的指针域指向新节点
            temp = newnode;                      // 更新最后一个节点指针
        }
        
        scanf("%c", &ch);                        // 获取下一个字符
    }

    return head;                                // 返回链表头
}

// 打印链表
void printList(Node * head)
{
    Node * s;
    if(head == NULL)
    {
        printf("None\n");
        return;
    }
    for(s=head;s!=NULL;s = s->next)
    {
        printf("%c ",s->data);
    }
    printf("\n");                               // 输出换行符以使输出更清晰
}

int main()
{
    Node * head = NULL;
    
    head = createListTailInsertion();           // 使用尾插法创建链表
    
    printList(head);                            // 打印链表
    
    return 0;
}

 尾插法步骤:

1.比头插法多一个尾结点*tail;

struct Node* head,* tail, * p;

2.头插尾插都需要 char ch;----表示数据

3.scanf("%c",&ch)

4.新指针节点开空间 p = (struct Node*)malloc(sizeof(struct Node))

5.存储数据   p->data = ch;

                   p->next = NULL;

6.头指针的可能性

head ==NULL-------- head = tail = p; // 头指针是第一个节点,设置头指针指向新节点

head != NULL--------tail -> next = p; tail = p;

7.切记 scanf ("%c",&ch);

返回head;

输出链表:

for (head; head!=NULL; head=head->next)

{

printf("%c",head->data);

}

总结注意易错点:

1.while循环里一定要写成 ch!='\n'循环后面一定要加上 scanf("%c",&ch);---更新数据

不要写成scanf("%c",&ch)!=EOF

否则就不会输出第一个字母

2.头插法和尾插法非常重要的记忆方法:

头插法开始只是struct *head,*p;-------尾插法struct *head,*tail,*p;

头插法开始head=NULL ---------- 尾插法 head = tail =NULL;

头插法循环里  if (head==NULL) ----head = p;

                       else { p->next = head;

                                  head=p;---更新头结点}

尾插法循环里  if(head==NULL)-------head=tail=p;

                        else{ tail->next = p;

                                tail=p;--更新尾结点}

Node * createListTailInsertion() 
{
    struct Node*head,*p;
    char ch;
    scanf("%c",&ch);
    
    head=NULL;
    
    while(ch!='\n')
   //while(scanf("%c",&ch)!=EOF)
  // while(1)
   
    {
    	//if(scanf("%c",&ch)!=1||ch=='\n')break;
    	p=(struct Node*)malloc(sizeof(struct Node));
    	p->data=ch;
    	p->next=NULL;
    	
    	if(head==NULL)  head=p;
    	else
    	{
    		p->next = head;
    		head=p;
		}
		scanf("%c",&ch);
    	
	}
	
	return head;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础教程(二十一):多线程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

在ubuntu中启动docker的mysql8镜像

首先查看docker是否启动&#xff1a; docker ps #出现信息就是启动成功 启动命令&#xff1a; sudo systemctl start docker 设置开机自启&#xff1a; sudo systemctl enable docker 查询下载好的mysql8的镜像文件&#xff1a; docker images 在启动查询好的镜像文件&#…

StarNet实战:使用StarNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2403.19967 论文主要集中在介绍和分析一种新兴的学习范式——星操作&#xff08;Star Operation&#xff09;&#xff0c;这是一种通过元素级乘法融合不同子…

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b&#xff0c;请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在&#xff0c;则返回 -1 。 「最长特殊序列」 定义如下&#xff1a;该序列为 某字符串独有的最长 子序列 &#xff08;即不能是其他字符串的子序列&#xff09; 。 字符串 s …

从传统到智能:数字孪生在火电厂中的应用

通过图扑 HT 可视化技术数字孪生正在运行的火力发电厂&#xff0c;搭建数字化运营平台&#xff0c;对发电厂进行工厂式精细化的数字化管理&#xff0c;提升企业对整个发电厂业务进行数字化管理能力。

安装wsl

安装wsl 先决条件&#xff1a; 打开控制面板->选择程序与功能->选择启动或关闭windows功能&#xff0c;将以下框选的勾选上 二、到Mircosoft store下载Ubuntu 三、如果以上都勾选了还报以下错误 注册表错误 0x8007019e Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG…

gma 2.0.10 (2024.06.16) | GmaGIS V0.0.0a4 更新日志

安装 gma 2.0.10 pip install gma2.0.10网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

QT信号与槽/窗口组件优化/使用QT制作QQ登录界面

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…

2024.6.14 作业 xyt

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c…

【面试干货】Integer 和 int 的区别

【面试干货】Integer 和 int 的区别 1、基本类型与包装类型2、内存占用3、自动装箱与拆箱4、null 值5、常量池6、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Integer 和 int 是两种不同类型的变量&#xff0c;…

在k8s中部署Elasticsearch高可用集群详细教程

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、为什么在k8s中部署elasti…

【团队成长】2024-24周周报-第一次组会人员分工48期推文预告

大家好&#xff01;我们是IndustryOR 团队&#xff0c;致力于分享业界落地的算法技术。欢迎关注微信公众号/知乎/CSDN【运筹匠心】 。 记录人&#xff1a;张哲铭&#xff0c;算法专家&#xff0c;某互联网大厂 【团队成长/个人成长】系列的推文会以 【工作周报】 的方式记录Ind…

视频信号发生器上位机

在液晶屏测试、电视机信号测试、视频处理器测试中&#xff0c;经常需要使用视频信号发生器&#xff0c;市场上专业的视频信号发生器通常需要大几千元&#xff0c;多则上万元&#xff0c;而且设备测试仪器是一套硬件&#xff0c;没有办法像软件一样复制传播。所以我开发了一套基…

机器视觉:工业镜头的主要参数

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

LogicFlow 学习笔记——2. LogicFlow 基础 实例

LogicFlow 实例 创建实例 每一个流程设计界面&#xff0c;就是一个 LogicFlow 的实例。 <template><div id"container"></div><!-- 用于显示 LogicFlow 图表的容器 --> </template> <script>// 创建 LogicFlow 实例const lf …

中文版svn怎么忽略文件

个人需求&#xff1a; 不上传dist&#xff0c;dist.7z&#xff0c;node_modules等文件夹 实际操作&#xff1a; 前言&#xff1a;在上传svn为避免操作失败导致丢失文件的情况&#xff0c;保险起见&#xff0c;先备份代码 1&#xff1a;右键点击 2&#xff1a;点击新建 – 其…

C++初学者指南第一步---4.基本类型

C初学者指南第一步—4.基本类型 文章目录 C初学者指南第一步---4.基本类型1.变量声明2.快速概览Booleans 布尔型Characters 字符型Signed Integers 有符号整数Unsigned Integers 无符号整数Floating Point Types 浮点数类型 3.Common Number Representations 常用的数字表示常用…

C++访问Private,Protecd的一些方法总结

前言 在编写C程序中 我们偶尔会碰到这样的三种特殊修改变量值的需求&#xff1a; [1]在不修改类原本的实现下&#xff0c;访问修改类的Private变量 [2]在不修改类原本的实现下&#xff0c;修改类的Protected变量 Private变量访问 public类模版函数特化 这种办法利用了类模…

密码学-密码协议之零知识证明

一、前言 零知识证明实际上一种密码协议&#xff0c;该协议的一方称为证明者(Prover)&#xff0c;通常用P表示&#xff0c;协议的另一方是验证者(Verifier)&#xff0c;一般用V表示。零知识证明是指P试图使V相信某个论断是正确的&#xff0c;但却不向V提供任何有用的信息&…

springboot与flowable(7):流程变量

一、启动时添加流程变量 拿第一个流程图举例&#xff0c;创建一个新的流程定义。 Testvoid contextLoads() {DeploymentBuilder deployment repositoryService.createDeployment();deployment.addClasspathResource("process01/FirstFlow.bpmn20.xml");deployment.…