题目:循环链表中结点的基本操作

考虑到没有说明是单循环链表还是双循环链表,秉持准备充分的原则,我们采用双向循环链表来完成这个问题。

一、初步框架

1.头文件:

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

2.结点的结构体:

//结点的结构体
typedef struct LNode{int key; //这里存放结点的值struct LNode *next; //这里是两个指针,指向前一结点和后一结点struct LNode *prev;
}*Node;

3.创建结点函数(此后在创建结点时,我们只需要传入节点要存放的key即可):

Node createNode(int key){Node node = (Node)malloc(sizeof(struct LNode));node -> key = key;node -> next = node -> prev = NULL;return node;
}

4.双向循环链表示意图:

 5.建立一个双向循环链表,首先要获得一个头结点。这里是一个获取头结点的函数:

//创建头结点函数
Node createHead(){Node node = createNode(0); //头结点不存数据,为了方便,我们给它赋值为0node -> next = node -> prev = node; //因为目前只有头结点,所以前后指针指向自己return node; //返回头结点
}

至此,我们的基本框架已经建立完毕!

二、基本操作

1.插入操作:

//插入函数(这里采用头插法)
void insertNode(Node head, int key){Node node = createNode(key);if(head -> prev == head){ //如果head->prev指向自己,说明原链表中只有一个头结点head -> next = node;  //此时新插入一个元素,就要让头结点的prev指向它node -> prev = head; //它的next指向头结点head -> prev = node;node -> next = head;}else{node -> next = head -> next; //如果不指向自己,那么就是正常插入node -> next -> prev = node;head -> next = node;node -> prev = head;}printf("%d插入好了捏\n", key);
}

2.删除操作:

void deleteNode(Node head, int key){Node temp = head;while(temp -> next != head){temp = temp -> next;if(temp -> next -> key == key){temp -> next = temp -> next -> next;temp -> next -> prev = temp;printf("%d删掉了捏\n", key);return ;}}printf("没有找到%d捏,删不了\n", key);return ;
}

3.打印操作:

void printLNode(Node head){Node temp = head;int flag = 0;while(temp -> next != head){temp = temp -> next;if(flag == 0){printf("此时链表为:%d ", temp -> key);}else{printf("-> %d ", temp -> key);}flag++;}printf("\n");
}

4.判断链表是否为空:

int isEmpty(Node head){if(head -> prev == head -> next) printf("链表是空的捏,想被插入~\n");else printf("不是空的哦,但是要进来的话,也不是不可以~\n");return head -> prev == head -> next;
}

三、测试效果

int main(){Node head = createHead();isEmpty(head);insertNode(head, 4);insertNode(head, 6);insertNode(head, 7);insertNode(head, 9);printLNode(head);isEmpty(head);deleteNode(head, 3);deleteNode(head, 4);printLNode(head);return 0;
}

运行结果:

四、完整代码

#include <stdio.h>
#include <stdlib.h>//结点的结构体
typedef struct LNode{int key; //这里存放结点的值struct LNode *next; //这里是两个指针,指向前一结点和后一结点struct LNode *prev;
}*Node;Node createNode(int key){Node node = (Node)malloc(sizeof(struct LNode));node -> key = key;node -> next = node -> prev = NULL;return node;
}//创建头结点函数
Node createHead(){Node node = createNode(0); //头结点不存数据,为了方便,我们给它赋值为0node -> next = node -> prev = node; //因为目前只有头结点,所以前后指针指向自己return node; //返回头结点
}//插入函数(这里采用头插法)
void insertNode(Node head, int key){Node node = createNode(key);if(head -> prev == head){ //如果head->prev指向自己,说明原链表中只有一个头结点head -> next = node;  //此时新插入一个元素,就要让头结点的prev指向它node -> prev = head; //它的next指向头结点head -> prev = node;node -> next = head;}else{node -> next = head -> next; //如果不指向自己,那么就是正常插入node -> next -> prev = node;head -> next = node;node -> prev = head;}printf("%d插入好了捏\n", key);
}void deleteNode(Node head, int key){Node temp = head;while(temp -> next != head){temp = temp -> next;if(temp -> next -> key == key){temp -> next = temp -> next -> next;temp -> next -> prev = temp;printf("%d删掉了捏\n", key);return ;}}printf("没有找到%d捏,删不了\n", key);return ;
}void printLNode(Node head){Node temp = head;int flag = 0;while(temp -> next != head){temp = temp -> next;if(flag == 0){printf("此时链表为:%d ", temp -> key);}else{printf("-> %d ", temp -> key);}flag++;}printf("\n");
}int isEmpty(Node head){if(head -> prev == head -> next) printf("链表是空的捏,想被插入~\n");else printf("不是空的哦,但是要进来的话,也不是不可以~\n");return head -> prev == head -> next;
}int main(){Node head = createHead();isEmpty(head);insertNode(head, 4);insertNode(head, 6);insertNode(head, 7);insertNode(head, 9);printLNode(head);isEmpty(head);deleteNode(head, 3);deleteNode(head, 4);printLNode(head);return 0;
}

南京工业大学2023数据结构复习题简析【编程题2】相关推荐

  1. 南京工业大学2023数据结构复习题简析【编程题3】

    题目:图的邻接矩阵表示法 注意:本文中所面向的图是有向图 一.初步框架 1.头文件: #include <stdio.h> #include <stdlib.h> 2.定义邻接 ...

  2. 南京工业大学2023数据结构复习题简析【编程题5】

    题目:拓扑排序算法的基本思想 一.基本概念 拓扑排序是一个非常容易理解的概念.我们要回忆一下入度这个概念. 我们想象这样一个图,里面只有两个结点A和B,且只有一条从A指向B的边.那么此时,我们称A的入 ...

  3. 南京工业大学2023数据结构复习题简析【编程题4】

    题目:Floyd算法求取图中每一对顶点之间的最短距离 一.快速回忆 Q1:Floyd算法的作用是什么? 答:那必然是求取图中每一对顶点之间的最短距离(见题目). Q2:Floyd算法需要基于什么来实现 ...

  4. “四非”高校南京工业大学,17天内三连击Nature、Science!实为深藏不露

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | 维克多 <Nature>和<Science>杂志创刊已有百余年,作为 ...

  5. 南工计算机调剂,南京工业大学2021年硕士研究生调剂公告

    一.申请条件 1.申请调剂考生需符合<教育部关于印发<2021年全国硕士研究生招生工作管理规定>的通知>(教学函( 2020 )8号)要求. 2.非全日制硕士研究生需以定向就业 ...

  6. 【调剂】南京信息工程大学2023年中外合作计算机,电子信息都招!

    公众号[计算机与软件考研]每天都会发布最新的计算机考研调剂信息! 点击公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 南京信 ...

  7. 南工大计算机录取分数线,南京工业大学2016年录取分数线

    南京工业大学2016年录取分数线 省份  批次  科类  最高分  最低分  辅助排序分 河北  艺术提前批  艺术  712  550 山西  艺术提前批  艺术  687  589  361 内蒙 ...

  8. 河南工业大学c语言考试题库,c语言题库(编程)河南工业大学 河工大 c语言期末考试题库...

    c语言题库(编程)河南工业大学 河工大 c语言期末考试题库 (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 C语言题库编程河南工业 ...

  9. 南京工业大学python考试期末题库_大学慕课用Python玩转数据期末考试查题公众号答案...

    大学慕课用Python玩转数据期末考试查题公众号答案 更多相关问题 雪松的树形为 (5.0分) - Do you think I can borrow your bike for a few hour ...

最新文章

  1. readelf 读取动态链接表命令
  2. android webView加载网络视频
  3. php连接中文数据库乱码问题,如何解决php的数据库中文乱码问题
  4. 安卓源码 代号,标签和内部版本号
  5. 职场老油条靠它升职后:还用Excel手动做报表?想想就可笑
  6. 系统架构师学习笔记-论文摘要部分的写法
  7. 95后夜猫子报告:三成熬夜到1点 夜间最爱追《乡村爱情》
  8. mc服务器隐藏指令显示,服务器常用指令 搬运自Mc服主网
  9. mysql事务与锁_mysql之事务和锁
  10. server 2012 IIS 启用.NET 4.5
  11. 排版怎么排?八大技巧提升版面设计感
  12. Win10连接上了wifi但是打开浏览器显示网络异常,诊断网络发现错误“远程计算机或者设备将不接受连接
  13. 微生物组-扩增子16S分析和可视化(2022.7)
  14. 大势至USB端口管理软件网络版8.1注册破解
  15. ffmpeg截取视频指定帧方法
  16. unity - 二进制文件操作-存储与读取
  17. 如何下载喜马拉雅里面的音频文件
  18. 健身小程序开发的主要功能
  19. pdf签名无效解决办法_为什么下载下来的电子合同提示有效性未知或至少一个签名有问题?...
  20. HTML5期末大作业:餐饮美食网站设计——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码

热门文章

  1. GenerateAllSetter:一键生成所有setter方法
  2. python imread的用法_Python imread、newaxis用法详解
  3. CSDN20周年直播分享:日拱一卒,成为技术合伙人,力争财务自由
  4. 面试,HR想要什么?
  5. 轮胎与车辆油耗的关系
  6. 海天酱油经销商背后的故事
  7. 王石、解海龙担任深圳市慈善会首届形象大使
  8. 音乐api搭建php音乐下载,百度音乐api接口
  9. 树莓派4无显示器连接笔记本电脑
  10. Maven clean和install的区别