数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)

创建结点类,链表类,测试类

 1 import java.lang.Object;
 2 //结点node=数据date+指针pointer
 3 public class Node {
 4     Object iprop;
 5     public Object getIprop(int i){
 6     switch(i){
 7     case 1:iprop=num;break;
 8     case 2:iprop=name;break;
 9     case 3:iprop=score;break;
10     }
11     return iprop;
12     }
13    //数据data
14     Object num,name,score;
15     //指针pointer
16     Node next;
17     public Node(Object obj1,Object obj2,Object obj3){
18         num=obj1;
19         name=obj2;
20         score=obj3;
21     }
22     public Node(){
23
24     }
25 }

  1 //链表List=头结点head+尾结点tail+链表名Lname
  2 public class List {
  3
  4     // 头结点head
  5     Node head;
  6     // 尾结点tail
  7     Node tail;
  8     // 链表名Lname
  9     String Lname;
 10     int length=0;
 11
 12     // 初始化链表时,里面没有结点,为空链表
 13     public List(String str) {
 14         head = tail = null;
 15         Lname = str;
 16     }
 17
 18     public List() {
 19         head = tail = null;
 20         Lname = "List";
 21     }
 22
 23     // 头插法
 24     public List appendToFront(Node n) {
 25
 26         if(this.head==null){
 27            head=tail=n;
 28            length++;
 29            //n.next=null;
 30         }else{
 31
 32             n.next=head;
 33             head=n;
 34             length++;
 35         }
 36         return this;
 37
 38     }
 39
 40     // 尾插法
 41     public List appendToTail(Node n) {
 42         //
 43         if(head!=null){
 44            tail.next=n;
 45            tail=n;
 46         }else{
 47             head=tail=n;
 48             //n.next=null;
 49         }
 50         return this;
 51
 52     }
 53
 54     // 插入结点到第i个结点之后
 55     public void insert(Node n, int i) {
 56
 57     }
 58
 59     // 插入结点到第j个data为obj的结点之后
 60     public void insert(Node n, Object obj, int i) {
 61
 62     }
 63
 64     // 遍历链表
 65     public void visitAll() {
 66        //创建pointer p
 67        Node p=new Node();
 68        //拿到头结点的引用
 69        p=head;
 70        //顺序拿到结点做展示
 71        for(;p!=null;){
 72            System.out.println("num:"+p.num+"name:"+p.name+"score:"+p.score);
 73            p=p.next;
 74        }
 75     }
 76
 77     // 拿到第i个结点
 78     public Node getNode(int i) {
 79         //定义浏览指针p
 80         Node p=new Node();
 81
 82         //定义循环参数j
 83         int j=1;
 84
 85         //循环结点
 86         p=this.head;
 87         if(p!=null)
 88         for(;j<i;j++){
 89
 90             p=p.next;
 91             if(p==null){System.out.println("p==null遍历结束,无此结点");break;}
 92
 93         }
 94         return p;
 95     }
 96
 97     // 拿到第j个data为obj的结点
 98     public Node getNode(Object obj, int j) {
 99         //拿到头结点的引用
100         Node p=head;
101         //循环数据并比较data
102             for(;p!=null;){
103
104                 for(int i=0;i<j;i++){
105                 Object prop=p.getIprop(j);
106                 if(prop!=null&&prop.equals(obj)) {return p;}
107                 }
108                 p=p.next;
109             }
110         return p;
111     }
112
113     // 删除第i个结点
114     public void delete(int i) {
115         //找到i结点
116
117     }
118
119     // 删除第j个data为obj的结点
120     public void delete(Object obj, int j) {
121
122     }
123
124     // 删除全部
125     public void deleteAll() {
126
127     }
128     // 链表的排序:list中的node按第j个data的值进行排序
129     // >>直接插入法
130     public List listSort(int j){
131
132         //循环当前链表的结点对象,找到第j个data值
133         Node p=head;//想象head 下标为0,head.next依次类推
134         int[] datas=new int[this.length];
135         for(int i=0;p!=null;i++){
136             Object prop=p.getIprop(j);//
137             if(prop!=null){
138                 System.out.println("循环到下标为"+i+"的结点");
139                 datas[i]=Integer.parseInt(prop.toString());
140
141             }
142             p=p.next;
143         }
144         //冒泡排序
145         Node pre=null;
146
147         for(int i=0;i<datas.length-1;i++){
148             pre=null;
149             p=head;
150
151             for(int k=0;k<datas.length-i-1;k++){
152
153
154                 if(datas[k]>datas[k+1]){
155
156                     int temp=datas[k];
157                     datas[k]=datas[k+1];
158                     datas[k+1]=temp;
159
160
161                     Node tempNode=p.next.next;
162
163                     pre.next=p.next;
164                     p.next.next=p;
165                     p.next=tempNode;
166
167                     pre=pre.next;
168
169                 }else{
170                 //拿到前驱结点
171                 pre=p;
172                 p=p.next;
173                 }
174             }
175         }
176
177         return this;
178     }
179     public static void main(String[] arg){
180         int[] datas={4,2,5,6,7,3,1,0,9,8};
181         //冒泡排序法
182         for(int i=0;i<datas.length-1;i++){
183             for(int j=0;j<datas.length-(i+1);j++){
184                 if(datas[j]>datas[j+1]){
185                     int temp=datas[j];
186                     datas[j]=datas[j+1];
187                     datas[j+1]=temp;
188                 }
189             }
190         }
191         for(int i=0;i<datas.length;i++){
192         System.out.println(datas[i]);}
193     }
194
195
196 }

 1 public class TestList {
 2     public static void main(String[] arg){
 3         Node n0=new Node(125,"n0","91");
 4         Node n1=new Node(123,"n1","98");
 5         Node n2=new Node(121,"n2","99");
 6         Node n3=new Node(125,"n3","96");
 7         Node n4=new Node(125,"n4","95");
 8         Node n5=new Node(125,"n5","97");
 9         Node n6=new Node(125,"n6","93");
10         Node n7=new Node(125,"n7","94");
11         Node n8=new Node(125,"n8","92");
12         Node n9=new Node(125,"n9","90");
13
14
15         List f1=new List("f1List");
16         //头插法
17         f1.appendToFront(n0).appendToFront(n1).appendToFront(n2).appendToFront(n3)
18         .appendToFront(n4).appendToFront(n5).appendToFront(n6).appendToFront(n7)
19         .appendToFront(n8).appendToFront(n9);
20
21
22         //拿到排好序的链表f2;
23         f1.listSort(3).visitAll();
24
25
26
27
28     }
29
30 }

冒泡排序用处真大

心得:

>>对于指针(引用)的运用需要注意如下:

Node p=f1List.head;

p=p.next;//让指针直接指向(即直接p=)新引用对象(p.next),不会引起原被引用对象(head)的任何变化

Node p=f1List.head;
        p.next=p;//调用原被引用对象的属性后,将会引起原被引用对象(head)的属性相应的变化

时间: 2024-08-10 23:31:01

数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)的相关文章

数据结构开发(25):二叉树中属性操作、层次遍历与典型遍历

0.目录 1.二叉树的比较与相加 2.二叉树的线索化实现 3.二叉树的经典面试题分析 3.1 单度结点删除 3.2 中序线索化二叉树 4.小结 1.二叉树的比较与相加 二叉树的克隆操作: SharedPointer< BTree<T> > clone() const 克隆当前树的一份拷贝 返回值为堆空间中的一棵新二叉树 ( 与当前树相等 ) 二叉树的克隆: 定义功能:clone(node) 拷贝 node 为根结点的二叉树 ( 数据元素在对应位置相等 ) 在BTree.h中实现二叉

python中的数据结构-链表

一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环链表等.单向链表的结构如下图所示: head 节点永远指向第一个节点, tail节点永远指向最后一个节点,节点中最后一个指针指向的是None 值,链表本质上就是由指针链接起来的一系列值. 二.为什么使用链表 我们经常拿链表和数组作比较,实际上数组是一组固定长度的序列,链表可以动态地分配元素,下面我们

数据结构入门——链表的实现

该程序实现了链表的增.删.遍历.排序等大部分功能,仅供参考.理解链表的原理,对后面栈.队列.二叉树.图等数据结构的学习有很大帮助. 链表的实现: # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node { int data; struct Node * pNext; }NODE, *PNODE; PNODE create_list(void); void trav

C# 数据结构--单链表

什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.这组存储单元既可以是连续的,也可以是不连续的. 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 链表的结点结构

数据结构单链表实现

<数据结构>中单链表的实现c代码 转自:http://blog.chinaunix.net/uid-22750250-id-1769905.html include.h /******************************************************************      程序中要用的头文件******************************************************************/ #include<st

数据结构--单向链表

C语言中,我们在使用数组时,会需要对数组进行插入和删除的操作,这时就需要移动大量的数组元素,但在C语言中,数组属于静态内存分配,数组在定义时就必须指定数组的长度或者初始化.这样程序一旦运行,数组的长度就不能再改变,若想改变,就只能修改源代码.实际使用中数组元素的个数也不能超过数组元素的最大长度,否则就会发生下标越界的错误(这是新手在初学C语言时肯定会遇到的问题,相信老师也会反复强调!!!但这种问题肯定会遇到,找半天找不到错误在哪,怪我咯???).另外如果数组元素的使用低于最大长度,又会造成系统资

基本数据结构:链表(list)

copy from:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 基本数据结构:链表(list) 谈到链表之前,先说一下线性表.线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构就是两个相邻的元素在内存中也是相邻的.这种存储方式的优点是

数据结构之链表单向操作总结

链表是数据结构的基础内容之一,下面就链表操作中的创建链表.打印链表.求取链表长度.判断链表是否为空.查找结点.插入结点.删除结点.逆转链表.连接链表.链表结点排序等进行总结. 1.创建表示结点的类,因为链表操作中需要比较结点,因此结点需要实现comparable接口. public class Node implements Comparable<Node> { private Object data; private Node next; //构造函数 public Node() { thi

复习(数据结构):链表:c语言:练习

库函数 #include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define