对严蔚敏C语言版《数据结构》中伪代码的补全

前言

大家好,我是极速脆皮猫。鉴于严蔚敏的数据结构(C语言版)中大部分代码存在伪代码的情况,笔者将对其进行补全和完善,以便于学习或研究数据结构的你们能更加准确地掌握其中的奥妙。

第二章 线性表

2.1 线性表的类型定义

算法2.1

问题描述:已知线性表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)

题解(Solution):

#include<stdio.h>
#include<stdlib.h>//内存分配函数所需库

#define MAXSIZE 20  //线性表存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识

typedef int Status;//函数返回值类型
typedef int ElemType;//顺序表元素类型

这是对代码主要部分的准备。



//顺序表的结构 
typedef struct{
	ElemType *elem;//数据
	int len;//顺序表长度
}List; 

这是顺序表的基本结构。



//构造一个空的线性表L
Status InitList(List* L){
    L -> elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    if(!L -> elem){
        return ERROR;
    }
    L -> len = 0;
    return OK;
}

构造函数。



/*
插入操作
初始条件:顺序表L已存在
操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1
*/
Status ListInsert(List *L, int i, ElemType e){
    int k;
    if (L->len == MAXSIZE){  //线性表已满
        return ERROR;
    }   
    if (i < 1 || i > L->len+1){ //当i不在范围内时
        return ERROR;
    }
    if (i <= L->len){  //若插入位置不在表尾
        for(k = L->len-1;k >= i-1;k--){
            L->elem[k+1] = L->elem[k];
        }
    }   
    L->elem[i-1] = e;   //将新元素插入
    L->len++;    //长度加1
    return OK;
}

插入函数



/*
获取元素操作
初始条件:顺序表L已存在
操作结果:用e返回L中第i个数据元素的值
*/
Status GetElem(List L, int i, ElemType *e){
    if(L.len == 0 || i<1 || i>L.len){
        return ERROR;
    }
    *e = L.elem[i-1];
    return OK;
}

获取指定位置的函数。



Status ListLength(List L){
	return L.len;
}

获取顺序表的长度



/*打印线性表中的所有元素*/
void OutPut(List L){
    printf("当前顺序表的长度:%d\n", L.len);
    for(int i = 0; i < L.len; i++){
        printf("%d ",L.elem[i]);
    }
    printf("\n");
}

打印顺序表的长度和所有元素



核心代码:

void MergeList(List La,List Lb,List &Lc){
	//已知线性表La和Lb中的数据元素按非递减排列。
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按非递减排列。 
	int i,j,k,ai,bj;
	 i=j=1;k=0;
	 La.len=ListLength(La);Lb.len=ListLength(Lb);
	 while((i<=La.len)&&(j<=Lb.len)){
	 	GetElem(La,i,&ai);GetElem(Lb,j,&bj);
	 	if(ai<=bj) ListInsert(&Lc,++k,++i);
	 	else{
	 		ListInsert(&Lc,++k,bj);
	 		++j;
		 } 
	 }
	 while(i<=La.len){
	 	GetElem(La,i++,&ai);
	 	ListInsert(&Lc,++k,ai);
	 }
	 while(i<=Lb.len){
	 	GetElem(Lb,i++,&bj);
	 	ListInsert(&Lc,++k,bj);
	 }
}

这就是这个算法的核心代码。


完整代码:

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 20  //线性表存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识

typedef int Status;

typedef int ElemType;

//顺序表的结构 
typedef struct{
	ElemType *elem;
	int len;
}List; 

//构造一个空的线性表L
Status InitList(List* L){
    L -> elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    if(!L -> elem){
        return ERROR;
    }
    L -> len = 0;
    return OK;
}
/*
插入操作
初始条件:顺序表L已存在
操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1
*/
Status ListInsert(List *L, int i, ElemType e){
    int k;
    if (L->len == MAXSIZE){  //线性表已满
        return ERROR;
    }   
    if (i < 1 || i > L->len+1){ //当i不在范围内时
        return ERROR;
    }
    if (i <= L->len){  //若插入位置不在表尾
        for(k = L->len-1;k >= i-1;k--){
            L->elem[k+1] = L->elem[k];
        }
    }   
    L->elem[i-1] = e;   //将新元素插入
    L->len++;    //长度加1
    return OK;
}

/*打印线性表中的所有元素*/
void OutPut(List L){
    printf("当前顺序表的长度:%d\n", L.len);
    for(int i = 0; i < L.len; i++){
        printf("%d ",L.elem[i]);
    }
    printf("\n");
}

/*
获取元素操作
初始条件:顺序表L已存在
操作结果:用e返回L中第i个数据元素的值
*/
Status GetElem(List L, int i, ElemType *e){
    if(L.len == 0 || i<1 || i>L.len){
        return ERROR;
    }
    *e = L.elem[i-1];
    return OK;
}

Status ListLength(List L){
	return L.len;
}


void MergeList(List La,List Lb,List &Lc){
	//已知线性表La和Lb中的数据元素按非递减排列。
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按非递减排列。 
	int i,j,k,ai,bj;
	 i=j=1;k=0;
	 La.len=ListLength(La);Lb.len=ListLength(Lb);
	 while((i<=La.len)&&(j<=Lb.len)){
	 	GetElem(La,i,&ai);GetElem(Lb,j,&bj);
	 	if(ai<=bj) ListInsert(&Lc,++k,++i);
	 	else{
	 		ListInsert(&Lc,++k,bj);
	 		++j;
		 } 
	 }
	 while(i<=La.len){
	 	GetElem(La,i++,&ai);
	 	ListInsert(&Lc,++k,ai);
	 }
	 while(i<=Lb.len){
	 	GetElem(Lb,i++,&bj);
	 	ListInsert(&Lc,++k,bj);
	 }
}


int main(){
	List La,Lb,Lc;
	InitList(&La);
	InitList(&Lb);
	InitList(&Lc);
	ListInsert(&La,1,3);
	ListInsert(&La,2,5);
	ListInsert(&La,3,8);
	ListInsert(&La,4,11);
	ListInsert(&Lb,1,2);
	ListInsert(&Lb,2,6);
	ListInsert(&Lb,3,8);
	ListInsert(&Lb,4,9);
	ListInsert(&Lb,5,11);
	ListInsert(&Lb,6,15);
	ListInsert(&Lb,7,20);
	
	MergeList(La,Lb,Lc);
	
	OutPut(La);
	OutPut(Lb);
	OutPut(Lc);
}


运行结果:
在这里插入图片描述

  • 41
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极速脆皮猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值