java数据结构实验1

 实验1线性表的基本操作

1.1顺序表

在顺序表类SeqList中增加以下成员方法:

· public void removeAll(Tkey)//删除所有关键字为key的数据元素,要求所有

元素一次移动到位

public void replaceFirst(TkeyTx)//将第一个关键字为key的元素替换为X public int searchLast(Tkey)/查找最后一个关键字为key的元素,返回其索引号

代码:

以下是修改后的SeqList类的实现:

public class SeqList<T> {

    private Object[] element;

    private int size;

    private final int capacity;



    public SeqList(int capacity) {

        this.capacity = capacity;

        element = new Object[capacity];

        size = 0;

    }



    // 在顺序表的末尾添加元素

    public boolean add(T data) {

        if (size < capacity) {

            element[size++] = data;

            return true;

        }

        return false;

    }



    // 删除所有关键字为key的元素

    public void removeAll(T key) {

        int k = 0;

        for (int i = 0; i < size; i++) {

            if (!element[i].equals(key)) {

                element[k++] = element[i];

            }

        }

        size = k;

    }



    // 将第一个关键字为key的元素替换为X

    public void replaceFirst(T key, T x) {

        for (int i = 0; i < size; i++) {

            if (element[i].equals(key)) {

                element[i] = x;

                return;

            }

        }

    }



    // 查找最后一个关键字为key的元素

    public int searchLast(T key) {

        for (int i = size - 1; i >= 0; i--) {

            if (element[i].equals(key)) {

                return i;

            }

        }

        return -1;

    }



    // 打印顺序表元素

    public void print() {

        for (int i = 0; i < size; i++) {

            System.out.print(element[i] + " ");

        }

        System.out.println();

    }

}

测试代码:

public class Test {

    public static void main(String[] args) {

        SeqList<Integer> list = new SeqList<>(10);



        list.add(1);

        list.add(2);

        list.add(3);

        list.add(2);

        list.add(4);

        list.add(5);

        list.add(2);

        list.add(6);

        list.add(2);

        list.add(7);



        list.print(); // 1 2 3 2 4 5 2 6 2 7



        list.removeAll(2);

        list.print(); // 1 3 4 5 6 7



        list.replaceFirst(4, 8);

        list.print(); // 1 3 8 5 6 7



        System.out.println(list.searchLast(3)); // 1

        System.out.println(list.searchLast(9)); // -1

    }

}

运行结果:

1.2单链表

在单链表SinglyList中增加以下成员方法:

·public Nodelast()//返回最后一个结点

·public Node prev(Nodep)//返回p结点的前驱结点

·public SinglyListsubList(intiintlen)//返回从第i个结点开始,长度为len的子表,深拷贝

答案:

代码:

public class SinglyList<T> {

    // 单链表的节点类

    private static class Node<T> {

        T data;

        Node<T> next;



        Node(T data, Node<T> next) {

            this.data = data;

            this.next = next;

        }

    }



    private Node<T> head; // 头结点

    private int size; // 链表的长度



    // 构造方法,创建一个空链表

    public SinglyList() {

        head = null;

        size = 0;

    }



    // 在链表末尾添加一个元素

    public void add(T elem) {

        if (head == null) {

            head = new Node<T>(elem, null);

        } else {

            Node<T> p = head;

            while (p.next != null) {

                p = p.next;

            }

            p.next = new Node<T>(elem, null);

        }

        size++;

    }



    // 删除链表中的第一个与elem相等的元素

    public boolean remove(T elem) {

        if (head == null) {

            return false;

        }

        if (head.data.equals(elem)) {

            head = head.next;

            size--;

            return true;

        }

        Node<T> p = head;

        while (p.next != null && !p.next.data.equals(elem)) {

            p = p.next;

        }

        if (p.next != null) {

            p.next = p.next.next;

            size--;

            return true;

        }

        return false;

    }



    // 返回链表的长度

    public int size() {

        return size;

    }



    // 返回最后一个结点

    public Node<T> last() {

        if (head == null) {

            return null;

        }

        Node<T> p = head;

        while (p.next != null) {

            p = p.next;

        }

        return p;

    }



    // 返回p结点的前驱结点

    public Node<T> prev(Node<T> p) {

        if (head == null || p == head) {

            return null;

        }

        Node<T> q = head;

        while (q != null && q.next != p) {

            q = q.next;

        }

        return q;

    }



    // 返回从第i个结点开始,长度为len的子表,深拷贝

    public SinglyList<T> subList(int i, int len) {

        if (i < 0 || i > size || len <= 0 || i + len > size) {

            throw new IndexOutOfBoundsException();

        }

        SinglyList<T> sublist = new SinglyList<T>();

        Node<T> p = head;

        for (int j = 0; j < i; j++) {

            p = p.next;

        }

        for (int j = 0; j < len; j++) {

            sublist.add(p.data);

            p = p.next;

        }

        return sublist;

    }



    // 测试输出

    public static void main(String[] args) {

        SinglyList<Integer> list = new SinglyList<Integer>();

        list.add(1);

        list.add(2);

        list.add(3);

        list.add(4);

        list.add(5);



        System.out.println("size: " + list.size());



        Node<Integer> last = list.last();

        System.out.println("last element: " + last.data);

    }

}

运行结果:

猜你喜欢

转载自blog.csdn.net/m0_62110645/article/details/130129010