文档章节

201SqList

把南墙撞开
 把南墙撞开
发布于 2016/05/06 23:51
字数 696
阅读 79
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

注意:要严格按照后缀名新建文件。

如果按.h创建文件,后来简单重命名为.cpp文件,编译会出错。

顺序表的实现 包含4个文件:

    c1.h 是预处理指令;

    c2-1.h 是SqList的数据结构;

    bo2-1.cpp 是SqList的基本操作函数(basic operations 缩写为 bo);

    main2-1.cpp 是测试函数。

//c1.h
#include<iostream>
#include<process.h>
#include<malloc.h>

#define OK 1
#define ERROR 0
#define INFEASIBLE -1

typedef int Status;
//c2-1.h
#ifndef C2_1_H
#define C2_1_H

typedef int ElemType;
#define INIT_SIZE 10
#define INCREMENT 2
struct SqList
{
	ElemType *elem;
	int length;
	int listsize;
};

void InitList(SqList &L);
int ListLength(SqList L);
Status ListEmpty(SqList L);
void ListTraverse(SqList L);
Status ListInsert(SqList &L, int index, ElemType e);
Status ListDelete(SqList &L, int index, ElemType &e);
void ClearList(SqList &L);
Status GetElem(SqList L, int index, ElemType &e);
int LocateElem(SqList L, ElemType e);
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e);
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e);
void DestroyList(SqList &L);

#endif
//bo2-1.cpp
#include "c1.h"
#include "c2-1.h"
using namespace std;

void InitList(SqList &L)
{
	if (!(L.elem = (ElemType *)malloc(INIT_SIZE*sizeof(ElemType))))
		exit(OVERFLOW);
	L.length = 0;
	L.listsize = INIT_SIZE;
}

int ListLength(SqList L)
{
	return L.length;
}

Status ListEmpty(SqList L)
{
	if (L.length == 0)
		return OK;
	else
		return ERROR;
}

void ListTraverse(SqList L)
{
	for (int i = 0; i < L.length; i++)
	{
		if (i % 10 == 0 && i != 0)
			cout << endl;
		cout << L.elem[i] << "   ";
	}
	cout << endl;
}

Status ListInsert(SqList &L, int index, ElemType e)
{
	
	if (index >= 1 && index <= L.length + 1)
	{
		if (L.listsize == L.length)
		{
			if (!(L.elem = (ElemType *)realloc(L.elem, (L.length + INCREMENT)*sizeof(ElemType))))
				exit(OVERFLOW);
			L.listsize = L.length + INCREMENT;
		}
		
		//insert by index
		/*
		if (index == L.length + 1)
		{
			L.elem[index - 1] = e;
		}
		else
		{
			for (int i = L.length - 1; i >= index - 1; i--)
			{
				L.elem[i + 1] = L.elem[i];
			}
			L.elem[index - 1] = e;
		}
		*/

		//insert by pointer
		ElemType *p, *q;
		p = L.elem + index - 1;
		for (q = L.elem + L.length - 1; q >= p; q--)
			*(q + 1) = *q;
		*p = e;		
		L.length++;
		return OK;
	}
	else
		return ERROR;
}

Status ListDelete(SqList &L, int index, ElemType &e)
{
	if (index >= 1 && index <= L.length)
	{
		ElemType *p, *q;
		p = L.elem + index - 1;
		e = *p;
		q = L.elem + L.length - 1;
		while (p < q)
		{
			*p = *(p + 1);
			p++;
		}	
		L.length--;
		return OK;
	}
	else
		return ERROR;
}

void ClearList(SqList &L)
{
	L.length = 0;
}

Status GetElem(SqList L, int index, ElemType &e)
{
	if (index < 1 || index > L.length)
		return ERROR;
	e = *(L.elem + index - 1);
	return OK;
}

int LocateElem(SqList L, ElemType e)
{
	if (L.length == 0)
		return 0;
	else
	{
		for (int i = 0; i < L.length; i++)
		{
			if (e == *(L.elem + i))
				return i + 1;
		}
		return 0;
	}	
}

Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)
{
	int location = LocateElem(L, cur_e);
	if (location == -1 || location == 1)
		return ERROR;
	pre_e = *(L.elem + location - 2);
	return OK;
}

Status NextElem(SqList L, ElemType cur_e, ElemType &next_e)
{
	int location = LocateElem(L, cur_e);
	if (location == -1 || location == L.length)
		return ERROR;
	next_e = *(L.elem + location);
	return OK;
}

void DestroyList(SqList &L)
{
	free(L.elem);
	L.elem = nullptr;
	L.length = 0;
	L.listsize = 0;
}
//main2-1.cpp
#include "c1.h"
#include "c2-1.h"
using namespace std;
int main()
{
	SqList L;
	InitList(L);

	cout << "ListLength: " << ListLength(L) << endl;

	cout << "ListEmpty: " << ListEmpty(L) << endl;

	for (int i = 1; i <= 100; i++)
		ListInsert(L, i, i);
	cout << "ListLength: " << ListLength(L) << endl;
	ListTraverse(L);

	ElemType e;
	ListDelete(L, 1, e);
	cout << "ListLength: " << ListLength(L) << endl;
	ListTraverse(L);
	cout << "deleted element: " << e << endl;

	GetElem(L, 33, e);
	cout << "GetElem: " << e << endl;

	cout << "LocateElem: " << LocateElem(L, 2) << endl;

	PriorElem(L, 67, e);
	cout << "PriorElem: " << e << endl;

	NextElem(L, 67, e);
	cout << "NextElem: " << e << endl;

	ClearList(L);
	ListTraverse(L);
	cout << "ListLength: " << ListLength(L) << endl;

	DestroyList(L);
	cout << "ListLength: " << ListLength(L) << endl;
	cout << "ListSize: " << L.listsize << endl;

	cin.get();
	return 0;
}


上一篇: 204LinkList
下一篇: 203MergeList
把南墙撞开
粉丝 0
博文 73
码字总数 21068
作品 0
昌平
私信 提问
加载中
请先登录后再评论。
203MergeList

注意:要严格按照后缀名新建文件。 如果按.h创建文件,后来简单重命名为.cpp文件,编译会出错。 顺序表的实现 包含4个文件: c1.h 是预处理指令;//代码与博客201SqList中的相同 c2-1.h 是S...

把南墙撞开
2016/05/06
51
0
202Union

注意:要严格按照后缀名新建文件。 如果按.h创建文件,后来简单重命名为.cpp文件,编译会出错。 顺序表的实现 包含4个文件: c1.h 是预处理指令;//代码与博客201SqList中的相同 c2-1.h 是S...

把南墙撞开
2016/05/06
6
0

没有更多内容

加载失败,请刷新页面

加载更多

没有更多内容

功能之前,感叹号有什么作用? - What does the exclamation mark do before the function?

问题: !function () {}(); 解决方案: 参考一: https://stackoom.com/question/Fl0I/功能之前-感叹号有什么作用 参考二: https://oldbug.net/q/Fl0I/What-does-the-exclamation-mark-do-......

富含淀粉
26分钟前
3
0
微服务分布式构架开发实战 附下载地址

微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完...

Idea
42分钟前
6
0
AppEmit v0.9.5 新功能 chrome 浏览器调用本地应用程序 支持打开 编辑 金山 wps office,  excel  ppt

AppEmit v0.9.5 新功能 浏览器调用本地应用程序 支持打开 编辑 金山 office 更多主页 能在以及几乎所有支持websock浏览器,包括chrome各个版本,支持打开 编辑 金山 wps office, excel ppt ...

AppEmit
45分钟前
5
0
Git(学习二)----->Tortoise Git(图形化工具) 安装

下载: 本人使用版本为2.4.0.2有需要的可以从网盘下载,也可以百度找资源 链接:https://pan.baidu.com/s/13Vu0VNUQMZNFKLFhl6VzDw 提取码:y27p 一、安装 步骤1:安装向导 步骤2:许可介绍 步...

安然_oschina
48分钟前
7
0
TarsGo 服务获取自定义模版(配置)值

作者:amc 导语:之前的文章中我们介绍了如何使用TarsGo创建HTTP服务和TARS RPC服务,本篇文章中,我们将介绍如何在TarsGo服务中获得自定义模板的配置值。 TARS 模版是什么? TARS 框架中,有...

TARS基金会
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部