• 线性表的合并


    1.扩大线性表LA,将存在于线性表中LB而不存在在于LA中的数据元素插入到线性表LA中去。

    思路:

      A:从线性表LB中依次取得每个数据元素

      B:将值在线性表中进行查询,若不存在,则插入之。

    #include <stdlib.h>
    #include <stdio.h>
    
    #define LIST_INIT_SIZE 10
    #define LIST_INCREMENT 2
    
    /*函数结果状态代码*/
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    
    
    typedef int ElemType;
    typedef int Status;
    
    //线性表动态分配顺序存储结构
    //C语言可动态分配的一维数组
    typedef struct {
    	ElemType *elem;	//存储空间基址
    	int length;		//当前长度
    	int listsize;	//当前分配的存储量
    } SqList ;
    
    /* 操作结果:构造一个空的顺序线性表L */
    void InitList(SqList *L){
    	(*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    	if (!(*L).elem) exit(OVERFLOW);
    	(*L).length = 0;				//空表长度为0
    	(*L).listsize = LIST_INIT_SIZE;	//初始容量
    
    }
    
    
    
    /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
    int ListLength(SqList L){
    	return L.length;
    }
    
    /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值 */
    Status GetElem(SqList L, int i, ElemType *e){
    	if (i<1 || i>L.length) return ERROR;
    	*e = *(L.elem + i - 1);
    	return OK;
    }
    
    /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
    /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
    /*           若这样的数据元素不存在,则返回值为0。*/
    int  LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)){
    	ElemType *p; 
    	int i = 1;	//第一个元素的位置
    	p = L.elem;
    	while (i <= L.length && !compare(*p++, e)) i++;
    	if (i <= L.length) return i;
    	else return 0;
    }
    
    
    /* 判断是否相等的函数 */
    Status equal(ElemType c1, ElemType c2){
    	if (c1 == c2) return TRUE;
    	else return FALSE;
    }
    
    
    /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
    /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
    Status ListInsert(SqList *L, int i, ElemType e){
    	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 (!newbase) exit(OVERFLOW);			// 存储分配失败 
    		(*L).elem = newbase; //新基址
    		(*L).listsize += LIST_INCREMENT;	//增加存储容量
    	}
    
    	q = (*L).elem + i - 1;	//插入的位置
    	for (p = (*L).elem + (*L).length - 1; p >= q; --p)  //将插入位置及之后的元素右移 
    		*(p + 1) = *p;
    	*q = e;
    	++(*L).length;
    	return OK;
    	
    }
    
    
    void print1(ElemType * c){
    	printf("%d", *c);
    }
    
    /* 初始条件:顺序线性表L已存在 */
    /* 操作结果:依次对L的每个数据元素调用函数vi() */
    /*           vi()的形参加'&',表明可通过调用vi()改变元素的值 */
    void ListTraverse(SqList L, void(* vi)(ElemType *)){
    	ElemType *p;
    	int i;
    	p = L.elem;
    	for (i = 1; i <= L.length; i++){
    		vi(p++);
    		printf("
    ");
    	}
    }
    
    
    /*将所有在线性表Lb中但不在La中的数据元素插入到La中*/
    void Union(SqList *La, SqList Lb){
    	ElemType e;
    	int La_len, Lb_len;
    	int i;
    
    	La_len = ListLength(*La);
    	Lb_len = ListLength(Lb);
    
    	for (i = 1; i <= Lb_len; i++){
    		GetElem(Lb, i, &e);
    		if (!LocateElem(*La, e, equal)){//La中不存在和e相同的元素,则插入之 
    			ListInsert(La, ++La_len, e);		
    		}
    	}
    }
    
    //测试代码
    void main(){
    	SqList La, Lb;
    	int j;
    	InitList(&La);	//创建空表La。如不成功,则会退出程序的运行 
    	for (j = 1; j <= 5; j++)
    		ListInsert(&La, j,j);
    	printf("La=");
    	ListTraverse(La, print1);
    
    	InitList(&Lb);
    	for (j = 1; j <= 5; j++)
    		ListInsert(&Lb, j, 2*j);
    	printf("Lb=");
    	ListTraverse(Lb, print1);
    	Union(&La, Lb);
    	printf("new La=");
    	ListTraverse(La, print1);
    
    	system("PAUSE");
    
    
    }
    
  • 相关阅读:
    python__基础 : 类属性,类方法,静态方法
    python__基础 : 类的继承,调用父类的属性和方法
    python__基础 : 类的__init__,__str__,__del__方法
    Python__关于列表的引用 以append操作为例
    HTML5 Canvas 绘制图片不显示的问题
    MySQL 查询排除指定字段、自定义变量、动态执行SQL
    .Net系列 Transaction 事务
    Redis 基本操作
    C# 数值计算、转换
    详解.NET IL代码
  • 原文地址:https://www.cnblogs.com/super90/p/4975834.html
Copyright © 2020-2023  润新知