大佬救命,我的单链表运行最后一个合并函数时小黑窗自动关闭了这是为什么呢







/*#include <iostream.h>
#include <iomanip.h>*/
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//定义结点类型
struct Node{
int data;
Node *next;
};
Node Head; //头结点
Node *DLList,*a,*b,*c; //头指针
void init(Node *DLList);
void display(Node *DLList);
int insert(Node *DLList);
void search(Node *DLList);
void del(Node *DLList);
void reverse(Node *DLList);//就地逆置函数
void generateandmerge(Node *a,Node *b,Node *c);//生成两个链表并且合并的函数
int main()
{
char choice;
DLList=&Head; //使头指针指向头结点
Head.next=NULL;
while (1)
{
//system("cls");
printf( "\n\n\n\n");
printf( "\t\t 单链表操作 \n");
printf( "\t\t======================================");
printf( "\n\n");
printf( "\t\t 1:初始化 \n");
printf( "\t\t 2:显示 \n");
printf( "\t\t 3:单个插入 \n");
printf( "\t\t 4:查找 \n");
printf( "\t\t 5:删除 \n");
printf( "\t\t 6:就地逆置 \n");
printf( "\t\t 7:生成两个链表并合并 \n");
printf( "\t\t 0:退出 \n");
printf( "\n");
printf( "\t\t请选择:" );
choice = getch();
//system("cls");
switch(choice)
{
case '1':
init(DLList);
break;
case '2':
display(DLList);
break;
case '3':
insert(DLList);
break;
case '4':
search(DLList);
break;
case '5':
del(DLList);
break;
case '6':
reverse(DLList);
break;
case '7':
generateandmerge(a,b,c);
break;
case '0':
exit(0);
}
}
}
//公用的等待函数
void wait()
{
printf( "\n\n请按任意键继续" );
getch();
}
//屏幕提示后,从键盘输入线性表长度和随机数种子,生成以DLList为头指针的指定长度的线性表
void init(Node *DLList)//实现单链表的建立
{
int length;
Node *p,*q;
while (1)
{
printf("输入元素个数(0- 10000 ):" );
scanf("%d",&length);
if (length >= 0 && length <= 10000)
break;
printf("\n");
}
int i;
while (1)
{
printf( "输入随机数种子(0-32767):" );
scanf("%d",&i);
if (i >= 0 && i <= 32767)
break;
printf("\n");
}
//从线性表中删除并释放原有的结点,使其成为空表
p=DLList;
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
free(q);
}
srand(i); //指定随机数种子,相同的种子将产生相同的数据序列
rand();
//向线性表插入length个新结点
for (int j=1;j<=length;j++)
{
p=new Node;
p->next=DLList->next;
DLList->next=p;
p->data=rand() % 10000;
}
}
//在屏幕上依次显示以DLList为头指针的线性表中的全部元素和元素个数
//格式应便于观察
//如果需要指定输出的宽度,可以使用 cout << setw(W) << X ,其中 X 是输出的数值,W 是占据的列数
void display(Node *DLList)
{
//Node *DLList;
// DLList=head;前面已经定义过了,这里再次定义会发生重定义的错误。
if (DLList==NULL)
{
printf("链表为空!");
}
while(DLList)
{
printf("%d ",DLList->data);
DLList=DLList->next;
}
printf("\n");
printf("链表输出完毕\n");
}
//屏幕提示后,从键盘输入一个元素值,然后把这个新元素插到以DLList为头指针的线性表的末尾!!
int insert(Node *DLList)
{ int num;
Node *temp;
printf("请输入一个需要插入的元素值:");
scanf("%d", &num);
if (NULL == DLList)
{
return 1;
}
// 创建新结点并判断创建是否成功
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node)
{
return 0;
}
// 给结点成员变量赋值
node->data = num;
node->next = NULL;
// 让新结点变为链表的最后一个节点
Node* tmp = DLList;
while(tmp->next)
{
tmp = tmp->next;
}
//找到链表的尾节点并令尾节点指向node
tmp->next = node;
while(DLList)
{
printf(" %d",DLList->data);
DLList=DLList->next;
}
printf("\n");
printf("链表输出完毕\n");
return 1;
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中搜索这个元素
void search(Node *DLList)
{
int e;
printf("请输入一个需要查找的元素值:");
scanf("%d", &e);
int i=1;
while (DLList!=NULL&&DLList->data!=e)
{
DLList=DLList->next;
i++;
}
printf("您所查找的元素在第%d位\n",i);
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中删除这个元素,这个元素有可能是出现一次和无数次
//屏幕显示删除成功与否的信息
void del(Node *DLList)
{
int e;
printf("请输入一个需要删除的元素值:");
scanf("%d", &e);
/*Node *a = NULL;
Node *b = NULL;
if (DLList==NULL)
printf("null\n");//这是大佬提示我要加的,这大佬真的很严谨
a = DLList;
b = DLList->next;/**pPreNode = *DLList;之前这样表达是错的,被大佬指出来了
*pCurNode = *DLList->next;*/
/*while (b)
{
if (b->data == e)
{
a->next = b->next;
free(b);
//b->next = a->next;大佬说这里是错的,因为已经把b释放掉了,所以这里所谓的b->next,其实是之前的c->next,故这一步自相矛盾;
}
a = a->next;//大佬提醒我把这一步加上去
b = b->next;
}
if (a->data == e)
{
a = a->next; //之前我是没有这一句的,大佬提示我,这里,不能free链表头,因为你没把链表头传出去,外部的全部变量的链表头不变的
if (a) { //所以把下一个节点拷贝到当前,然后删除下一个节点
a->data = b->data; //这里
a->next = b->next;
free(a);
} else { //如果没有下一节点,则把自己data置空
a->data = 0;
}
/**b = *DLList;看看你之前写的这一段是个啥,上面是大佬叫我改的
*DLList = *DLList->next;
free(b);*/
//}
while(DLList != NULL && DLList->data == e) {//判断头结点是否是要删除的元素,以防止头节点出现几个需要删除的元素
DLList = DLList->next;
}
if(DLList == NULL) {//判断头节点是否为空
printf("null\n");
}
Node *prev = DLList;//声明一个prev节点,prev.next节点为当前判断的节点,
while(prev->next != NULL) {
if(prev->next->data == e) {//如果当前节点的值等于指定元素,那么直接用prev.next.next替换prev.next;
// 如果不相等,则执行prev = prev.next,判断的下一个节点;
prev->next = prev->next->next;
}else {
prev = prev->next;
}
}
printf("删除之后单链表如下:");
while(DLList)
{
printf(" %d",DLList->data);
DLList=DLList->next;
}
printf("\n");
}
void reverse(Node *DLList){//链表的就地逆置
Node *current, *p;
if (DLList == NULL)
{
printf("null\n");
}
current = DLList->next;
while (current->next != NULL)
{
p = current->next;
current->next = p->next;
p->next = DLList->next;
DLList->next = p;
}
while(DLList)
{
printf(" %d",DLList->data);
DLList=DLList->next;
}
printf("\n");
}
void generateandmerge(Node *a,Node *b,Node *c){//链表的生成与合并
printf("请自定义链表a的随机数据与个数!\n");
init(a);
display(a);
printf("请自定义链表b的随机数据与个数!\n");
init(b);
display(b);
Node *p = a->next;
Node *q = b->next;
Node *r;
c = a;
// r指向新建单链表L3的尾结点
r = c;
// 释放L2的头结点
free(b);
while(p != NULL && q != NULL)
{
r->next = p; r = p; p = p->next;
r->next = q; r = q; q = q->next;
}
r->next = NULL;
if(q != NULL)
p = q;
r->next = p;
//先把两个表合并,然后删掉重复的元素
Node *x,*y,*z;
x=c->next;
while(x) // p用于遍历链表
{
y=x;
while(y->next) // q遍历p后面的结点,并与p数值比较
{
if(y->next->data==x->data)
{
z=y->next; // r保存需要删掉的结点
y->next=z->next; // 需要删掉的结点的前后结点相接
free(z);
}
else
y=y->next;
}
x=x->next;
}
while(c)
{
printf(" %d",c->data);
c=c->next;
}
printf("\n");
}
//应用题
/*
6、将链接存储线性表逆置,即最后一个结点变成第1个结点,原来倒数第2个结点变成第2个结点,如此等等。
7、生成有序的两个单链表A和B(链表的数据和个数自定),其首结点指针分别为a和b,要求将两
个单链表合并为一个有序的单链表C,其首结点指针为c,并且合并后的单链表的数据不重复。
8、将一个首结点指针为a的单链表A分解成两个单链表A和B,其首结点指针分别为a和b,使得链表A中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
*/相关推荐
YOLO26算法工业车间与城市道路安全标识及交通标志目标检测+训练好的模型+260张数据集+pyqt可视化界面.zip
附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[安全标识(safety), 交通标志(traffic)] · 训练集:240 张 · 验证集:10 张 · 测试集:10 张 · 总计:260 张 该数据集精准聚焦于工业生产环境与城市道路交通场景,旨在为高危作业区域的安全警示系统及道路通行管理提供可靠视觉识别支持。通过采集真实工作现场与道路环境中的关键标识,该数据集有效支撑了对人员行为规范提示与交通状态预警的自动化感知需求,具备显著的工程实用价值与行业落地潜力。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 67 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.7278** mAP50-95 | 0.6630 Precision | 0.7294 Recall | 0.7273 train/box_loss | 0.7483 train/cls_loss | 0.6857 val/box_loss | 0.6823 val/cls_loss | 1.8035 【训练过程分析】 67 轮训练后 mAP50 为 0.7278,模型基本收敛但还有提升余地。Loss 曲线下降正常,后期趋于平缓。mAP50-95 为 0.6630,定位精度尚可。 【模型性能评估】 Precision 0.7294、Recall 0.7273,精度高于召回,存在一定漏检。多类检测中,不同类别性能可能有差异,需关注... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。
技术转移机构如何基于数据提升项目撮合精准度?.docx
技术转移机构如何基于数据提升项目撮合精准度?
IEEE基于高频信号注入法的PMSM零低速无位置控制永磁同步电机仿真,有参考文献
内容概要:本文围绕基于高频信号注入法的永磁同步电机(PMSM)在零低速工况下的无位置传感器控制技术开展系统性仿真研究,重点聚焦旋转高频信号注入法的应用。通过Matlab/Simulink平台构建完整的控制系统仿真模型,深入分析了高频电压信号注入后电机凸极效应引起的响应电流特征,进而设计并实现了基于信号调制与解调、滤波处理及位置估计算法的位置观测器。研究有效解决了传统机械式位置传感器在极低速或零速运行时难以精确检测转子位置的问题,提升了系统可靠性与鲁棒性。全文涵盖信号注入策略、高频响应信号处理流程、转子位置估算原理、误差补偿机制以及仿真验证等关键技术环节,并配有详实的参考文献,具备较强的理论深度与工程实践价值。; 适合人群:从事电机驱动控制、电力电子与电力传动、自动化及相关领域的科研人员、高校研究生,以及具备一定Matlab/Simulink仿真能力和电机控制理论基础的工程技术人员。; 使用场景及目标:①用于永磁同步电机无传感器控制算法的教学演示与科研仿真;②为低速高精度伺服系统、新能源汽车电驱动系统等应用场景提供位置估计算法的设计与优化思路;③支撑高水平学术论文的复现、改进与创新性控制策略的开发验证。; 阅读建议:建议结合文中所述Simulink仿真模型与配套Matlab代码进行动手实践,重点掌握高频信号注入方式的选择、高频响应信号的提取与解调过程、位置误差提取及PI跟踪观测器的设计细节,同时应查阅所列参考文献以深化对高频注入法物理机理与数学建模的理解。
软件项目方案模板-下载即用.zip
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 ### 软件工程构建方案关键要素阐释 #### 一、引言 **文档主旨说明:** “软件工程构建方案.范本”这一文档名称清晰表明了其核心内容——为软件工程项目的构建过程提供一个标准化的方案范本。该范本致力于引导项目的规划、设计、执行等各个流程,保障项目的顺利推进。 **关键词解读:** “工程构建方案”关键词突出了文档的焦点是围绕工程项目的构建过程展开,不仅涉及软件开发环节,还涵盖了项目的整体规划与执行策略。 #### 二、项目基础信息 1. **项目代号**:必须明确标示出项目的具体代号,以便于识别和区分不同的项目。 2. **项目类别**:区分项目是全新构建还是现有系统的升级,这对后续的规划与资源调配具有决定性影响。 3. **项目承建机构**:详细说明负责项目承建的机构信息,包括机构名称、主要责任人、机构概况及职能划分等。 4. **方案制定基础**:阐述方案制定的依据,通常涵盖相关政策文件、行业标准、行业发展趋势等。 5. **项目构建目标、规模和时限**: - **构建目标**:清晰界定项目完成后的预期成果。 - **构建规模**:依据项目的实际需求确定其规模。 - **构建时限**:明确项目从启动到完成的预期时间。 6. **项目构建内容清单**:列出项目的主要构成部分及其具体内容。 7. **总成本及资金来源**:说明项目总预算及其资金来源。 #### 三、现状、必要性与需求调研 1. **当前状况及待解决问题**:调研当前项目承担单位信息化建设的现状,涵盖现有计算机及网络设备的应用情况、各主要业务的信息化程度等,并指出存在的主要问题及解决策略。 2. **项目...
论文复现带有攻击角约束的大机动目标协同攻击制导律(Simulink仿真、Matlab代码实现)
内容概要:本文档围绕“带有攻击角约束的大机动目标协同攻击制导律”这一课题,提供基于Simulink仿真环境与Matlab编程语言实现的科研论文复现资源。核心内容聚焦于针对高速、大机动目标实施多武器协同攻击的先进制导策略研究,重点实现了超扭滑模控制(STSMC)、快速终端滑模控制(FTSMC)等非线性控制算法,并探讨了其在满足特定攻击角度约束条件下的协同作战能力。资源不仅包含完整的仿真模型与代码,还延伸至高阶滑模、磁链无感观测电机控制等多个相关技术领域,为研究者提供了一套系统性的控制系统设计与仿真验证工具。; 适合人群:具备一定编程基础,熟悉Matlab/Simulink软件操作,对现代控制理论,尤其是滑模控制、非线性控制及多智能体协同控制有浓厚兴趣的研究生或研发人员。; 使用场景及目标:① 帮助研究人员深入理解并复现带有攻击角约束的三维多弹协同攻击制导律,通过提供的Simulink仿真模型和Matlab代码进行算法验证与性能测试;② 为探索超扭滑模(STSMC)、快速终端滑模(FTSMC)等先进控制策略在高速机动目标拦截、精确打击等实际工程问题中的应用潜力,提供可靠的仿真平台和技术参考。; 阅读建议:读者应首先熟练掌握Matlab/Simulink的基本操作,然后循序渐进地学习文档中由简至繁的控制算法和仿真模型。建议从单一制导律入手,再逐步过渡到复杂的多弹协同场景,鼓励结合自身研究方向,对现有模型进行修改和优化,以开展更具创新性的研究工作。


