【c语言数据结构】单链表的基本操作

2023-05-16

一、目的与要求
1.复习C程序调试、运行的基本操作方法。
2.熟练掌握编辑、编译、连接和运行C 程序的方法。
3.掌握单链表的定义、创建、插入和删除操作程序实现。
二、实验内容
1.定义单链表结构体,获取数据元素。
2.创建链表以输入-1 结束。
3.在第i个节点处插入数据元素X。
4.删除第i个节点。
5.显示链表中的数据元素。
6逆序显示链表中的数据元素

链表节点结构体的定义:

typedef struct Node
{
    int data;
    struct Node *next;
}Node;

创建节点:

Node *create_Node(int n)
{
    Node *node = (Node *)malloc(sizeof(Node));
    if(!node)
    {
        printf("内存不足!\n");
        return NULL;
    }
    node->data = n;
    node->next = NULL;
    return node;
} 

创建单链表:

Node *create_link()
{
    int n=0;
    Node *head = create_Node(0);
    if(!head)
        exit(-1);
    Node *tail;
    tail = head;
    scanf("%d", &n);
    while(n != -1)
    {
        Node *pnew = create_Node(n);
        if(!pnew)
            break;
        tail->next = pnew; //旧节点的指针指向新节点
        tail= pnew;       //新节点变为旧节点
        scanf("%d",&n);
    }
    printf("Input End\n");
    return head;
}

删除单链表:

//删除单链表,释放内存空间
void freeLink(Node *head)
{
    //1.判断链表是否为空,如果为空,则返回
    if(head==NULL)
        return;
    //2.如果非空,则逐个节点释放
    Node *p, *q;
    p = head;
    while(p->next!=NULL)
    {
        q = p->next;
        p->next = q->next;
        free(q);
    }
    free(head);
}

遍历单链表-----正序输出:

//遍历单链表--正序输出
void displayLink(Node *head)
{
    //1.判断链表是否为空,如果为空,则直接返回
    if(!head)
        return;
    //2.打印每一个节点信息
    Node *p = head->next;
    printf("链表正序输出为:\n");
    while(p!=NULL)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
}

遍历单链表-----逆序输出:

//遍历单链表--逆序输出
void Inverse_displayLink(Node *head)
{
    // 1.判断链表是否为空,如果为空,则直接返回
    if (!head)
        return;
    // 2.打印每一个节点信息
    Node *p = head->next;
    int count = 0,i;
    int a[50] = {0};
    printf("链表倒序输出为:\n");
    while (p != NULL)
    {
        a[count] = p->data;
        p = p->next;
        count++;    
    }
    for (i = count-1; i>=0;i--)
    {
        printf("%d\n", a[i]);
    }
}

在指定位置插入节点:

//在指定位置插入节点
void insertNode(Node *head,Node *pnew,int i)
{
    //1.判断链表是否为空,如果为空,则拒绝插入
    if(!head)
        return;
    //2.判断插入的节点是否为空,如果为空,则拒绝插入
    if(!pnew)
        return;
    //3.遍历链表,找到插入位置
    Node *p = head;
    int n = 0;
    for (n = 0; n < i && p->next != NULL;n++)
    {
        p = p->next;
    }
    //4.插入新节点
    pnew->next = p->next;
    p->next = pnew;
}

在指定位置删除节点:

//在指定位置删除节点
void deleteNode(Node *head,int i)
{
    //1.判断链表是否为空,如果为空,则拒绝删除,直接返回
    if(!head)
        return;
    if(i<=0)
        return;
    //2.遍历链表,找到需要删除的位置
    Node *p = head,*q;
    int n = 0;
    for (n = 0; n < i && p->next != NULL;n++)
    {
        p = p->next;
    }
    if(!p)
        return;
    //3.删除找到的节点
    q = p->next;
    p->next = q->next;
    free(q);
}

全部代码:

/*
实现的内容有:
1.定义单链表结构体
2.创建链表以输入-1结束
3.在第i个节点处插入数据元素x
4.删除第i个节点
5.显示链表中的数据元素
6.逆序显示链表中的数据元素
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Node;

Node *create_Node(int n)
{
    Node *node = (Node *)malloc(sizeof(Node));
    if(!node)
    {
        printf("内存不足!\n");
        return NULL;
    }
    node->data = n;
    node->next = NULL;
    return node;
} 

Node *create_link()
{
    int n=0;
    Node *head = create_Node(0);
    if(!head)
        exit(-1);
    Node *tail;
    tail = head;
    scanf("%d", &n);
    while(n != -1)
    {
        Node *pnew = create_Node(n);
        if(!pnew)
            break;
        tail->next = pnew; //旧节点的指针指向新节点
        tail= pnew;       //新节点变为旧节点
        scanf("%d",&n);
    }
    printf("Input End\n");
    return head;
}
//删除单链表,释放内存空间
void freeLink(Node *head)
{
    //1.判断链表是否为空,如果为空,则返回
    if(head==NULL)
        return;
    //2.如果非空,则逐个节点释放
    Node *p, *q;
    p = head;
    while(p->next!=NULL)
    {
        q = p->next;
        p->next = q->next;
        free(q);
    }
    free(head);
}
//遍历单链表--正序输出
void displayLink(Node *head)
{
    //1.判断链表是否为空,如果为空,则直接返回
    if(!head)
        return;
    //2.打印每一个节点信息
    Node *p = head->next;
    printf("链表正序输出为:\n");
    while(p!=NULL)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
}
//遍历单链表--逆序输出
void Inverse_displayLink(Node *head)
{
    // 1.判断链表是否为空,如果为空,则直接返回
    if (!head)
        return;
    // 2.打印每一个节点信息
    Node *p = head->next;
    int count = 0,i;
    int a[50] = {0};
    printf("链表倒序输出为:\n");
    while (p != NULL)
    {
        a[count] = p->data;
        p = p->next;
        count++;    
    }
    for (i = count-1; i>=0;i--)
    {
        printf("%d\n", a[i]);
    }
}
//在指定位置插入节点
void insertNode(Node *head,Node *pnew,int i)
{
    //1.判断链表是否为空,如果为空,则拒绝插入
    if(!head)
        return;
    //2.判断插入的节点是否为空,如果为空,则拒绝插入
    if(!pnew)
        return;
    //3.遍历链表,找到插入位置
    Node *p = head;
    int n = 0;
    for (n = 0; n < i && p->next != NULL;n++)
    {
        p = p->next;
    }
    //4.插入新节点
    pnew->next = p->next;
    p->next = pnew;
}
//在指定位置删除节点
void deleteNode(Node *head,int i)
{
    //1.判断链表是否为空,如果为空,则拒绝删除,直接返回
    if(!head)
        return;
    if(i<=0)
        return;
    //2.遍历链表,找到需要删除的位置
    Node *p = head,*q;
    int n = 0;
    for (n = 0; n < i && p->next != NULL;n++)
    {
        p = p->next;
    }
    if(!p)
        return;
    //3.删除找到的节点
    q = p->next;
    p->next = q->next;
    free(q);
}
int main()
{
    Node *head = create_link();
    displayLink(head);
    Inverse_displayLink(head);
    printf("插入新节点后的单链表\n");
    int n = 0;
    scanf("%d", &n);
    Node *pnew = create_Node(n);
    insertNode(head, pnew, 2);
    displayLink(head);
    printf("删除指定位置的节点之后的单链表\n");
    deleteNode(head, 2);
    displayLink(head);
    freeLink(head);
    system("pause");
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【c语言数据结构】单链表的基本操作 的相关文章

  • Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果

    Qt技术学习班开始了 xff0c 更多精彩 好玩的内容等着你 xff0c 赶紧报名吧 群号 xff1a 655815739 一 简述 在上一篇 Qt 之 去除窗口部件被选中后的焦点虚线框 中 xff0c 我们为了去除焦点虚线框 xff0c
  • Qt 之 自定义窗口标题栏

    Qt训练营开始了 xff0c 更多精彩 好玩的内容等着你 xff0c 赶紧报名吧 群号 xff1a 861353824 一 简述 今天晚上就如何用Qt自定义窗口标题栏 xff0c 写了一个小例子 xff0c 比较基础 xff0c 实用 在此
  • Qt 之 模仿 QQ登陆界面——旋转窗口篇

    一 简述 今天是新的一年第一篇博客 xff0c 有大半个月没有更新博客了 我想是时候 xff0c 打开电脑 拿起键盘 开始在我的代码之路上披荆斩棘 xff0c 斩杀恶龙 今天就继续来分享QQ登录界面的那些事 QQ登录界面的标题栏有一个小三角
  • Ubuntu配置无线路由器笔记记录

    参考文章 xff1a linux 开启制作无线路由器 ubuntu 1404 linux zhu的博客 CSDN博客 hostapd实现WIFI 热点 xff08 AP xff09 自由枫 的博客 CSDN博客 hostapd 终端get一
  • C++STL的使用心得汇总(vector,string,map,list)

    文章目录 find 函数vector的findstring的findmap的find count 函数vector的countstring的countmap的count vectorstringmap的各种排序方法转换相关 待完善 find
  • Qt 之 样式表的使用——设置样式的方法

    一 简述 我们通常在使用Qt开发的过程中都会使用样式表来美化我们的界面 xff0c 关于如何使用样式表的资料也很多 xff0c 样式表的使用方法也千变万化 为了搭建一个漂亮的界面那么必须学会如何使用样式表 xff0c Qt帮助文档中提供了非
  • 如何使QGraphicsItem不随QGraphicsView放大缩小而改变大小

    一 简述 在使用QGraphicsView过程中 xff0c 有时候我们需要对view进行缩放 xff0c 但是对于一般正常的加入view中的item都会随着view的大小变化而变化 xff0c 但是如果我们想让某些item不随view的缩
  • 【linux系统如何查看内核版本、操作系统版本等信息】

    有时候需要查看linux系统的内核版本 xff0c 可以有多种方法 xff0c 方法如下 xff1a xff08 下面以优麒麟系统为例 xff09 方法1 xff1a 打开mate终端 xff0c 在命令行输入以下命令 xff1a unam
  • 【linux系统如何安装arm交叉编译工具链】

    文章目录 前言一 arm交叉编译器介绍命名规则具体编译器 二 Arm GNU Toolchain安装总结 前言 本文简要介绍arm交叉编译器及工具链的安装方法 一 arm交叉编译器介绍 命名规则 交叉编译工具链的命名规则为 xff1a ar
  • 比较冒泡排序、选择排序和快速排序的时间(C语言实现)

    文章目录 前言代码设计代码实现运行结果结果分析稳定性测试 总结 前言 本文主要比较冒泡排序 快速排序 选择排序的时间 冒泡排序和快速排序的思想可以参考我转载的以下博文 xff1a https blog csdn net gogo0707 a
  • freertos应用程序常见错误排查

    freertos系统应用程序常见问题 对一些比较常见的问题 xff0c 下面简要的以 FAQ 问答 的形式给出可能的原因和解决方法 问题现象 xff1a 在一个 Demo 应用程序中增加了一个简单的任务 xff0c 导致应用程序崩溃 任务创
  • keil5编译工程常见问题汇总

    简介 我们在编译keil工程的时候总是遇到很多问题 xff0c 我把一些常见的问题和解决方案汇总下来 xff0c 仅供大家参考 问题汇总 问题1 问题描述 选择arm v6版本编译器 xff0c 编译keil5工程 xff0c 报错 xff
  • mdk arm debug配置

    简述 本文简要讲述启动调试之前如何配置debug 点击魔术棒 xff0c 进入debug选项界面 xff0c 如下图 xff1a 我们可以选择软件仿真 xff0c 也可以选择硬件仿真 xff08 软件仿真不需要接开发板和仿真器 xff09
  • stm32高级定时器实现pwm互补输出

    简介 stm32设备一般都有很多类型的定时器 xff0c 常见的有systick timer 基本定时器 通用定时器 高级定时器 看门狗定时器 RTC等等 xff0c 本文简单介绍高级定时器是如何实现pwm互补输出 详细 我这里使用的dev
  • shell脚本基础知识(入门)

    简介 本文会全面介绍shell脚本的基础知识 脚本格式 要把shell命令放到一个 脚本 当中 xff0c 有一个要求 xff1a 脚本的第一行必须写成类似这样的格式 xff1a bin bash bash是一个shell解释器 xff0c
  • 记ADB shell for循环踩坑

    abd 里面的shell的电脑Linux的shell有点不太一样 以下这些案例均不能执行 xff1a for i 61 1 i lt 61 100 i 43 43 do echo i done for i in 1 100 do echo
  • linux线程调度策略简述

    简述 linux系统调度执行的最小单位是线程 xff0c 线程的调度策略有以下三种 xff1a xff08 1 xff09 SCHED FIFO 其静态优先级必须设置为1 99 xff0c 这将意味着一旦线程处于就绪态 xff0c 他就能立
  • stm32串口发送接口

    简介 本文记录一下stm32标准库实现串口发送功能和接收功能的接口函数 轮询方式发送串口数据 1 标准库实现 span class token comment 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • linux系统线程池

    简述 一个进程中的线程就好比是一家公司里的员工 xff0c 员工的数目应该根据公司的业务多少来定 xff0c 太少了忙不过来 xff0c 但是太多了也浪费资源 最理想的情况是让进程有一些初始数目的线程 xff08 线程池 xff09 xff
  • STM32串口环形缓冲区

    目录 1 xff1a 概述 2 xff1a 代码 1 xff1a 概述 1 1 xff1a 本篇实现串口驱动 xff0c 实现printf函数的重定向 xff0c 实现串口的中断接受和发送 xff0c 效仿modbus协议中的3 5T超时机

随机推荐