热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决问题,链表finish

从一个不懂链表,到反反复复改了不下50遍,提交该题页数更是突破了五页,从周三下午到周五中午的面向对象课前的20分钟,终于把这道题AC了,其实这题本来是原来C语言综合实验的一道题,但是本次在PAT上的审

从一个不懂链表,到反反复复改了不下50遍,提交该题页数更是突破了五页,从周三下午到周五中午的面向对象课前的20分钟,终于把这道题AC了,其实这题本来是原来C语言综合实验的一道题,但是本次在PAT上的审核却没有那么简单。

说下心路历程

  • 其实这个链表在开始的十个小时的学习中对我来说就跟之前的CLASS一样,完完全全的新东西,不知道从何temp->next,也不知道题意,让我反转什么。圈圈画画,终于写了出来,后来发现前面写的指针代码都比较复杂。可以简化。在之后的小时里都是在跟PTA的测试点作斗争,正如前面的随笔所言,只有两个AC,我就在想为什么有两个AC而其他的问题都是答案错误,于是我遍历了所有的代码,感觉虽然愚钝,但是符合逻辑,可执行才对,于是开始了各种数据的测试,从小数据,特殊数据,到大数据,乱七八糟的,打乱顺序的都试过,然而命运就像是和我开玩笑,测试的数据全对,但是过不了PAT的测试点。当时的我真的想把PAT的测试点挖出来问问,到底是什么原因。因此我上了C语言综合实验的测试网站,提交了自己的代码,结果竟然是AC了。这我就更疑惑了,为什们我能够通过那个测试,却过不了PAT,在沉默了跟打代码一样长的时间后,我终于发现了问题症结。PAT测试点会呈现段错误,而段错误在我这里会因为某种原因继续下去,因为我的段错误是一种非数组越界,或者是栈 队列溢出那种的问题,我的问题在于循环中加入了太多的循环和判断,我想这个问题原因可能是对于小数据,PAT会规定具体的循环次数,以及if的次数如果超过,就会段错误,但是会继续执行,答案输出了,即使对了,也会按照答案错误处理并张贴。这个就会让人误以为是代码的问题,而实际并不是。PAT果然严格。不过希望他能告诉我是段错误。

下面贴出代码和截图。



代码部分

#include    
#include
#include
#include
#include
using namespace std;

int main()
{
struct Date
{
int Adress;
int num;
int Next;
struct Date *next;
};
int all, ts, i = 0;
Date*head = (Date*)malloc(sizeof(Date));
Date*p1 = (Date*)malloc(sizeof(Date));
Date*p2 = (Date*)malloc(sizeof(Date));
scanf("%d %d %d", &head->Adress, &all,&ts);

while (i != all)
{
Date*p1 = (Date*)malloc(sizeof(Date));
scanf("%d %d %d", &p1->Adress, &p1->num, &p1->Next);


if (i == 0)
head->next = p1;

else
p2->next = p1;

p2 = p1;
i++;
}
p2->next = NULL;
Date*temp1 = (Date*)malloc(sizeof(Date));
Date*temp2 = (Date*)malloc(sizeof(Date));
Date*r = (Date*)malloc(sizeof(Date));
Date*p = (Date*)malloc(sizeof(Date));
temp1 = head;
temp2 = temp1->next;
while (1)
{
if (head->Adress == temp2->Adress)
{
p = temp1;
for (;;)
{
if (p->next == temp2)
{
p->next = temp2->next;
break;
}
else
{
p = p->next;
}
}
r = head->next;
head->next = temp2;
temp2->next = r;
break;
}
temp2 = temp2->next;
}
temp1 = temp1->next;
temp2 = temp1->next;

while (temp1 != NULL)
{
while (temp2 != NULL)
{
if (temp2->Adress == temp1->Next&&temp2->Next != -1)
{
p = temp1;
for (;;)
{
if (p->next == temp2)
{
p->next = temp2->next;
break;
}
else
{
p = p->next;
}
}
r = temp1->next;
temp1->next = temp2;
temp2->next = r;
break;

}
else if (temp2->Adress == temp1->Next&&temp2->Next == -1)
{
p = temp1;
for (;;)
{
if (p->next == temp2)
{
p->next = temp2->next;
break;
}
else
{
p = p->next;
}
}

temp1->next = temp2;
temp2->next = NULL;
break;
}

else
{
temp2 = temp2->next;
continue;
}
}
if (temp1->next != NULL)
{
temp1 = temp1->next;
temp2 = temp1->next;
}
else
break;
}

int js = 0;
Date*check = (Date*)malloc(sizeof(Date));
check = head->next;
for (;;)
{
if (check->Next != -1)
{
check = check->next;
js++;
}
else if (check->Next == -1)
{
js++;
break;
}
}



all =js;
if (ts == 0)
ts = 1;

int j=all/ts;
if (ts > all || all == 1||j==0)
j = 0;
else
{
temp1 = head;
temp2 = temp1->next;
i = 0;
for (int l = 1; j > 0; l++, j--)
{
while (i != l*(ts - 1))
{
temp2 = temp2->next;
i++;
}
p1 = temp2;
r = temp2->next;
p = temp1;
while (p->next != temp2)
{
for (;;)
{
if (p->next == temp2)
{
temp2->next = p;
temp2 = temp2->next;
p = temp1;
break;
}
else
{
p = p->next;
}
}
}
temp2->next = r;
temp1->next = p1;
while (temp1 != temp2)
{
temp1 = temp1->next;
}
if (temp1 == NULL)
break;
else
{
temp2 = temp1->next;
}
}
}

temp1 = head->next;
temp2 = temp1->next;
head->Adress = head->next->Adress;
for (i = 0; i {
temp1->Next = temp2->Adress;
temp1 = temp1->next;
temp2 = temp1->next;

}
if(temp1->next==NULL)
temp1->Next = -1;

Date*out = (Date*)malloc(sizeof(Date));
out = head->next;
while (out != NULL)
{
if (out->Next != -1)
{
cout <Adress <<" " <num <<" " <Next < out = out->next;
}
else
{
cout <Adress <<" " <num <<" " <Next < out = out->next;
}
}


return 0;
}

推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
author-avatar
哪来的咸鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有