从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);
}
相关推荐
Fcy64829 分钟前
⽤哈希表封装unordered_map和unordered_set(C++模拟实现)
数据结构·c++·散列表
一分之二~1 小时前
二叉树--层序遍历(迭代和递归)
数据结构·c++·算法·leetcode
散峰而望3 小时前
【基础算法】高精度运算深度解析与优化
数据结构·c++·算法·链表·贪心算法·推荐算法
C雨后彩虹3 小时前
中文分词模拟器
java·数据结构·算法·华为·面试
Remember_9933 小时前
【LeetCode精选算法】二分查找专题二
java·数据结构·算法·leetcode·哈希算法
学嵌入式的小杨同学4 小时前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
2401_841495644 小时前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
苦藤新鸡4 小时前
28.两数相加,进位制
数据结构·算法·链表·力扣
无限进步_4 小时前
二叉搜索树(BST)详解:从原理到实现
开发语言·数据结构·c++·ide·后端·github·visual studio
wangjialelele5 小时前
二刷C语言后,一万字整理细碎知识点
c语言·开发语言·数据结构·c++·算法·cpp