《数据结构》(严蔚敏 吴伟民)学习笔记 - 第二章 线性表

线性结构的特点是:

1、线性表的类型定义

线性表(linear_list)是最常用且最简单的一种数据结构。

在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成。在这种情况下,常把数据元素称为记录(record),含有大量记录的线性表又称为文件(file)。

EX2-1:

    public static <AnyType> void union(DSAA0301_ArrayList<AnyType> LA, DSAA0301_ArrayList<AnyType> LB)
    {

        for(int i = 0; i < LB.size(); i++)
        {
            if(LA.LocateElem(LB.get(i)) == -1)
            {
                LA.add(LB.get(i));
            }
        }
    }

EX2-2:

    public static <AnyType> void mergeList(DSAA0301_ArrayList<AnyType> LA, DSAA0301_ArrayList<AnyType> LB, DSAA0301_ArrayList<AnyType> LC)
    {
        int i = 0;
        int j = 0;
        
        while(i < LA.size() && j < LB.size())
        {
            if(((Comparable<Object>)(LA.get(i))).compareTo((Comparable<Object>)(LB.get(j))) < 0)            
            {
                LC.add(LA.get(i));
                i++;
            }
            else
            {
                LC.add(LB.get(j));
                j++;
            }
        }

        while(i < LA.size())
        {
            LC.add(LA.get(i));
            i++;
        }

        while(j < LB.size())
        {
            LC.add(LB.get(j));
            j++;
        }

    }   

2、线性表的顺序表示和实现

一般情况下,在第 i (1 ≤ i ≤ n)个元素之前插入一个元素时,需将第 n 至第 i(共 n - i + 1)个元素向后移动一个位置,算法如下:


    public void add(int idx, AnyType x)
    {
        if(theItems.length == size())
        {
            ensureCapacity(size() * 2 + 1);
        }
        for(int i = theSize; i > idx; i--)
        {
            theItems[i] = theItems[i - 1];
        }
        theItems[idx] = x;
        theSize++;
    }

反之,线性表的删除是使长度为 n 的线性表(a1,...,ai-1,ai,ai+1,...,an)变成长度为 n - 1 的线性表(a1,...,an-1,ai+1,...,an)。

一般情况下,删除第 i (1 ≤ i ≤ n)个元素时,需将从第 i + 1 至第 n(共 n - i )个元素依次向前移动一个位置,算法如下:


    public AnyType remove(int idx)
    {
        AnyType removedItem = theItems[idx];

        for(int i = idx; i <size() - 1; i++)
        {
            theItems[i] = theItems[i + 1];
        }

        theSize--;
        return removedItem;
    }

3、线性表的链式表示和实现

1)线性链表

在单链表中,取得第 i 个数据元素必须从头指针出发寻找,双向链表可以从头指针或尾指针出发寻找,算法如下:

    private Node<AnyType> getNode(int idx, int lower, int upper)
    {
        Node<AnyType> p;
        
        if(idx < lower || idx >upper)
        {
            throw new IndexOutOfBoundsException();
        }

        if(idx < size() / 2)
        {
            p = beginMaker.next;
            for(int i = 0; i < idx; i++)
            {
                p = p.next;
            }
        }
        else
        {
            p = endMaker;
            for(int i = size(); i > idx; i--)
            {
                p = p.prev;
            }
        }

        return p;
    }

猜你喜欢

转载自www.cnblogs.com/Tom-1103/p/12146268.html