从0开始的数据结构的书写-------线性表(顺序表)

(复习考研的休息区,心血来潮,写点代码)

三个规则:

1、不使用c++ stl库进行书写

2、最好基于严蔚敏老师的数据结构

3、最好使用malloc和realloc动态分配内存

(如果有问题,请大家看看)

cpp 复制代码
// 线性表的顺序存储 
// 不使用stl 
#include<iostream>
#include<cstring>

using namespace std;

#define LIST_INIT_SIZE  100 // 线性表的初始空间
#define LISTINCREMENT 10 // 分配增量 
#define OK true
#define ERROR false 
#define ERRORINT 0x3f3f3f3f3f

typedef struct
{
	int *elem; // 顺序表的基址 
	int len; // 当前长度 
	int listsize; // 当前分配的存储容量
}SqList;

bool InitList_Sq(SqList &L)
{
	// L.elem = new int[LIST_INIT_SIZE];
	L.elem = (int *)malloc(sizeof(int) * LIST_INIT_SIZE);
	if(!L.elem) exit(0); // 分配失败 
	L.len = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

bool ClearList(SqList &L)
{
	if(!L.elem) return ERROR;
	printf("已被清空\n");
	if(L.len == 0) return OK;
	for(int i = 0;i < L.len;i ++)
		L.elem[i] = 0; // 清零
	L.len = 0; 
	return OK;
}

bool ListEmpty(SqList L)
{
	if(!L.elem) exit(0);
	if(L.len == 0) return OK;
	return ERROR;
}

int ListLength(SqList L)
{
	if(!L.elem) exit(0);
	return L.len;
}

// 注意:线性表编号一定是从1~n 
int GetElem(SqList L , int idx)
{
	if(idx < 1 || idx > L.len) return ERRORINT;
	return L.elem[idx - 1];
}

/* 
'>'找到第一个大于e的值的位序 
'<'找到第一个小于e的值的位序 
'='找到第一个等于e的值的位序 
*/
int LocateElem(SqList L , int e , char ch)
{
	if(!L.elem) exit(0);
	if(ch == '=')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] == e) return i + 1;
	}
	else if(ch == '>')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] > e) return i + 1;
	}
	else if(ch == '<')
	{
		for(int i = 0;i < L.len;i ++)
			if(L.elem[i] < e) return i + 1;
	}
	return 0; // 没有找到 
}

bool ListInsert(SqList &L , int idx , int e)
{
	if(idx < 1 || idx > L.len + 1) return ERROR;
	if(L.len >= L.listsize) // 增加分配 
	{
		cout << "该表重新分配内存\n";
		L.elem = (int *)realloc(L.elem , sizeof(int) * (L.listsize + LISTINCREMENT));
		L.listsize += LISTINCREMENT;
	}
	
	for(int i = L.len - 1;i >= idx - 1;i --)
		L.elem[i + 1] = L.elem[i];
	printf("插入数据%d\n" , e);	
	L.elem[idx - 1] = e;
	L.len ++;
	return OK;
}

int ListDelete(SqList &L , int idx)
{
	if(idx < 1 || idx > L.len) return ERRORINT;
	int e = L.elem[idx - 1];
	printf("删除数据%d\n" , e);
	for(int i = idx - 1;i < L.len;i ++)
		L.elem[i] = L.elem[i + 1];
	L.len --;
	return e;
}

void ListPrint(SqList L)
{
	if(!L.elem) exit(0);
	cout << "当前顺序表是:"; 
	for(int i = 0;i < L.len;i ++)
		cout << L.elem[i] << " ";
	cout << "\n";
	return ;
}

int main()
{
	SqList L;
	InitList_Sq(L);
	for(int i = 10;i >= 1;i --) // 正向插入数据1~10 
		ListInsert(L , 1 , i);
	ListPrint(L);
	
	ListDelete(L , 1);
	ListDelete(L , 3);
	
	ListPrint(L);
}
相关推荐
Sheep Shaun12 分钟前
STL中的unordered_map和unordered_set:哈希表的快速通道
开发语言·数据结构·c++·散列表
optimistic_chen24 分钟前
【Redis 系列】常用数据结构---String类型
数据结构·数据库·redis·缓存·string
wen__xvn35 分钟前
代码随想录算法训练营DAY1第一章 数组part01
数据结构·算法·leetcode
爱编码的傅同学40 分钟前
【程序地址空间】页表的映射方式
c语言·数据结构·c++·算法
Mintopia42 分钟前
🧠 从零开始:纯手写一个支持流式 JSON 解析的 React Renderer
前端·数据结构·react.js
造夢先森1 小时前
常见数据结构及算法
数据结构·算法·leetcode·贪心算法·动态规划
良木生香2 小时前
【数据结构-初阶】二叉树---链式存储
c语言·数据结构·c++·算法·蓝桥杯·深度优先
长安er11 小时前
LeetCode215/347/295 堆相关理论与题目
java·数据结构·算法·leetcode·
粉红色回忆11 小时前
用链表实现了简单版本的malloc/free函数
数据结构·c++
予枫的编程笔记13 小时前
Redis 核心数据结构深度解密:从基础命令到源码架构
java·数据结构·数据库·redis·缓存·架构