18.12.23

#include<stdio.h>
#include<stdlib.h>
#define LIST_INITSIZE 100  //线性表存储空间的初始分配量
#define LIST_INCREMENT 10  //线性表存储空间空间的分配增量 
#define OK 1
#define ERROR 0
#define OVERFLOW -1//溢出 
typedef int ElemType;      //设元素类型为int 
typedef struct
{
    ElemType *elem;       //存储空间基址
    int length;           //当前长度
    int listsize;         //当前分配的存储容量 (以sizeof(ElemType)为单位)
}SeqList;                 //定义线性表的类型 
int InitList (SeqList &L) //线性表的初始化,构造一个空的线性表L 
/*形参L为引用型变量,&为取地址符(此处为引用传递),形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作。 
用了引用变量后,就不再为形参开辟内存,所有操作都是直接修改实参变量。 */ 
{
    L.elem = (ElemType *)malloc(LIST_INITSIZE * sizeof(ElemType));
    if(! L.elem)          // L.elem = NULL时,NULL(值为0)为空指针 
        exit(OVERFLOW);   //存储分配失败,结束程序
    L.length = 0;         //空表长度为0
    L.listsize = LIST_INITSIZE;  //初始化存储容量
    return OK; 
}
int CreatList(SeqList &L)
{
    int i;
    scanf("%d",&L.length);
    for(i = 0;i < L.length;++i)
    {
        scanf("%d",L.elem + i);  
    }
}
int InsertList(SeqList &L,int i,ElemType e)
{    
    //在顺序线性表L中第i个位置之前插入新的e
    //i的合法值为1<=i<=L.length + 1
    ElemType *newbase,*q,*p;
    if(i<1 || i > L.length + 1)
        return  ERROR;   //i的值不合法
    if(L.length >= L.listsize) //当前存储空间已满,增加分配 
    {
         newbase = (ElemType*)realloc(L.elem,(L.listsize + LIST_INCREMENT) * sizeof(ElemType));//重新分配存储空间 
        if(! L.elem)
            exit(OVERFLOW);
        L.elem = newbase; //新基址
        L.listsize += LIST_INCREMENT;   //增加存储容量 
    } 
    q = &(L.elem[i-1]);   //q为插入的地址 
    for(p = &(L.elem[L.length - 1]);p >= q;--p)  //p初始值为表尾元素的位置 
        *(p+1) = *p;      //插入位置及之后的元素右移
    *q = e;           //插入e
    ++L.length;       //表长增1
    return OK; 
}
int DeleteList(SeqList &L,int i,ElemType &e)//在顺序线性表L中删除第i个元素,并用e返回其值

    ElemType *p,*q;
    if(i<1 || i > L.length)
        return  ERROR;   //i的值不合法
    p = &(L.elem[i-1]);  //p 为被删除元素的位置, p = L.elem + i - 1
    e = *p;              //被删除元素的值赋给e
    q = L.elem + L.length - 1;  //表尾元素的位置
    for(++p;p <= q;++p)  //p=p+1初始 
        *(p-1) = *p;     //被删除元素之后的元素左移
    --L.length;          //表长减一
    return OK;
}
/*
int Locate_List(SeqList L,ElemType e,int (*compare)(ElemType,ElemType))
//在顺序线性表L中查找第1个值与e满足compare()的元素的位序 
//若找到,则返回其在L中的位序,否则返回0 
{
    int i;
    ElemType *p;
    i = 1;              //i的初值为第1个元素的位序
    p = L.elem;         //p的初值为第1个元素的存储位置
    while(i <= L.length && !(*compare)(*p++,e))  //*p++先以原值带入,compare为函数指针 
        ++i;          //遍历查找
    if(i <= L.length) 
        return i--;
    else 
        return 0; 
}
*/
void MergeList(SeqList La,SeqList Lb,SeqList &Lc)
{
    //已知顺序线性表La和Lb的元素按值非递减排列
    //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
    ElemType *pa,*pb,*pc,*pa_last,*pb_last;
    pa = La.elem;
    pb = Lb.elem;
    Lc.listsize = Lc.length = La.length + Lb.length;
    pc = Lc.elem =  (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
    if(! Lc.elem)         //存储分配失败 
        exit(OVERFLOW);
    pa_last = La.elem + La.length - 1; //相当于&La.elem[La.length - 1],最后一个元素的存储位置 
    pb_last = Lb.elem + Lb.length - 1;
    while(pa <= pa_last && pb <= pb_last)//归并,递增排列,其中一个顺序表插入完结束循环 
    {
        if(*pa <= *pb)    //小值先进 
            *pc++ = *pa++;  //*(pc++) = *(pa++),先使用原值进行运算,相当于*pc = *pa,pc++,pa++
        else 
            *pc++ = *pb++;
  
    }
    while(pa <= pa_last) 
        *pc++ = *pa++;      //Lb先完全插入,之后插入La的剩余元素
    while(pb <= pb_last)
        *pc++ = *pb++;      //La先完全插入,之后插入Lb的剩余元素  

void Del_Repe(SeqList &L,SeqList &E)   //删除有序顺序线性表(递增或递减)中重复元素,并返回其值 
{
    int i; 
    for(i = 1;i <= L.length -1;++i)  //L.length 与Delete函数对应 
    {
        if(L.elem[i-1] == L.elem[i])
        {
            DeleteList(L,i,*(E.elem+E.length));//调用删除函数,删除重复元素且表长减一 
            E.length++;
            i--;  //Delete函数时表长减一,i之后元素左移,需重新判断i上的数是否重复 
        }
    }

void PrintList(SeqList L)  //输出顺序线性表 
{
    int i = 0;
    for(i = 0;i < L.length;++i)
        printf("%d ",*L.elem++);    //printf("%d",*L.elem),L.elem++,因为L是形参,L.elem自增不影响实参 
    printf("\n");
}
main()
{
    SeqList La,Lb,Lc,E;
    ElemType e;
    int i;
    InitList(La);           //引用传递,函数内直接改变实参变量
    InitList(Lb);           //线性表的初始化,分配动态存储空间 
    InitList(E);
    CreatList(La);
    CreatList(Lb);
    MergeList(La,Lb,Lc);
    PrintList(Lc);
    Del_Repe(Lc,E);
    PrintList(Lc);
    PrintList(E);
}

1.2顺序线性表的归并相关推荐

  1. c语言顺序线性表的实现

    结构体的定义 //顺序线性表的结构体 typedef struct List {ElemType * dataList; //数据地址int listLength; //数据表长度int listSi ...

  2. 大话数据结构 01 :顺序线性表

    1.完整代码 #include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#defi ...

  3. 数据结构之线性表:顺序线性表 Java 实现(底层基于数组)

    代码实现 package top.gldwolf.java.datastructure.lineartable;/*** 顺序线性表* @param <T> 存储的元素类型*/ publi ...

  4. 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...

    1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...

  5. 顺序线性表 ---- ArrayList 源码解析及实现原理分析

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...

  6. 链式线性表和顺序线性表

    顺序线性表 顺序表的存储结构通常用一维数组来描述,数组的下标与元素在线性表中的序号相对应. 在这里插入代码片 线性表的存储结构: typedef struct {int elem[MAX_SIZE]; ...

  7. c语言visit_数据结构(c语言)——入门数据结构的世界:顺序线性表(一)

    前面说的话 提到数据结构,最出名的恐怕还是四大基本结构,分别是集合,线性结构,树形结构和图形结构. 本人只是一名普普通通的本科学生,学的东西比较基础,甚至有可能比较落伍,但作为所有国内高等学府相关专业 ...

  8. C语言实现数据结构顺序线性表

    大家好,我是胡阳阳 数据结构一直以来都是一门很难的学科 学数据结构时老师总讲的思想和伪代码 对于初学者来说很难写出对应的程序 下面我们来讲解如何才能自己写出顺序线性表的代码 首先顺序线性表是由数组来实 ...

  9. 建立带表头结构的单链线性表,归并La和Lb得到新的单链线性表Lc

    逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L:正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表: 已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的 ...

  10. 顺序线性表的基本操作(C语言实现)

    //线性表顺序存储 #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef  stru ...

最新文章

  1. Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
  2. (0054)iOS开发之制作静态库详解
  3. C#中使用ProtoBuf将list进行序列化并保存到文件
  4. 博客园客户端(睡睡版iphone)源码
  5. Android Studio1.4.x JNI开发基础 - 简单实例
  6. 计算机时区找不到北京,系统缺少北京时区的解决办法
  7. java 复制标记_java-对于大文件,在标记inputStream并将其重置...
  8. centos6使用docker部署zookeeper
  9. 【动态规划笔记】完全背包问题及优化
  10. apache struts linux,Apache Struts2远程代码执行漏洞(S2-053)(CVE-2017-12611)
  11. 在 ASP.NET MVC 中充分利用 WebGrid
  12. 《调色师手册:电影和视频调色专业技法(第2版)》——监视器校准
  13. 贪吃蛇代码c语言dev中运行,刚学C语言,想写一个贪吃蛇的代码
  14. Codewar刷题总结
  15. 关于Google地图路线偏移的问题
  16. 3dsmax 放样 操作
  17. c语言倍增算法,用倍增公式选股
  18. Web服务器简介----Tomcat从认识到下载安装到配置使用
  19. 用户输入行数和列数,之后在控制台打印出用户输入行数和列数的星星
  20. 并发并行多线程并发问题线程安全问题

热门文章

  1. Silverlight与WCF错误处理:Server Not Found(1)
  2. 在以太坊模拟链及私链上编译、部署智能合约
  3. extjs-mvc结构实践(二):基本页面
  4. postgresql学习笔记(五)备份与恢复
  5. tar.xz如何解压:linux和windows下tar.xz解压命令介绍
  6. 解决VS2005 VS2008 vs2010断点无效-源代码与原始版本不同
  7. golang fmt.printf()
  8. 多区域OSPF基本配置
  9. 超强功能file_put_contents()函数(集成了fopen、fwrite、fclose)
  10. Query全选全不选第二次失效问题解决办法