aliengo 2009-08-22 15:43
浏览 370
已采纳

JAVA单链表(多项式)直接插入排序,大家看看我的怎么不行呢

目的就是按照结点的exp域值排序,从小到大

1.首先是结点类如下:

[code="java"]
public class PolyNode {
private float coef; // 一元多项式项的系数
private int exp; // 一元多项式项的次数
private PolyNode next; // 指向下一个一元多项式结点

public PolyNode(float coef, int exp) {
    this.coef = coef;
    this.exp = exp;
    next = null;
}

public float getCoef() {
    return coef;
}

public void setCoef(float coef) {
    this.coef = coef;
}

public int getExp() {
    return exp;
}

public void setExp(int exp) {
    this.exp = exp;
}

public PolyNode getNext() {
    return next;
}

public void setNext(PolyNode next) {
    this.next = next;
}

}
[/code]

2.下面是链表类如下:

[code="java"]
public class PolyList {
public PolyNode head;

public PolyList() {
    head = new PolyNode(-10001.0f, -10001);
}
   //初始化链表
public void init(float[] cvs, int[] evs) {
    PolyNode newNode, node = head;
    for (int i = 0; i < evs.length; i++) {
        newNode = new PolyNode(cvs[i], evs[i]);
        newNode.setNext(node.getNext());
        node.setNext(newNode);
        node = node.getNext();
    }
}

}
[/code]

3.下面是我的代码,大家帮忙看看为什么不对,谢谢了,我写了很久都不正确

[code="java"]
/**
* 多项式按exp数据域值从小到大顺序排列。
*
* @param l
*/
public static PolyList listInsertSort_PL(PolyList l) {
PolyNode p = l.head;
PolyList l2 = new PolyList();
PolyNode q = l2.head;
q.setNext(p.getNext());
//int i = 1;
while (p.getNext() != null) {
System.out.println(p.getNext().getExp() + " out");
PolyNode s = p.getNext();
while (q.getNext() != null) {
System.out.println("in " + q.getExp()+" "+s.getExp());
if (s.getExp() < q.getNext().getExp()) {
System.out.println(q.getNext().getExp()+" insert now!");
s.setNext(q.getNext());
q.setNext(s);
break;
}
System.out.println(q.getNext().getExp());
q = q.getNext();
}
q.setNext(s);
p = p.getNext();
}

    return l2;
}
     //测试方法
     public static void main(String[] args) {
    int[] evs = { 9, 8, 7 };
    float[] cvs = { 1, 2, 3 };
    PolyList l = new PolyList();
    l.init(cvs, evs);
    PolyList pls = Test04.listInsertSort_PL(l);
    PolyNode pl = pls.head;
    System.out.print("result : ");
    while (pl.getNext() != null) {
        System.out.print(pl.getNext().getExp() + " ");
        pl = pl.getNext();
    }
}

[/code]

请大家指教!

  • 写回答

2条回答 默认 最新

  • walsh_bupt 2009-08-23 15:08
    关注

    [size=medium][color=red]首先我不说你的算法有什么问题,我按照我的思路给你写了一个和你的差不多的算法,看了之后,如果你用心思考的话,或许就能看出你的算法问题出在哪里,为什么会进入无限循环。[/color][/size]

    为了你能够看得更明白,我就把所有的类都给你贴上,看了之后,相信你能够看出你写的算法错误的原因。

    1.节点类如下:

    [code="java"]/**

    • 多项式节点
    • @author zhq
      *
      */
      public class PolyNode {
      private float coef; // 一元多项式项的系数
      private int exp; // 一元多项式项的次数
      private PolyNode next; // 指向下一个一元多项式结点

      public PolyNode(float coef, int exp) {
      this.coef = coef;
      this.exp = exp;
      next = null;
      }

      public float getCoef() {
      return coef;
      }

      public void setCoef(float coef) {
      this.coef = coef;
      }

      public int getExp() {
      return exp;
      }

      public void setExp(int exp) {
      this.exp = exp;
      }

      public PolyNode getNext() {
      return next;
      }

      public void setNext(PolyNode next) {
      this.next = next;
      }

      public String toString() {
      return "<" + coef + ":" + exp + ">";
      }
      }[/code]

    2.链表类如下:
    [code="java"]/**

    • 初始化链表
    • @author zhq
      *
      */
      public class PolyList {

      private PolyNode head, newNode;

      public PolyList() {
      head = new PolyNode(-10001.0f, 10001);
      }

      // 初始化链表
      public void init(float[] cvs, int[] evs) {
      PolyNode currentNode = head.getNext();
      for (int i = 0; i < evs.length; i++) {
      newNode = new PolyNode(cvs[i], evs[i]);
      if (currentNode == null) {
      currentNode = newNode;
      head.setNext(currentNode);
      } else {
      currentNode.setNext(newNode);
      currentNode = newNode;
      }
      }
      }

      public PolyNode getHead() {
      return head;
      }

      public void setHead(PolyNode head) {
      this.head = head;
      }

      public String toString() {
      StringBuilder sb = new StringBuilder();
      PolyNode currentNode = head;
      sb.append("(");
      while (currentNode != null) {

          sb.append("<" + currentNode.getCoef() + ":" + currentNode.getExp()
                  + ">");
          currentNode = currentNode.getNext();
      }
      
      sb.append(")");
      return sb.toString();
      

      }
      }[/code]

    3.核心算法类

    [code="java"]/**

    • 核心算法类
    • @author zhq
    • /
      public class Demo {
      /
      *

      • 时间复杂度O(n的平方),空间复杂度O(n).n是节点的总数
      • @param pl
      • 待排序的链表多项式
      • @return 有序的多项式(按次数从小到大) */ public static PolyList listInsertSort(PolyList pl) { PolyNode headNode = pl.getHead(); // 指向表已经排序的最后一个节点 PolyNode lastInOrder; // 移动到适当位置的节点 PolyNode firstOutOfOrder; // 当前节点 PolyNode current; // 该引用变量指向current的前一个节点 PolyNode trailCurrent; if (headNode.getNext() == null)// 链表为空 System.out.println("Cannot sort an empty list"); else if (headNode.getNext().getNext() == null) {// 链表只有一个节点 System.out.println("The list is length 1. It is already in order"); } else {// 链表多于一个节点 lastInOrder = headNode.getNext(); while (lastInOrder.getNext() != null) { firstOutOfOrder = lastInOrder.getNext(); if (firstOutOfOrder.getExp() < lastInOrder.getExp()) { lastInOrder.setNext(firstOutOfOrder.getNext()); firstOutOfOrder.setNext(headNode.getNext()); headNode.setNext(firstOutOfOrder); } else { trailCurrent = headNode; current = headNode.getNext(); while (current.getExp() < firstOutOfOrder.getExp()) { trailCurrent = current; current = current.getNext(); } if (current != firstOutOfOrder) { lastInOrder.setNext(firstOutOfOrder.getNext()); firstOutOfOrder.setNext(current); trailCurrent.setNext(firstOutOfOrder); } else { lastInOrder = lastInOrder.getNext(); } } } } return pl; }

      // 测试方法
      public static void main(String[] args) {
      /** 系数 /
      float[] cvs = { 1, 2, 3, 5, 10 };
      /
      * 次数 */
      int[] evs = { 9, 8, 7, 10, 3 };
      PolyList pl = new PolyList();
      pl.init(cvs, evs);
      System.out.println("排序前:" + pl);
      System.out.println("排序后:" + listInsertSort(pl));
      }
      }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多