考研系列二-线性表合并

套用系列一的线性表类,又加了三个成员函数:

  1 #include <fstream>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdlib>
  5
  6 using namespace std;
  7
  8 #define N 100
  9 enum Status{success,fail,fatal,range_error,overflow};
 10
 11 class List{
 12     private:
 13     char *list;
 14     int len;
 15
 16     public:
 17     List(char *tlist=""){
 18         list=new char[N];
 19         strcpy(list,tlist);//初始化
 20         len=strlen(list);
 21     }
 22     ~List(){
 23         delete list;
 24     }
 25     void listClear(){//销毁
 26         list[0]=‘\0‘;
 27         len=0;
 28     }
 29     bool listEmpty(){//判空
 30         return len==0;
 31     }
 32     int listSize(){//求长度
 33         return len;
 34     }
 35     Status listRetrieve(int pos,char &elem){//取指定位置元素
 36         if(pos>=0&&pos<len){
 37             elem=list[pos];
 38             return success;
 39         }else   return range_error;
 40     }
 41     Status listLocate(char elem,int &pos);//按值查找
 42     Status listInsert(int pos,char elem);//插入
 43     Status listRemove(int pos);//删除
 44     Status listPrior(int pos,char &elem);//求前驱
 45     Status listNext(int pos,char &elem);//求后继
 46     void listShow();//显示表内容
 47     Status listUnion(List &list2);//集合合并
 48     Status listMerge(List &list1,List &list2);//有序表合并
 49 };
 50
 51 int main(){
 52     //freopen("D:\\input.in","r",stdin);
 53     //freopen("D:\\output.out","w",stdout);
 54     List s1("hello"),s2("echo"),s10("abcdegkl"),s11("bdefhk"),s12;
 55
 56     s1.listShow();
 57     if(s1.listUnion(s2)==success)   s1.listShow();
 58
 59     s10.listShow();
 60     s11.listShow();
 61     if(s12.listMerge(s10,s11)==success)     s12.listShow();
 62     return 0;
 63 }
 64 Status List::listLocate(char elem,int &pos){
 65     for(int i=0;i<len;i++){
 66         if(list[i]==elem){
 67             pos=i;
 68             return success;
 69         }
 70     }
 71     return fail;
 72 }
 73 Status List::listInsert(int pos,char elem){
 74     if(len==N-1)     return overflow;//因为终止符
 75     if(pos<0||pos>len)  return range_error;
 76     for(int i=len+1;i>pos;i--)    list[i]=list[i-1];
 77     list[pos]=elem;
 78     len++;
 79     return success;
 80 }
 81 Status List::listRemove(int pos){
 82     if(pos<0||pos>=len)  return range_error;
 83     for(int i=pos;i<len-1;i++)    list[i]=list[i+1];
 84     len--;
 85     return success;
 86 }
 87 Status List::listPrior(int pos,char &elem){
 88     return listRetrieve(pos-1,elem);
 89 }
 90 Status List::listNext(int pos,char &elem){
 91     return listRetrieve(pos+1,elem);
 92 }
 93 void List::listShow(){
 94     puts(list);
 95 }
 96 Status List::listUnion(List &list2){
 97     char elem;
 98     Status status;
 99     int pos,len2=list2.listSize();
100     for(int i=0;i<len2;i++){
101         list2.listRetrieve(i,elem);
102         status=listLocate(elem,pos);
103         if(status!=success){
104             status=listInsert(len,elem);
105             if(status!=success) break;
106         }
107     }
108     return status;
109 }
110 Status List::listMerge(List &list1,List &list2){
111     char elem1,elem2;
112     int len1,len2,i=0,j=0;
113     Status status;
114     len1=list1.listSize();
115     len2=list2.listSize();
116     while(i<len1&&j<len2){
117         list1.listRetrieve(i,elem1);
118         list2.listRetrieve(j,elem2);
119         if(elem1<elem2){
120             status=listInsert(len,elem1);
121             i++;
122         }else{
123             status=listInsert(len,elem2);
124             j++;
125         }
126         if(status!=success) return status;
127     }
128     while(i<len1){
129         list1.listRetrieve(i,elem1);
130         listInsert(len,elem1);
131         if(status!=success) return status;
132         i++;
133     }
134     while(j<len2){
135         list2.listRetrieve(j,elem2);
136         status=listInsert(len,elem2);
137         if(status!=success) return status;
138         j++;
139     }
140     return status;
141 }

敲代码期间遇到一个bug,就是字符串的终止符问题,合并时不小心把终止符给覆盖了,结果程序就飞了。

时间: 2024-10-10 09:53:59

考研系列二-线性表合并的相关文章

2、蛤蟆的数据结构笔记之二线性表

2.蛤蟆的数据结构笔记之二线性表 到了笔记二了,每个笔记开头都应该弄个语句激励一下自己和小伙伴. "人生中最重要的不是位置,而是前进的方向" 这次咱们学习表,没错是表.什么表?额,汉字真是博大精深,没错,只是个表.不要想歪了. 欢迎转载,转载请标明出处: 1.  定义 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表

数据结构学习系列之线性表(二)

前言 线性表链式存储结构的实现,通过这种方式实现的线性表,简称为链表,这是这篇文章的主题.与顺序存储相对应的是链式存储.链式存储逻辑结构相邻,物理结构可能相邻也有可能不相邻.链式结构的优点有:1.存储空间不限制(操作系统可支持的存储空间范围内):2.插入删除操作不需要移动元素等等.当然链式结构也有缺点,比如每个节点需要维护指向下一个节点的指针:比如需要查找某个节点时,需要从头节点开始查找,时间复杂度O(n)等等.总之,顺序存储以及链式存储各有优缺点,需要根据需求具体情况,选择合适的存储方式.没有

二 线性表

一. 线性表的几种形式: 1.线性表是最常用且最简单的一种数据结构. 线性表中元素的个数n定义为线程表的长度,n= 0时称为空表. 2. 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 这种顺序存储结构的线性表为顺序表. 线性表的特点: 优点是:可以随机存取的存储结构 缺点是:插入和删除时间复杂度高,主要耗费在移动元素上. 时间复杂度O(n).      数组 3.线性表的链式表示和实现  [字典,集合] 链式表是一组任意的存储单元存储线性表的数据元素(这组存储单元可以

数据结构学习系列之线性表(三)

前言数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来. 静态链表 用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟.这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题.每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表.规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点.当需要插入

数据结构学习系列之线性表(五)

前言 单向链表查找下一个元素很方便,要查找上一个元素时,需要从头开始向下遍历,很是麻烦.如何解决这个问题呢?使用双向链表结构可以解决这个问题. 双向链表 在单向链表的基础上,增加一个指向上一个节点的指针,这就形成了双向链表结构.因增加了一个指针域,故需要占用更多的内存空间,换就话说,用空间换时间.现在硬件越来越强,而价格越来越低,这种思想的应用案例越来越普遍. 代码实现 1 /** 2 * @desc 双向链表 3 * 4 * @date 2015/08/23 5 * @copyright by

两个线性表合并

数组方法(前提是两个顺序表都已排序,若未排序,则自己先排序再合并) #include<iostream> using namespace std; //创建顺序表 void create(int A[],int length){ for(int i=0;i<length;i++){ cin>>A[i]; } } //打印顺序表 void show(int A[],int length){ cout<<A[0]; for(int i=1;i<length;i+

EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点击浏览搜索EF安装,我这里主要是EF6.0 以上的学习 所以都安装6.0 以上的版本 接下来在Model文件夹下面创建一个Customer类 public class Customer { public int ID { get; set; } public string Name { get; set; }

2.2 将两个线性表合并成一个线性表,允许连表中有重复

#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 #define LISTSIZE 10 #define ADDSIZE 2 typedef struct { ElemType *elem; int length; int listsize; }SqList; Statu

数据结构学习系列之线性表(四)

前言 使用没有指针的语言模拟实现数据结构,会碰到一些莫名奇妙的问题 单向循环链表 之前学习的链表都是单向且最后一个节点指向空节点,如果最后一个节点指向头节点,这样就形成了一个环,名字叫单向循环列表,简称循环列表 源码(JS模拟实现) 包含了头指针以及尾指针的实现 /** * @desc 循环链表 * * @author WadeYu * @date 2015-08-15 * @copyright by WadeYu */ var Node = function(data){ this.data