南京工业大学2023数据结构复习题简析【编程题2】
题目:循环链表中结点的基本操作
考虑到没有说明是单循环链表还是双循环链表,秉持准备充分的原则,我们采用双向循环链表来完成这个问题。
一、初步框架
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】相关推荐
- 南京工业大学2023数据结构复习题简析【编程题3】
题目:图的邻接矩阵表示法 注意:本文中所面向的图是有向图 一.初步框架 1.头文件: #include <stdio.h> #include <stdlib.h> 2.定义邻接 ...
- 南京工业大学2023数据结构复习题简析【编程题5】
题目:拓扑排序算法的基本思想 一.基本概念 拓扑排序是一个非常容易理解的概念.我们要回忆一下入度这个概念. 我们想象这样一个图,里面只有两个结点A和B,且只有一条从A指向B的边.那么此时,我们称A的入 ...
- 南京工业大学2023数据结构复习题简析【编程题4】
题目:Floyd算法求取图中每一对顶点之间的最短距离 一.快速回忆 Q1:Floyd算法的作用是什么? 答:那必然是求取图中每一对顶点之间的最短距离(见题目). Q2:Floyd算法需要基于什么来实现 ...
- “四非”高校南京工业大学,17天内三连击Nature、Science!实为深藏不露
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | 维克多 <Nature>和<Science>杂志创刊已有百余年,作为 ...
- 南工计算机调剂,南京工业大学2021年硕士研究生调剂公告
一.申请条件 1.申请调剂考生需符合<教育部关于印发<2021年全国硕士研究生招生工作管理规定>的通知>(教学函( 2020 )8号)要求. 2.非全日制硕士研究生需以定向就业 ...
- 【调剂】南京信息工程大学2023年中外合作计算机,电子信息都招!
公众号[计算机与软件考研]每天都会发布最新的计算机考研调剂信息! 点击公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 南京信 ...
- 南工大计算机录取分数线,南京工业大学2016年录取分数线
南京工业大学2016年录取分数线 省份 批次 科类 最高分 最低分 辅助排序分 河北 艺术提前批 艺术 712 550 山西 艺术提前批 艺术 687 589 361 内蒙 ...
- 河南工业大学c语言考试题库,c语言题库(编程)河南工业大学 河工大 c语言期末考试题库...
c语言题库(编程)河南工业大学 河工大 c语言期末考试题库 (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 C语言题库编程河南工业 ...
- 南京工业大学python考试期末题库_大学慕课用Python玩转数据期末考试查题公众号答案...
大学慕课用Python玩转数据期末考试查题公众号答案 更多相关问题 雪松的树形为 (5.0分) - Do you think I can borrow your bike for a few hour ...
最新文章
- readelf 读取动态链接表命令
- android webView加载网络视频
- php连接中文数据库乱码问题,如何解决php的数据库中文乱码问题
- 安卓源码 代号,标签和内部版本号
- 职场老油条靠它升职后:还用Excel手动做报表?想想就可笑
- 系统架构师学习笔记-论文摘要部分的写法
- 95后夜猫子报告:三成熬夜到1点 夜间最爱追《乡村爱情》
- mc服务器隐藏指令显示,服务器常用指令 搬运自Mc服主网
- mysql事务与锁_mysql之事务和锁
- server 2012 IIS 启用.NET 4.5
- 排版怎么排?八大技巧提升版面设计感
- Win10连接上了wifi但是打开浏览器显示网络异常,诊断网络发现错误“远程计算机或者设备将不接受连接
- 微生物组-扩增子16S分析和可视化(2022.7)
- 大势至USB端口管理软件网络版8.1注册破解
- ffmpeg截取视频指定帧方法
- unity - 二进制文件操作-存储与读取
- 如何下载喜马拉雅里面的音频文件
- 健身小程序开发的主要功能
- pdf签名无效解决办法_为什么下载下来的电子合同提示有效性未知或至少一个签名有问题?...
- HTML5期末大作业:餐饮美食网站设计——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码