从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);
}
相关推荐
wifi chicken6 小时前
数组遍历求值,行遍历和列遍历谁更快
c语言·数据结构·算法
qingyun9896 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
bubiyoushang8887 小时前
基于蚁群算法的直流电机PID参数整定 MATLAB 实现
数据结构·算法·matlab
永远睡不够的入8 小时前
直接插入排序、希尔排序、选择排序
数据结构·算法·排序算法
历程里程碑8 小时前
hot 206
java·开发语言·数据结构·c++·python·算法·排序算法
LYFlied10 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
永远睡不够的入11 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems952711 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo11 小时前
leetcode 3074
数据结构·算法·leetcode
风筝在晴天搁浅12 小时前
hot100 234.回文链表
数据结构·链表