数据结构——线性表的一些算法

1.已知线性表(a0,a1,a2,….an)按顺序存储,且每个元素都是均不相等的整数,设计把所有的比a0大的数移到其右边,把所有比a0小的数移到其左边的算法。
要求:时间最少,辅助空间最少。

解题思路:其实这就是一趟快速排序,a0到位,比它小的交换到低端,比它大的交换到高端。

void move(SqList L)
{
    int i=0,j=L.length-1;
    int key=L.elem[0];
    while (i<j)
    {
        while (i<j &&L.elem[j]>=key) --j;
        {
            L.elem[i]=L.elem[j];///比枢纽小的交换到底端
            ++i;
        }
        while (i<j && L.elem[i]<=key) ++i;
        {
            L.elem[j]=L.elem[i];///比枢纽大的交换到高端
            --j;
        }
    }
    L.elem[i]=key;///枢纽到位
}

2.已知线性表LA和 LB中的数据元素按值非递减有序,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。

LA=(3,5,8,11)
       LB=(2,6,8,9,11,15,20)
则:LC=(2,3,5,6,8,8,9,11,11,15,20)

解题思路:先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。LC中元素按值非递减有序排列。 设指针i和j分别指向LA和LB中某个元素,若设i当前所指元素为ai,j当前所指元素为bj,则当前应插入到LC中的元素ck为

ai     当ai<=bj时
ck=
        bj      当ai>bj时

void MergeList(SqList La, SqList Lb, SqList *Lc)
{
    /* 本算法将非递减的有序表 La 和 Lb 归并为 Lc*/
    /*Lc的数据元素也按值非递减有序*/
    int i=0,j=0,k=0;
    int ai,bj;
    InitList(Lc);/*构造空的线性表Lc*/
    Lc->length=La.length+Lb.length; /*Lc表的长度*/
    while((i<=La.length-1)&&(j<=Lb.length-1))
    {   /* La和Lb均非空,i =0, j = 0, k = 0*/
        ai=La.elem[i]; /*取La中第i个元素*/
        bj=Lb.elem[j];/*取Lb中第j个元素*/
        if (ai<=bj)    /* 将 ai 插入到 Lc 中*/
        {
            ListInsert(Lc,k,ai);
            ++i;
            ++k;
        } /*if*/
        else     /* 将 bj 插入到 Lc 中*/
        {
            ListInsert(Lc,k,bj);
            ++j;
            ++k;
        } /*else*/
    }
    while(i<=La.length-1)///La非空且Lb空时,将La剩下的部分插入Lc中
    {
        ai=La.elem[i];
        ListInsert(Lc, k, ai);
        ++i;
        ++k;
    }
    while(j<=Lb.length-1)///Lb非空且La空时,将Lb剩下的部分插入Lc中
    {
        bj=Lb.elem[j];
        ListInsert(Lc, k, bj);
        ++j;
        ++k;
    }
}/* merge_list*/

原文地址:https://www.cnblogs.com/wkfvawl/p/10131625.html

时间: 2024-11-25 19:42:21

数据结构——线性表的一些算法的相关文章

C算法与数据结构-线性表的应用,多项式求和---ShinePans

/*---上机作业作业,二项式加法---*/ /*---By 潘尚 ---*/ /*---日期: 2014-5-8 . ---*/ /*---题目:---*/ //假设有两个稀疏多项式A和B,设计算法完成下列任务 //1.输入并建立多项式A和B; //2.求两个多项式的和多项式C; //3.求两个多项式的积多项式D; //输出4个多项式A,B,C,D; #include <stdio.h> #include <stdlib.h> #include <string.h>

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

数据结构—线性表

存放学生表的链表的结点类型: typedef struct studentnod{ int no; char name[8]; char sex[2]; char class[4]; struct studentnod *next;}stuType; 线性表:是具有相同特性的数据元素的一个有限序列: 线性表的顺序存储结构:顺序表 顺序表的存储类型: typedef struct { ElemType data[Maxsize]; int length; }Sqlist; 顺序表的元素查找: in

【线性表基础】基于线性表的简单算法【Java版】

本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeRepeat(LinkList L) { Node node = L.head.next; // 首结点 while (node != null) // 一重循环,遍历L中的每一个元素 { // Object data=p.data; Node p = node; // q结点的前驱 Node q =

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队