今天debug了一个nice代码,先码在这里,SWUST OJ960

双向链表的操作问题

1000(ms)

10000(kb)

2994 / 8244

建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。)

输入

第一行:双向表的长度;

第二行:链表中的数据元素。

输出

输出双向链表中的数据元素的值。

样例输入

10

2 4 6 3 5 8 10 21 12 9

样例输出

2 3 4 5 6 8 9 10 12 21

对于本题,

构建链表时在连接时需双向连接,且头指针的前指针为NULL,尾指针的后指针为NULL

解题思想:

  1. 尾插法构建链表
  2. 构建新链表为目标链表,将原链表上节点取出放在新链表合适位置
  3. 新链表末尾置为NULL并输出

    **

所以这个题坑在哪里了?

  1. 注释真的很重要!!!!!
  2. 循环过程中忘记目标节点的移动
  3. 为方便以后查看与思考,规定在对链表操作时,应声明一个新指等于为目标节点,之后通过该指针对目标节点操作,同时在赋值给辅助指针后,目标节点后移,防止链丢失。
  4. 每次对末尾操作要注意尾部指向NULL

代码如下,编译环境VS

#include<stdio.h>
#include<stdlib.h>
struct link
{
int data;
struct link *next;
struct link *last;
};
//先锁定目标位置,一次位移
struct link *ApendNode(struct link *head,int n);//构造链表
struct link *rankLink(struct link *head);//链表排序
void showLink(struct link *head);//输出链表 int main()
{
struct link *head,*answer;
int n;
scanf_s("%d", &n);
head = (struct link *)malloc(sizeof(link));
head->last = NULL;
head = ApendNode(head,n);
answer = rankLink(head);
showLink(answer);
system("pause");
return 0;
}
struct link *rankLink(struct link *old)//旧节点名字为old
{
//新建一个链,读取原目标,插入新链
//方法概述:新建链表,并插入前两个,这里需要比较,
// 然后将剩余链表中节点循环比对,插入合适位置直到取出最后一个节点,即末指针为空
struct link *head,*p,*pr,*p2,*tail;
p2 = NULL; head = (link *)malloc(sizeof(link));//申请新头节点
head->last = NULL;//头节点前指针为空 link *help1,*help2;//辅助节点1,2帮助导入前2节点
help1 = old->next;
help2 = help1->next; p = help2->next;//p为待处理节点 head->next = help1;//连接1个
help1->last = head; //连接第二个节点,根据大小放置,pr指向第一个节点,tail为尾节点
if (help1->data > help2->data)
{
head->next = help2;
help2->last = head;
help2->next = help1;
help1->last = help2;
help1->next = NULL;
tail = help1;
pr = help2;
}
else
{
//此时helpl链在结果链,断开链
help2->next = NULL;
tail = help2;
pr = help1;
}
tail->next = NULL;
//已连接2个 free(old);//原链表头节点被搁置,处理 //这之后开始对其余节点处理,pr为首节点(含数据),tail为尾节点(含数据)
//p2为辅助节点
while (p != NULL)
{
//为最小值
if (p->data <= head->next->data)
{
link *help;//help存该插入节点,p改为下一节点
help = p;
p = p->next;
help->next = head->next;
head->next = help;
help->last = head;
help->next->last = help;
}
else
{
if (p->data > tail->data)//为最大值
{
p2 = p->next;
tail->next = p;
p->last = tail;
p->next = NULL;
tail = p;
p = p2;
tail->next = NULL;
}
else
{
//pr为首节点,重置pr;
//满足插入条件两值中间
while (pr!= tail)
{
if ((p->data) >= (pr->data))
{
if (p->data <= pr->next->data)
{
link *start, *end;//start为前节点,end为后节点
p2 = p->next;
start = pr;
end = pr->next;
start->next = p;
p->last = start;
p->next = end;
end->last = p;//插入操作;
p = p2;
break;
}
}
pr = pr->next;//pr读取下一数值
}
pr = head->next;//重置pr为首节点 }
}
}
tail->next = NULL;
return head;
}
struct link *ApendNode(struct link *head, int n)
{
link *p, *pr;
pr = head;
for (int i = 0; i < n; i++)
{
p = (link *)malloc(sizeof(link));
pr->next = p;
p->last = pr;
pr = p;
scanf_s("%d",& (p->data));
}
pr->next = NULL;
return head;
}
void showLink(link * head)
{
link *p;
p = head->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}

SWUSTOJ 960A题总结,又完成一个讨厌的题,内含链表操作启发的更多相关文章

  1. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  2. 算法题:给你一个自然数N,求[6, N]之内的全部素数中, 两两之和为偶数的那些偶数。

    /* 算法题:给你一个自然数N,求[6, N]之内的全部素数中. 两两之和为偶数的那些偶数. */ #include <iostream> using namespace std; voi ...

  3. 一些简单二分题,简单的hash,H(i),字符串题

    说在前面: 题是乱七八糟的. 几个二分的题. (但是我的做法不一定是二分,有些裸暴力. 1. Equations HDU - 1496 输入a,b,c,d问你这个方程有多少解.a*x1^2+b*x2^ ...

  4. PAT甲题题解-1074. Reversing Linked List (25)-求反向链表

    题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...

  5. 思维题练习专场-DP篇(附题表)

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8536399.html 听说今年省选很可怕?刷题刷题刷题 省选已经结束了但是我们要继续刷题刷题刷题 目标是“有思维 ...

  6. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  7. java 写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中

    package com.beiwo.homework; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...

  8. AudioPlayer.js,一个响应式且支持触摸操作的jquery音频插件

    AudioPlayer.js是一个响应式.支持触摸操作的HTML5 的音乐播放器.本文是对其官网的说用说明文档得翻译,博主第一次翻译外文.不到之处还请谅解.之处. JS文件地址:http://osva ...

  9. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

随机推荐

  1. 最新IntelliJ IDEA 2019.3版本永久激活,一步到位!

    简单介绍一下什么是IDEA? IDEA全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码自动提示.重构. ...

  2. 转pdf

    一.转印厂pdf(书本类及折页类) 1.储存为(Ctrl+Shift+S) 2.保存类型选择   pdf 3.常规==>Adobe PDF预设==>选择印刷质量 4.选择标记和出血==&g ...

  3. openwrt MT7620A MT7610E 5G 驱动添加移值

    使用 github 上别人提供好的源码.整合到最新的 openwrt 18 中,目前 kernel 的版本为 4.1 . 编辑中....

  4. Uiautomator1.0与Uiautomator2.0测试项目搭建与运行原理

    Uiautomator是Android原生测试框架,可以用于白盒接口测试也可以用于UI自动化测试,Uiautomator分1.0版本与2.0版本,它们都是基于UiAutomation的测试框架,都是通 ...

  5. 使用express+shell在服务器上搭建一套简单的前端部署系统

    前言 个人项目越来越多,部署需要频繁操作服务器,所以手动搭建一套简单的部署系统. 效果如图 其中包含 原生html+css+js项目,单页面react, vue, angular项目,实现了一键打包发 ...

  6. mui switch 点击事件不冒泡

    工作上遇到一个问题 手机移动端app,采用mui框架,要求左边是手机号码,右边是switch开关,并且点击标题的时候,可以展开下面人员的基本信息. 采用了折叠面板. 先上图如下: 开始时出现的问题是: ...

  7. java-3个例子(新手)

    //创建的一个包名. package ri0318; //创建的一个类. public class Li3 { //公共静态的主方法. public static void main(String[] ...

  8. Natas5 Writeup(Cookie伪造)

    Natas5: 提示不允许进入,没有登录,burp抓包,查看cookie信息后发现存在loggedin项,且值为0,猜测该值代表是否登录,将其修改为1,得到flag. flag:aGoY4q2Dc6M ...

  9. 循序渐进地聊一聊 box-shaow

    影子在现实生活中可以是一个物体的副本,在 CSS 中也是这样的,相当于复制了那个元素(并不是真正的元素,对页面布局没有任何影响),可以从下面的代码中看出来. .container { width: 1 ...

  10. eclipse 配置tomcat运行环境

    eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上 1.打开Eclipse,单击“Window”菜单,选择下方的“Preferences”. 2.单击“Server”选项, ...