P.S 本栏目所有文章均使用C语言,和书中的ADL语言以及C++语言有区别。

题目

例3.16:已知非空线性链表第一个结点的指针为list,写一算法,删除线性链表中的第i个结点。

思路及解答

题中说非空线性链表第一个结点的指针为list,说明这是个无头链表,有头链表都从哨位结点开始,先写出无头链表的基本操作

#include <stdio.h>
#include<stdlib.h>
//无头链表结点结构体
typedef struct LinkNode {int data;//数据域struct LinkNode* next;//指针域
}LinkNode;
//无头链表结构体
typedef struct LinkList {LinkNode* list;//指向第一个结点的指针
}LinkList;
//初始化无头链表
void InitLinkList(LinkList* L)
{//最开始链表中无元素,所以front指针和tail指针都是NULLL->list = NULL;
}
//尾插法
void InsertTail(LinkList* L, int elem)
{//如果最开始链表是空的,则直接为front指针开辟内存空间if (L->list == NULL){L->list = (LinkNode*)malloc(sizeof(LinkNode));if (L->list == NULL){printf("内存不足!\n");return;}L->list->data = elem;L->list->next = NULL;return;}//如果链表非空,则需要先找到最后一个结点LinkNode* p = L->list;//获取第一个结点while (p->next != NULL){p = p->next;}//创建新结点准备尾插LinkNode* q = (LinkNode*)malloc(sizeof(LinkNode));if (q == NULL){printf("内存不足!\n");return;}q->data = elem;q->next = NULL;p->next = q;return;
}
//打印无头链表
void printLinkList(LinkList* L)
{//链表有元素才打印if (L->list != NULL){LinkNode* p = L->list;//获取第一个元素while (p != NULL){printf("%d\t", p->data);p = p->next;}printf("\n");}
}

题中所说的序号是和链表中的结点一一对应的,不是和下标一样从0开始,而是从1开始。接下来是本题的C语言版的答案:

//按序号删除结点,其中list为第一个结点
void DeleteByNumber(LinkList* L,LinkNode* list,int i)
{//检查输入是否合乎规定if (i < 1){printf("序号不能小于1!\n");return;}//先处理删除第一个结点的情况,因为第一个结点删除后,链表即空,没有哨位结点,需要做特殊处理if (i == 1){//先取第一个结点LinkNode* p = list;list = list->next;L->list = list;free(p);//删除内存空间,防止脏数据生成return;}//删除不是第一个结点的情况LinkNode* p = list;//找到第一个结点LinkNode* node = NULL;//获取前一个结点的临时变量//遍历找到要删除结点的前一个结点,条件k<i即可找到要删除结点的前一个结点for (int k = 1; k < i; k++){node = p;//先获取每次循环遍历之前的结点(这样能保证最后一次遍历,node是要删除结点的前一个结点,而p经历了一次p=p->next后变成了要删除的结点)//符合差分方程node=H(n-1),p=H(n)p = p->next;if (p == NULL){printf("链表中不存在第%d个结点!\n", i);return;}}//获取要删除的结点LinkNode* q = node->next;//孤立要删除的结点node->next = node->next->next;//释放删除结点的内存空间free(q);
}

完整的测试用代码如下(注释已经给出详细的实现思路):

#include <stdio.h>
#include<stdlib.h>
//无头链表结点结构体
typedef struct LinkNode {int data;//数据域struct LinkNode* next;//指针域
}LinkNode;
//无头链表结构体
typedef struct LinkList {LinkNode* list;//指向第一个结点的指针
}LinkList;
//初始化无头链表
void InitLinkList(LinkList* L)
{//最开始链表中无元素,所以front指针和tail指针都是NULLL->list = NULL;
}
//尾插法
void InsertTail(LinkList* L, int elem)
{//如果最开始链表是空的,则直接为front指针开辟内存空间if (L->list == NULL){L->list = (LinkNode*)malloc(sizeof(LinkNode));if (L->list == NULL){printf("内存不足!\n");return;}L->list->data = elem;L->list->next = NULL;return;}//如果链表非空,则需要先找到最后一个结点LinkNode* p = L->list;//获取第一个结点while (p->next != NULL){p = p->next;}//创建新结点准备尾插LinkNode* q = (LinkNode*)malloc(sizeof(LinkNode));if (q == NULL){printf("内存不足!\n");return;}q->data = elem;q->next = NULL;p->next = q;return;
}
//打印无头链表
void printLinkList(LinkList* L)
{//链表有元素才打印if (L->list != NULL){LinkNode* p = L->list;//获取第一个元素while (p != NULL){printf("%d\t", p->data);p = p->next;}printf("\n");}
}
//按序号删除结点,其中list为第一个结点
void DeleteByNumber(LinkList* L,LinkNode* list,int i)
{//检查输入是否合乎规定if (i < 1){printf("序号不能小于1!\n");return;}//先处理删除第一个结点的情况,因为第一个结点删除后,链表即空,没有哨位结点,需要做特殊处理if (i == 1){//先取第一个结点LinkNode* p = list;list = list->next;L->list = list;free(p);//删除内存空间,防止脏数据生成return;}//删除不是第一个结点的情况LinkNode* p = list;//找到第一个结点LinkNode* node = NULL;//获取前一个结点的临时变量//遍历找到要删除结点的前一个结点,条件k<i即可找到要删除结点的前一个结点for (int k = 1; k < i; k++){node = p;//先获取每次循环遍历之前的结点(这样能保证最后一次遍历,node是要删除结点的前一个结点,而p经历了一次p=p->next后变成了要删除的结点)//符合差分方程node=H(n-1),p=H(n)p = p->next;if (p == NULL){printf("链表中不存在第%d个结点!\n", i);return;}}//获取要删除的结点LinkNode* q = node->next;//孤立要删除的结点node->next = node->next->next;//释放删除结点的内存空间free(q);
}
int main()
{LinkList* L = (LinkList*)malloc(sizeof(LinkList));if (L == NULL){printf("内存不足!\n");return 0;}InitLinkList(L);InsertTail(L, 1);InsertTail(L, 2);InsertTail(L, 3);InsertTail(L, 4);InsertTail(L, 5);InsertTail(L, 6);printLinkList(L);DeleteByNumber(L,L->list, 6);printLinkList(L);DeleteByNumber(L,L->list, 1);printLinkList(L);DeleteByNumber(L, L->list, 2);printLinkList(L);DeleteByNumber(L, L->list, 4);printLinkList(L);
}

测试结果

【吉大刘大有数据结构绿皮书】例3.16:已知非空线性链表第一个结点的指针为list,写一算法,删除线性链表中的第i个结点。相关推荐

  1. 【吉大刘大有数据结构绿皮书】已知非空线性链表第一个结点由list指出,写一算法,交换p所指结点与其下一个结点在链表中的位置(设p指向的不是链表最后的那个结点)。

    题目 已知非空线性链表第一个结点由list指出,写一算法,交换p所指结点与其下一个结点在链表中的位置(设p指向的不是链表最后的那个结点). 思路及解答 本题要求的是在无头链表中交换p结点和p-> ...

  2. 【吉大刘大有数据结构绿皮书】向LinkedList类中增加一个函数Contrary,功能为将其所有结点按相反次序链接。

    题目 向LinkedList类中增加一个函数Contrary,功能为将其所有结点按相反次序链接. 思路 考研要求用C语言,那我就用C语言(没有面向对象),本题就是个链表倒置算法,先将哨位结点和后面的结 ...

  3. 写一个算法交换单链表中p所指结点与其后继结点-21算法题

    本题为算法题,交换的是结点,而不是结点的值 注意题目是交换结点,不是交换结点的值. 设q为1,p为2,r为3,r->next为4.原来为1234 1指向3,2指向4,3指向2.最终顺序为1324 ...

  4. 【科普贴】吉大计算机考研之人工智能学院考研全面介绍

    吉林大学人工智能学院是在2018年新成立的学院,了解的人比较少,20考研报考的同学不多,导致一个985高校的计算机专业没有招满,在这里我提供一下人工智能学院考研的完整情况介绍,给学弟学妹一个选择的方向 ...

  5. 双非跨考985吉大软件专硕初试第一名428分,专业课147分经验贴

    2021年又是计算机考研爆炸的一年,科软复试线388,初试分数400+的几百人,再加上各种营销号的宣传,肯定不少跨考的同学(甚至包括一部分科班)都非常慌,但其实地处东北地区的吉林大学并没有爆炸,甚至接 ...

  6. 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...

    吉大19秋学期<C语言程序设计>在线作业一题目 试卷总分:100  得分:100 一.单选题 (共 10 道试题,共 40 分) 函数 rewind 的作用是 A.将文件位置指针指向文件中 ...

  7. 22考研专业课136总分370双非调剂吉大软院非全经验分享

    引用阿甘正传里的一句话--Life was like a box of chocolates, you never know what you're going to get. 生活就像一盒巧克力,结 ...

  8. 吉大20春学期C语言程序设计作业二,吉大18春学期《C语言程序设计》在线作业二【答案】...

    吉大17秋学期<C语言程序设计>在线作业二-0004 试卷总分:100    得分:0 一. 单选题 (共 10 道试题,共 40 分) 1.sizeof(float)是 A.一个双精度型 ...

  9. c语言程序设计第二次网上作业,吉大21春《C语言程序设计》在线作业二题目【标准答案】...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 加用户名或VX513274704 吉大17秋学期<C语言程序设计>在线作业二-0001 试卷总分:100 得分:100 一.单选题 (共 10 ...

  10. 吉大15秋学期计算机,吉大15秋学期《计算机应用基础》在线作业二.docx

    文档介绍: 吉大15秋学期<计算机应用基础>在线作业二1.单选题(共 10 道试题,共 40 分.)    得分:40V1.  E-mail地址中@的含义为.A.与B.或C.在D.和    ...

最新文章

  1. 近期上海面试总结(一)
  2. 《漫画算法2》源码整理-8 链表中倒数第K个节点元素
  3. CodeForces - 1334D Minimum Euler Cycle(构造+模拟)
  4. EXT.NET 更改lable和Text的颜色
  5. 经典Android开发教程!这些新技术你们都知道吗?年薪超过80万!
  6. select * 和select 所有字段的区别
  7. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
  8. android 侧滑效果,android 侧滑效果
  9. django框架 day06
  10. 算法高级(10)-如何实现浏览器的前进、后退功能
  11. 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【2】
  12. VMware ESXi 客户端连接控制台时,提示“VMRC 控制台连接已断开...正在尝试重新连接”的解决方法
  13. 软件测试之Web测试流程和方法
  14. php opendir(),php之opendir()函数的用法
  15. 如何让测试RFC2544更便捷——RFC2544测试实操
  16. 编程之美 - 抓石头游戏(2)
  17. 前端实现模糊查询不区分大小写
  18. Ubuntu下配置运行yolov3项目的环境(数据集、上github、anaconda、vscode、nvidia驱动、cuda、cuda编译、cudnn)
  19. cuda,显卡,pytorch三者配置相关知识--学习笔记
  20. 中级经济师人力资源专业

热门文章

  1. 解决vue项目更新版本后浏览器的缓存问题
  2. win服务器下利用vlmcsd搭建KMS服务器激活win10
  3. java mina 服务端_mina 框架java服务端的搭建和通信。
  4. 数学原理(The Principles of Mathmatics)
  5. python制作二维码并打印_通过python扫描二维码/条形码并打印数据
  6. 7本最经典的逻辑思维书籍推荐
  7. NetApp 数据存储解决方案
  8. 【逗老师的小技巧】群晖使用DELL H330(LSI 3008)RAID卡刷IT直通模式
  9. java面向接口编程思想
  10. 当你的MS OFFICE打不开时,安全模式也失效,来看我给你变戏法吧