且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

数据结构例程——线性表顺序存储的应用

更新时间:2022-04-03 22:52:12

本文是数据结构基础系列网络课程(2):线性表中第6课时线性表顺序存储的应用中所讲的例程。

例:删除元素

问题:已知长度为n的线性表A采用顺序存储结构,设计算法,删除线性表中所有值为x的数据元素。
要求:时间复杂度为O(n)、空间复杂度为O(1)的算法

解法0:用基本运算实现,不满足复杂度要求
(注:本文中所需要的list.h和list.cpp见点击参照…

#include "list.h"
#include <stdio.h>

void delnode1(SqList *&L,ElemType x)
{
    int i;
    ElemType e;
    while((i=LocateElem(L,x))>0)
    {
        ListDelete(L, i, e);
    }
}

//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("删除前 ");
    DispList(sq);

    delnode1(sq, 7);

    printf("删除后 ");
    DispList(sq);
    return 0;
}

解法1:复制要保留的元素

#include "list.h"
#include <stdio.h>

void delnode2(SqList *&L,ElemType x)
{
    int k=0,i; //k记录非x的元素个数
    for (i=0; i<L->length; i++)
        if (L->data[i]!=x)
        {
            L->data[k]=L->data[i];
            k++;
        }
    L->length=k;
}

//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("删除前 ");
    DispList(sq);

    delnode2(sq, 7);

    printf("删除后 ");
    DispList(sq);
    return 0;
}

例:分离元素

问题 :设顺序表有10个元素,其元素类型为整型。 设计一个算法,以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面

解法1

#include "list.h"
#include <stdio.h>

void move1(SqList *&L)
{
    int i=0,j=L->length-1;
    ElemType pivot=L->data[0];  //以data[0]为基准
    ElemType tmp;
    while (i<j)             //从区间两端交替向中间扫描,直至i=j为止
    {
        while (i<j && L->data[j]>pivot)
            j--;            //从右向左扫描,找第1个小于等于pivot的元素
        while (i<j && L->data[i]<=pivot)
            i++;            //从左向右扫描,找第1个大于pivot的元素
        if (i<j)
        {
            tmp=L->data[i]; //L->data[i]和L->data[j]进行交换
            L->data[i]=L->data[j];
            L->data[j]=tmp;
        }
    }
    tmp=L->data[0];         //L->data[0]和L->data[j]进行交换
    L->data[0]=L->data[j];
    L->data[j]=tmp;
}


//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("移动前 ");
    DispList(sq);

    move1(sq);

    printf("移动后 ");
    DispList(sq);
    return 0;
}

解法2

#include "list.h"
#include <stdio.h>

void move2(SqList *&L)
{
    int i=0,j=L->length-1;
    ElemType pivot=L->data[0];  //以data[0]为基准
    while (i<j)                 //从顺序表两端交替向中间扫描,直至i=j为止
    {
        while (j>i && L->data[j]>pivot)
            j--;                //从右向左扫描,找一个小于等于pivot的data[j]
        L->data[i]=L->data[j];  //找到这样的data[j],放入data[i]处
        i++;
        while (i<j && L->data[i]<=pivot)
            i++;                //从左向右扫描,找一个大于pivot的记录data[i]
        L->data[j]=L->data[i];  //找到这样的data[i],放入data[j]处
        j--;
    }
    L->data[i]=pivot;
}


//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("移动前 ");
    DispList(sq);

    move2(sq);

    printf("移动后 ");
    DispList(sq);
    return 0;
}