数据结构(C语言版)——第二章线性表

Introduction

这个是关于线性表的顺序表以及线性表的链式表的代码,其中包括增删查改,查找线性表的前驱和后继的功能,并对代码做了一定的注释(PS:小白一个,想做个blog来记录自己学习数据结构的过程)

状态文件声明

头文件

//Status.h
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
using namespace std;
typedef int Status;

顺序表

头文件

//Mylist.h
#include<iostream>
#include"Status.h"
#define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
#define LISTINCREMENT 10  //线性表存储空间的分配增量
using namespace std;
typedef int ElemType;
typedef struct
{
	ElemType* elem;//存储空间基址
	int length, listsize;//length:当前长度 listsize:当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

Status InitList_Sq(SqList& L)//构造一个空的线性表L
{
	L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (!L.elem)
	{
		cout << "分配存储空间失败" << endl;
		exit(OVERFLOW);//存储分配失败退出函数
	}
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return 1;
}

Status ListInsert_Sq(SqList& L, int i, ElemType e)//插入元素
{
	ElemType* newbase, * q, * p;
	if (i < 0 || i > L.length + 1)//判断i值是否合法
	{
		cout << "insert failure" << endl;
		return ERROR;
	}
	if (L.length >= L.listsize)//判断存储空间是否满了,满了增加分配
	{
		newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if (!newbase)
		{
			cout << "分配存储空间失败" << endl;
			exit(OVERFLOW);
		}
		L.elem = newbase;
		L.listsize += LISTINCREMENT;//增加存储容量
	}
	q = &(L.elem[i]);//q为插入位置
	for (p = &(L.elem[L.length - 1]); p >= q; --p)
	{
		*(p + 1) = *p;//插入位置之后的元素右移
	}
	*q = e;//插入e
	L.length++;//表长增加1
	cout << "insert successfully" << endl;
	return OK;
}

Status ListDelete_Sq(SqList& L, int i, ElemType& e)//在顺序表中删除第i个元素,并返回删除的元素位置的值
{
	ElemType* p, * q;
	if ((i < 0) || (i > L.length))//判断i值是否合法
	{
		cout << "delete failure" << endl;
		return ERROR;
	}
	p = &(L.elem[i - 1]);//记录删除的位置
	e = *p;//将删除的元素赋值给e
	q = L.elem + L.length - 1;//表尾元素的位置
	for (++p; p <= q; ++p)
	{
		*(p - 1) = *p;//被删除元素之后的元素左移
	}
	L.length--;//数组长度减一
	cout << "delete successfully" << endl;
	return OK;
}

void ClearList_Sq(SqList& L)//将表的长度变为0
{
	L.length = 0;
}

void DestroyList_Sq(SqList& L)//销毁表
{
	L.elem = NULL;
	L.length = 0;
	L.listsize = 0;
}

Status GetElem(SqList L, int i, ElemType& e)//查找元素所在的位置
{
	ElemType* p;
	if ((i < 0) || (i > L.length))
	{
		cout << "search failure" << endl;
		return ERROR;
	}
	else
	{
		p = &(L.elem[i - 1]);
		e = *p;
	}
	cout << "search successfully" << endl;
	return OK;
}

void ListEmpty(SqList L)//判断表是否为
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值