课本:数据结构(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;
}
运行结果: