Fork me on GitHub
~~~~~~~~~小喵喵已自动为您屏蔽了广告哦~~~~~~~~~

数据结构--顺序表和单链表c++

顺序表

#include <iostream>
using namespace std;

constexpr auto MAXSIZE = 100;
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;

//顺序表的存储结构
typedef struct
{
	ElemType* elem;
	int length;
}SqList;

//构造一个空的顺序表
int InitList(SqList &L)
{
	//申请MAXSIZE个ElemType型变量空间,整型指针L.elem指向该地址空间开始处
	L.elem = new ElemType[MAXSIZE];
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK;
}

//取值--通过e返回第i个元素的传值
int GetElem(SqList L, int i, ElemType& e)
{
	if (i<1 || i>L.length) return ERROR;	//判断i值是否合理
	e = L.elem[i - 1];	//elem[i-1]单元存储第i个数据元素
	return OK;
}
//查找--在顺序表L中查找值为e的数据元素,返回其序号
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e) return i + 1;	//查找成功,返回序号i+1
	}
	return 0;	//查找失败,返回0
}
//插入--在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
int ListInsert(SqList& L, int i, ElemType e)
{
	if ((i < 1) || (i > L.length + 1)) return ERROR;	//i值不合法
	if (L.length == MAXSIZE) return ERROR;	//当前存储空间已满
	for (int j = L.length - 1; j >= i; j--)
		L.elem[j + 1] = L.elem[j];
	L.elem[i - 1] = e;
	++L.length;
	return OK;
}
//删除--在顺序表删除第i个元素,i值的合法范围是1<=i<=i.length
int ListDelete(SqList& L, int i)
{
	if ((i < 1) || (i > L.length)) return ERROR;
	for (int j = 0; j <= L.length - 1; j++)
		L.elem[j - 1] = L.elem[j];
	--L.length;
	return OK;
}


int main()
{
	SqList L;
	ElemType e;
	int i;
	//顺序表的初始化方法测试
	if (InitList(L) == 1) 
	{
		cout << "顺序表初始化成功" << endl;
		cout << "当前顺序表长度: " << L.length << endl;
	}
	//为方便测试其他方法,将顺序表L初始化赋值一些数据
	int num[] = { 12,13,21,24,28,30,42,77 };
	for (int n = 0; n < sizeof(num) / sizeof(num[0]); n++)
	{
		L.elem[n] = num[n];
		L.length++;
	}
	cout << "赋值完成,当前顺序表长度: " << L.length << endl;
	//测试顺序表的取值--返回第3个元素的值到e
	if (GetElem(L, 3, e)) cout << "第3个元素的值是: " << e << endl;
	//测试顺序表的查找--查找元素24的位置并返回
	if (int index = LocateElem(L, 24)) { cout << "24的序号是: " << index << endl; }
	else cout << "元素查找失败!" << endl;
	//测试顺序表的插入--在第5个位置插入25
	if (ListInsert(L, 5, 25)) cout << "插入后第5个位置为: " << L.elem[4] << endl;
	//测试顺序表的删除--删除第4个元素
	if (ListDelete(L, 4)) cout << "删除成功!" << endl;
}

单链表

#include <iostream>
using namespace std;

constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;

//单链表的存储结构
typedef struct LNode
{
	ElemType data;
	struct LNode* next;	//结点的指针域
}LNode, * LinkList;	//LinkList为指向结构体LNode的指针类型

//构造一个空的单链表L
int InitList(LinkList& L)
{
	L = new LNode;	//生成新的结点为头结点,用头指针L指向头结点
	L->next = NULL;		//头结点指针域为空
	return OK;
}

//创建单链表--(前插法)逆位序输入n个元素的值,建立带表头结点的单链表
void CreateList_H(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;		//建立一个带有头结点的单链表
	LinkList p;
	for (int i = n; i > 0; i--) {
		p = new LNode;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}

}
//创建单链表--(后插法)正位序输入n个元素的值,建立带表头结点的单链表
void CreateList_R(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;		//建立一个带有头结点的单链表
	LinkList r = L;		//尾指针r指向头结点
	LinkList p;
	for (int i = 0; i < n; ++i) {
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;	//r=上一个,所以将上一个结点next指向新建的p
		r = p;		//r指向新的尾结点*p
	}

}

//插入--在带有头结点的单链表L中第i个位置插入值为e的新节点
int ListInsert(LinkList& L, int i, int e) {
	LinkList p = L;
	int j = 0;
	//查找第i-1个结点,指向该结点
	while (p && j < i - 1) {
		p = p->next;	
		j++;
	}
	if (p == NULL || j < i - 1) return ERROR;//检查插入位置是否合法
	LinkList s;
	s = new LNode;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

//删除位置i上的元素,并由e返回删除的元素 
int ListDelete(LinkList& L, int i) {
	LinkList p = L, q;
	int j = 0;
	while (p->next && i - 1 > j) {//查找第i-1个结点,指向该结点
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1) return ERROR;	//删除位置不合法
	q = p->next;
	p->next = q->next;		//改变删除结点前驱结点的指针域
	delete q;	//释放空间q
	return OK;
}

//取值--在带有头结点的单链表L中根据序号i通过e返回第i个数据
int GetElem(LinkList L, int i, ElemType& e) {
	LinkList  p;
	p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) return ERROR;
	e = p->data;
	return OK;
}

//查找--在带有头结点的单链表L中查找值为e的元素
LNode* LocateElem(LinkList L, ElemType e)
{
	LinkList p = L->next;	//初始化p指向首元结点
	while (p != NULL && p->data != e)
	{
		p = p->next;
	}
	return p;	//查找成功返回为e的结点地址p,失败则p为NULL
}

//方便测试输入单链表
void printLinklist(LinkList L) {
	LinkList p;
	p = L->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
}

int main()
{
	LinkList L;
	CreateList_H(L, 3);//创建一个长度为3的单链表
	printLinklist(L);
	cout << endl;

	ListInsert(L, 2, 8);//向第二个位置插入8
	printLinklist(L);
	cout << endl;

	ListDelete(L, 1);//删除第一个位置的元素
	printLinklist(L);
	cout << endl;

	ElemType e;
	GetElem(L, 2, e);	cout << e << endl;
	cout << LocateElem(L, 12);
	return 0;

}
posted @ 2020-11-13 12:07  走路带风Test  阅读(265)  评论(0编辑  收藏  举报
Demo
Return Top