代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等

文章目录

  • 前言
    • 1、合并两个顺序表

前言

本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定,随阅历增加而增加;


1、合并两个顺序表

题目要求:

有两个顺序存储的线性表,分别存放了一些整数数据,每个顺序表中存放的数据从小到大排列。写一个程序,将两个表合并,生成一个新的顺序表,里面的顺序仍然按照从小到大排列。
例如:
list1:1,2,4,8,10
list2:3,9,11
合并之后的list3:1,2,3,4,8,9,10,11

提示:应该使用动态创建这个顺序表,这样list3的长度才可以根据list1和list2的长度动态调整。
要实现两个顺序按值归并,最终仍保持数据的从小到大递增排序,可以设置两个指针p1、p2分别指向两个待合并的顺序表list1和list2,设置指针p3指向新表list3用来向list3中存放数据,然后逐一比较p1和p2指向的内容 ,将其中较小的那个放到p3指向的list3的存储单元,然后将较小的那个指针+1.使其指向表的下一个数据,同时p3也要自动+1。重复上述操作,直到list1,list2中某一个顺序表的内容被全部归并到list3中.最后再将未完全归并的顺序表中的后续内容整体移至list3中。

代码:

#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#include "conio.h"
typedef int ElemType;typedef struct {int* elem;int length;int listsize;
}Sqlist;//初始化顺序表
void InitSqlist(Sqlist *L,int size)
{L->elem = (int*)malloc(sizeof(ElemType)*size);         //在堆内存上开辟空间,并将地址指针传给elemif (!L->elem){printf("顺序表内存开辟失败");exit(0);}L->length = 0;                              //最开始的表长0L->listsize = size;
}//向顺序表中插入元素
//向顺序表L第i个位置插入元素item
void InsertElem(Sqlist* L,int i, ElemType item)
{//追加内存后的新的基址、指向插入位置的指针、移动数据的指针中间变量ElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1)       {printf("非法插入");exit(0);}if (L->length >= L->listsize)      //顺序表的空间不够,追加内存{base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));       //将追加内容后的内存首地址传给baseL->elem = base;L->listsize = L->listsize + 100;}insertPtr = &(L->elem[i-1]);        //指针指向插入位置for (p = &L->elem[L->length - 1];p >= insertPtr;p--){//移动顺序表中数据*(p+1) = *p;}*insertPtr = item;              //插入数据元素L->length++;
}
//销毁顺序表
void DestroySqlist(Sqlist* list)
{int* p = list->elem;free(p);list->elem = NULL;list->length = 0;list->listsize = 0;
}
//两个顺序表内容的合并,返回一个新的list
Sqlist MergeList(Sqlist list1, Sqlist list2)
{//将list1和list2的内容合并到list3并返回int* p1, * p2, * p3, * p1_last, * p2_last;Sqlist list3;p1 = list1.elem;       //p1指向list1第一个元素p2 = list2.elem;       //p2指向list2第一个元素//初始化list3,其长度为list1 list2 长度之和InitSqlist(&list3,list1.length+list2.length);p3 = list3.elem;       //p3指向list3第一个元素p1_last = list1.length + list1.elem - 1;  //p1_last指向list1的表尾p2_last = list2.length + list2.elem - 1;   //p2_last指向list2的表尾//实现合并while (p1<=p1_last && p2<=p2_last)     //当list1与list2中有一个list被遍历完{if (*p1 <= *p2)  //当p1指向的元素小于p2指向的元素{*p3 = *p1;p3++;p1++;}else{*p3 = *p2;p3++;p2++;}list3.length++;}//将list1或者list2中剩余元素并入list3中if (p1 <= p1_last)       //p1有剩余{while (p1 <= p1_last){*p3 = *p1;p3++;p1++;list3.length++;}}else{while (p2 <= p2_last){*p3 = *p2;p3++;p2++;list3.length++;}}//当搬移完成后,返回list3return list3;
}
//测试程序
int main()
{Sqlist list1, list2, list3;        //实例化3个顺序表int n, i;                 //存放list长度中间变量、累加器ElemType e;                   //插入元素中间变量printf("请输入list1的长度\n");scanf("%d",&n);InitSqlist(&list1,n);printf("请输入list1的元素\n");for (i=1;i<=n;i++){scanf("%d",&e);InsertElem(&list1,i,e);}printf("请输入list2的长度\n");scanf("%d", &n);InitSqlist(&list2, n);printf("请输入list2的元素\n");for (i = 1;i <= n;i++){scanf("%d", &e);InsertElem(&list2, i, e);}list3 = MergeList(list1,list2);printf("输出合并后的结果\n");for (i = 0;i < list3.length;i++){printf("%d ",list3.elem[i]);           //这里%d根据ElemType类型来进行修改}//销毁list,释放内存DestroySqlist(&list1);DestroySqlist(&list2);DestroySqlist(&list3);_getche();return 0;
}

效果:

【数据结构基础应用】【顺序表】相关推荐

  1. 数据结构之——《顺序表》

    数据结构之--<顺序表> 1.含义 2.分类 3.接口函数实现 4.顺序表的优缺点 1.含义 顺序表示用一段纹理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组 ...

  2. 【数据结构】【顺序表】 SqList *L与SqList*L的区别

    [数据结构][顺序表] SqList *&L与SqList*L的区别 显然,对于顺序表的抽象数据模型中的函数,其参数使用各不相同. SqList *&L的情况 它的意思是,L是对Lis ...

  3. 数据结构之动态顺序表(含游戏菜单)

    上一篇文章我们谈了数据结构的静态顺序表,以及实现了静态顺序表,具体可以看我的上一篇文章->>>数据结构之静态顺序表. 我们可以知道,静态顺序表的缺点是:  因为使用的是定长数组,所以 ...

  4. 【数据结构基础】-线性表的顺序实现(数组实现)基本操作

    2019.10.10 [数据结构-线性表的顺序结构] 基本操作:初始化,判断是否空表,清空表,获取表中的第i个元素,查找元素,插入元素,删除元素,获取表的元素个数. 抽象数据类型: #include ...

  5. python数据结构之线性顺序表

    线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.本文结合了互联网上的一些代码,以及结合百度百科关于线性顺序表的定义,实现了全部代码. 在稍复杂的线性 ...

  6. [数据结构]数据结构简介和顺序表

    目录 什么是数据结构 数据结构的特性 线性表 顺序表 创建一个动态顺序表 顺序表的增删查改 尾插和尾删除 尾插 头插头删 头插 头删 任意位置的插入和删除 插入 删除 查找和打印 总结 这天,小明和小 ...

  7. java数据结构实验一顺序表,java数据结构实验代码之升序顺序表

    java数据结构实验代码之升序顺序表 数据结构实验报告 学院:管理学院 班级:13电子商务(1)班 姓名:廖秋君 学号:3213004779 2014年 10月 23 日 目录 一.需求分析----- ...

  8. 数据结构之基于顺序表的插入排序

    基于顺序表的插入排序(常规插入排序,二分插入排序,希尔排序) 这三种的都是插入排序算法的时间复杂度基本相似,但由于希尔排序不同于其他排序方式的思想,所以其时间复杂度会有所不同. 常规插入排序:O(n2 ...

  9. 数据结构与算法 | 顺序表

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 对于表,栈,队列,树,图等等数据结构,我们都可通过选择顺序结构或者链式结构来进行实 ...

  10. 数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

    目录 前言 一.顺序表的定义 二.顺序表的初始化 三.顺序表的建立 四.顺序表的输出 五.顺序表的逆序输出 六.顺序表的插入操作 七.顺序表的删除操作 八.顺序表的按位和按值查找 基本操作的完整代码 ...

最新文章

  1. 基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络
  2. java arraystoreexception_208道高频 Java面试题答案6
  3. NLP高阶实战必读:一文走遍完整自然语言处理流程
  4. 11款有用的Web开发在线工具
  5. python闭包、装饰器
  6. python云变量_Python之变量的创建过程
  7. Python将迁移到GitHub
  8. 2010年经典语录,我们全OUT了
  9. [Postman使用]请求与响应
  10. 专访李运华:程序员如何在技术上提升自己
  11. 遇到安装3dmax2020版本时出现1603错误时解决方法
  12. 微信小程序支持Markdown教程
  13. 【超详细word排版】页眉:宋体五号,居中排列。左面页眉为论文题目,右面页眉为章次和章标题。页眉底划线的宽度为0.75磅。 页码:宋体小五号,排在页眉行的最外侧,不加任何修饰。
  14. 我变了?“我”没变!
  15. 何谓Palm size-PC及Pocket PC?
  16. 人有见识就不轻易发怒;宽恕人的过失便是自己的荣耀。
  17. Ubuntu强制修改root密码
  18. 软件接口测试是什么?怎么测?
  19. 国家信息安全水平考试NISP一级模拟题(04)
  20. linux编译器警告变成错误,警告就是错误

热门文章

  1. weblogic 升级bsu_Weblogic补丁升级之坑坑洼洼
  2. Vue过渡 动画混入
  3. java集成_Java继承
  4. 11、Node.js 函数
  5. HMTL label标签
  6. vue笔记(三)生命周期、组件(嵌套)、数据传递
  7. 显示日历的指令:cal
  8. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...
  9. vijos p1460——拉力赛
  10. 基于NIOS II的液晶显示设计——自定义图形库