数据结构学习二:顺序表算法2.7改写

课本:数据结构(c语言)严蔚敏

顺序表实现算法结合及代码分析:

头文件:

//init.h 预定义常量和类型
#ifndef _INIT_H
#define _INIT_H

#include <iostream>

#define TRUE 1
#define FALLSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status;//类型定义

#endif
//sequence.h 
#ifndef _SEQUENCE_H

#define LISTSIZE 100 
//注意:Item暂时只能定义为基本类型,因为在实现的时候没有molloc(sizeof(Item)),可以自行改变item的大小
#define LISTINCEREMENT 10//线性表存储空间的分配增量
typedef int Elemtype;  //定义类型
typedef struct  
{
    Elemtype *elem;//存储基址
	int length;//当前长度
	int listsize;//当前分配的存储容量 (以size(ElemType)为单位)
	Elemtype data[100];
}SqList;

Status init_sqlist(SqList &L);//构造一个空表
Status insert_list(SqList &L,int i,Elemtype e);//插入元素e到顺序列表的第i个位置
Status delete_list(SqList &L,int i,Elemtype &e);//删除第i个元素并返回给e;
Status display_list(SqList);//显示顺序表
Status merge_list(SqList La,SqList Lb,SqList &Lc);//合并两个顺序列表


#endif 

操作:


#include "init.h"
#include "Sequence.h"
#include <iostream>
using namespace std;

Status init_sqlist(SqList &L)//构造空表L
{
	L.elem=(Elemtype *)malloc(LISTSIZE*sizeof(Elemtype));
	if (!L.elem)
	{
		exit(OVERFLOW);//内存分配失败
	}
	L.length=0;
	L.listsize=LISTSIZE;//初始存储量
	return OK;
}
//基本操作ListInsert(&L,i,e);
//初始条件:线性表L已经存在,1≤i≤ListLength(L)+1;
//操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1;
Status insert_list(SqList &L,int i,Elemtype e)//插入e元素到第i位
{
	if (i<1||i>L.length+1)
	{
		return ERROR;//i值不合法
	}
	if (L.length>=L.listsize)//超出原有的存储容量,需要重新分配
	{
	    Elemtype *newbase;
		newbase=(Elemtype *)realloc(L.elem,(L.listsize+LISTINCEREMENT)*sizeof(Elemtype));
		if (!newbase)
		{
			exit(OVERFLOW);
		}
		L.elem=newbase;//新基址
		L.listsize +=LISTINCEREMENT;//增加的存储容量
	}
    Elemtype *q,*p;
	q=&L.elem[i-1];//q为插入位置
	for (p=&L.elem[L.length-1];p>=q;--p)
	{
		*(p+1)=*p;
	}//插入位置及之后元素的位置右移
	*q=e;//插入e
	++L.length;//表长增加1
	return OK;
}
//基本操作:ListDelete(&L,i,&e);
//初始条件:线性表L已经存在且非空,1≤i≤ListLength(L);
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1;
Status delete_list(SqList &L,int i,Elemtype &e)//在顺序表中删除第i个元素,返回e值
{
	if (i<1||i>L.length)
	{
		return ERROR;
	}
	Elemtype *p,*q;
	p=&L.elem[i-1];//p为被删除的元素的位置
	e=*p;//被删除的元素赋值给e
	q=L.elem+L.length-1;//表尾元素的位置
	for (++p;p<=q;++p)                                                                                                  
	{
		*(p-1)=*p;
	}//删元素后元素左移
	--L.length;//表长减一
	return OK;
}

Status display_list(SqList L)
{
	cout<<"顺序表中的元素:";
	for (int i=0;i<L.length;i++)
	{
		cout<<L.elem[i]<<endl;
	}
	cout<<endl;
	return OK;
}
//已知顺序线性表La和Lb的元素按值非递减排列;
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列;
Status merge_list(SqList La,SqList Lb,SqList &Lc)//合并两个列表
{
	Elemtype *pa,*pb,*pc;
	pa=La.elem;
	pb=Lb.elem;
	init_sqlist(Lc);
	Lc.listsize=Lc.length=La.length+Lb.length;
	Lc.elem=(Elemtype*)malloc(Lc.listsize*sizeof(Elemtype));
	pc=Lc.elem;
	if (!Lc.elem)exit(OVERFLOW);//存储分配失败
	while (pa<La.elem+La.length&&pb<Lb.elem+Lb.length)//归并
	{
		if(*pa<*pb)
		{
		*pc++ =*pa++;
		}
		else
		*pc++=*pb++;
	}

	while (pa<=La.elem+La.length-1) *(pc++)=*(pa++);//插入la剩余的元素
	while (pb<=Lb.elem+Lb.length-1) *(pc++)=*(pb++);//插入lb剩余的元素 
 	return OK;
}


main.cpp

#include "init.h"
#include "Sequence.h"
#include <iostream>
using namespace std;
void test_sequence()
{
	SqList L;
	init_sqlist(L);
	insert_list(L,1,1);
	insert_list(L,2,3);	
	insert_list(L,3,5);
	insert_list(L,4,7);
	display_list(L);

	Elemtype e;
	delete_list(L,4,e);
	cout<<"被删除的元素为: "<<e<<endl;
	cout<<"删除元素后";
	display_list(L);
	

	SqList La, Lb, Lc;
	init_sqlist(La);
	insert_list(La,1,1);
	insert_list(La,2,2);
	insert_list(La,3,3);
	insert_list(La,4,4);

	init_sqlist(Lb);
	insert_list(Lb,1,1);
	insert_list(Lb,2,2);
	insert_list(Lb,3,3);
	insert_list(Lb,4,4);
	insert_list(Lb,5,5);
	insert_list(Lb,6,6);
	insert_list(Lb,7,7);

	merge_list(La,Lb,Lc);
	cout<<"合并后,";
	display_list(Lc);

}

int main()
{
	
	test_sequence();
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
算法2.7改写:“开关语句”代替“条件语句”
运用了一个compare()函数比较La和Lb中对应元素的大小。

Status compare(Elemtype *pa,Elemtype *pb)
{
	int i;
	if(*pa<*pb)
		i=1;
	else if(*pa==*pb)
		i=0;
	else 
		i=-1;
	return i;
}

将marge_list操作中的if条件语句替换成switch语句:

switch (compare(pa,pb))
		{
		case  0: 
			   *pc++=*pb++;
			   *pc++=*pa++;
			   break;
		case  1:
			  *pc++=*pa++;
			  break;
		case  -1:
			  *pc++=*pb++;
			  break;
		}

运行结果:

在这里插入图片描述

今天的分享就到这里。欢迎大家来指教和一起学习,我是爱吃肉的yyyloki,如果你觉得不错的话,那就给我点个👍吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值