IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 删除单链表指定位置开始的连续多个节点 -> 正文阅读

[数据结构与算法]删除单链表指定位置开始的连续多个节点

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

typedef struct Node
{
    int data; //数据域
    struct Node * pNext; //指针域
}NODE, * PNODE;

PNODE create_linklist(); //创建不带头结点的单链表
bool delete_nodes(PNODE *, int, int); //删除从指定位置开始的连续多个节点
int length_linklist(PNODE); //求链表长度
void traverse_linklist(PNODE); //遍历输出链表

int main(void)
{
    int pos;
    int num;
    PNODE list = NULL;
    list = create_linklist();

    printf("删除前的链表:\n");
    traverse_linklist(list);

    printf("请输入你要删除的位置:\n");
    scanf("%d", &pos);

    printf("请输入你要连续删除的节点个数:\n");
    scanf("%d", &num);

    if(delete_nodes(&list, pos, num))
    {
        printf("删除成功!\n");
    }
    else
    {
        printf("删除失败!\n");
    }
    
    printf("删除后的链表:\n");
    traverse_linklist(list);


    return 0;
}

PNODE create_linklist()
{
    int len; //用来存储链表长度
    int val; //用来暂时存储某个节点的数据域
    int i; //循环变量

    PNODE list = (PNODE)malloc(sizeof(NODE));
    if(!list)
    {
        printf("分配失败,程序退出!\n");
        exit(-1);
    }

    printf("请输入你要生成的链表长度:\n");
    scanf("%d", &len);

    //如果长度为零
    if(0 == len)
    {
        list = NULL;
        return list;
    }

    //不为0
    printf("请输入链表第1个节点的值:\n");
    scanf("%d", &val);

    //为第一个节点的数据域赋值
    list->data = val;
    list->pNext = NULL;

    //长度为1
    if(1 == len)
        return list;

    //创建一个始终指向链表尾节点的指针,初始指向第一个节点
    PNODE pTail = list;
    pTail->pNext = NULL;

    //长度不为1,为第二个及后续节点的数据域赋值
    for (i = 1; i < len; i++)
    {
        printf("请输入链表第%d个节点的值:\n", i+1);
        scanf("%d", &val);

        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if(!pNew)
        {
            printf("分配失败,程序退出!\n");
            exit(-1);
        }

        //为新生成节点的数据域赋值
        pNew->data = val;

        //原链表的尾节点挂在新生成节点上
        pTail->pNext = pNew;

        //新生成节点变为新的尾节点,将其指针域指向空
        pNew->pNext = NULL;

        //pTail后移,使其始终指向链表的尾节点
        pTail = pNew;
    }

    printf("链表创建成功!\n");

    return list;
}

//传入参数中有指向链表第一个节点的指针的指针,是为了方便进行删除第一个节点的操作
//删除第一个节点,需要将新的指向第一个节点的指针,返回给主函数,利用二级指针操作
bool delete_nodes(PNODE * list, int pos, int num)
{
    int i; //循环变量
    PNODE p = * list; 
    PNODE q; //用来暂时保存p的值,方便释放节点空间
    PNODE r; //指向pos所在节点的前驱节点

    //如果发删除位置不对,删除失败,返回false
    if(pos < 1 || pos > length_linklist(*list))
        return false;
    
    //如果链表长度为0,删除失败,返回false
    if(!length_linklist(*list))
        return false;

    //如果开始删除的位置是第一个节点
    if(pos == 1)
    {
        //删除从开始删除位置到最后删除位置的所有节点,并用q暂时保存,指向最后删除节点的后驱节点的指针
        for(i = 0; i < pos+num-1; i++)
        {
            q = p;
            p =p->pNext;
            free(q);
        }

        //将新的指向第一个节点的指针返回给原来创建链表分配的指向第一个节点的指针的空间
        * list = p;

        return true;
    }

    //如果开始删除的位置不是第一个节点
    //找到指向开始删除的节点的指针,以及指向其前驱节点的指针
    for(i = 0; i < pos-1; i++)
    {
        r = p;
        p = p->pNext;
    }

    //通过指向开始删除的节点的指针,删除从开始删除位置到最后删除位置的所有节点,并找到指向最后要删除节点的后驱节点的指针
    for(i = 0; i < num; i++)
    {
        q = p;
        p =p->pNext;
        free(q);
    }

    //将开始删除节点的前驱节点挂在最后要删除节点的后驱节点
    r->pNext = p;

    return true;
}

int length_linklist(PNODE list)
{
    int len = 0;
    PNODE p = list;

    while (p)
    {   
        len++;
        p = p->pNext;
    }

    return len;    
}

void traverse_linklist(PNODE list)
{
    PNODE p = list;

    while (p)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }

    printf("\n");

    return;    
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 16:00:39  更:2021-09-20 16:01:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:38:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码