从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);
}
相关推荐
MQLYES10 分钟前
03-BTC-数据结构
数据结构·算法·哈希算法
无限进步_20 分钟前
【数据结构&C语言】对称二叉树的递归之美:镜像世界的探索
c语言·开发语言·数据结构·c++·算法·github·visual studio
不会c嘎嘎1 小时前
C++ 进阶:从理论到手撕 Unordered 系列容器(哈希表)
数据结构·哈希算法·散列表
nice_lcj5202 小时前
数据结构之堆:从概念到应用全解析(附TOP-K经典问题)
java·数据结构·算法
漫随流水2 小时前
leetcode算法(429.N叉树的层序遍历)
数据结构·算法·leetcode·二叉树
漫随流水2 小时前
leetcode算法(116.填充每个节点的下一个右侧节点指针)
数据结构·算法·leetcode·二叉树
橘颂TA3 小时前
【剑斩OFFER】算法的暴力美学——力扣 844 题:比较含退格的字符串
数据结构·c++·算法·力扣·结构与算法
自然数e3 小时前
c++多线程【多线程常见使用以及几个多线程数据结构实现】
数据结构·c++·算法·多线程
黛色正浓3 小时前
leetCode-热题100-普通数组合集(JavaScript)
java·数据结构·算法
辞砚技术录4 小时前
MySQL面试题——索引、B+树
数据结构·数据库·b树·面试