线性表实现

顺序表

  • 定义顺序表的结构
typedef int ELemType;
typedef struct
{
	ELemType data[MaxSize];
	int length;
}SqList;
  • 建立顺序表
//建立顺序表函数
void CreateList(SqList* &L, ELemType* a, int n)
{
	L = new SqList;
	for (int i = 0; i < n; i++)
	{
		L->data[i] = a[i];
	}
	L->length = n;
}
  •  销毁线性表
//销毁线性表
void Destory(SqList* L)
{
	delete L;
	cout << "销毁成功" << endl;
}
  •  输出线性表
//输出线性表
void Display(SqList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->data[i] << endl;
	}
}
  • 在第i个位置插入元素(i为物理位置)
bool Insert(SqList* L,ELemType e,int i)
{
	i = i - 1;
	if (i<0 || i>L->length || L->length==MaxSize)
		return false;
	for (int j = L->length; j >=i+1 ; j--)
	{
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = e;
	L->length++;
	return true;
}
  • 通过位置删除元素
bool Del(SqList* L, ELemType& e, int i)
{
	i = i - 1;
	if (i<0 || i>L->length - 1)
		return false;
	e = L->data[i];
	for (int j = i; i <= L->length-2; j++)
	{
		L->data[j] = L->data[j + 1];
	}
	
	L->length--;
	return true;
}
  • 按照元素位置查找元素
bool FindByPosition(SqList* L,int i)
{
	i = i - 1;
	if (i<0 || i>L->length - 1) return false;
	int j = 0;
	while (j < i)
	{
		j++;
	}
	cout << L->data[j] << endl;
	
}
  • 按照元素值查找元素
bool FindByValue(SqList* L, ELemType e)
{
	for (int i = 0; i < L->length; i++)
	{
		if (L->data[i] == e)
		{
			cout << L->data[i] << endl;
			cout << "该元素的位置为" << i + 1 << endl;
			return true;
		}
	}
	return false;

}
  • 测试代码
#include<iostream>
using namespace std;
#define MaxSize 50
typedef int ELemType;
typedef struct
{
	ELemType data[MaxSize];
	int length;
}SqList;
//建立顺序表函数
void CreateList(SqList* &L, ELemType* a, int n)
{
	L = new SqList;
	for (int i = 0; i < n; i++)
	{
		L->data[i] = a[i];
	}
	L->length = n;
}
//销毁线性表
void Destory(SqList* L)
{
	delete L;
	cout << "销毁成功" << endl;
}
//输出线性表
void Display(SqList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->data[i] << endl;
	}
}
//插入元素,i为物理位置
bool Insert(SqList* L,ELemType e,int i)
{
	i = i - 1;
	if (i<0 || i>L->length || L->length==MaxSize)
		return false;
	for (int j = L->length; j >=i+1 ; j--)
	{
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = e;
	L->length++;
	return true;
}
//删除元素,保存删除的元素
bool Del(SqList* L, ELemType& e, int i)
{
	i = i - 1;
	if (i<0 || i>L->length - 1)
		return false;
	e = L->data[i];
	for (int j = i; i <= L->length-2; j++)
	{
		L->data[j] = L->data[j + 1];
	}
	
	L->length--;
	return true;
}
//按照元素位置查找元素(物理位置)
bool FindByPosition(SqList* L,int i)
{
	i = i - 1;
	if (i<0 || i>L->length - 1) return false;
	int j = 0;
	while (j < i)
	{
		j++;
	}
	cout << L->data[j] << endl;
	
}
//按照元素值查找元素
bool FindByValue(SqList* L, ELemType e)
{
	for (int i = 0; i < L->length; i++)
	{
		if (L->data[i] == e)
		{
			cout << L->data[i] << endl;
			cout << "该元素的位置为" << i + 1 << endl;
			return true;
		}
	}
	return false;

}
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		a[i] = i;
	}
	SqList *L1 = NULL;
	int e=0;
	CreateList(L1, a, 10);
	Insert(L1, 10, 11);
	Display(L1);
	cout << "---------" << endl;
	FindByPosition(L1, 10);
	cout << "----------" << endl;
	FindByValue(L1, 5);
	Destory(L1);

	return 0;
}

链表

单链表

  • 定义单链表的结构
typedef int ElemType;
typedef struct LNode
{
	ElemType data;
	LNode* next;
}LinkNode;
  • 头插入建立单链表
void CreateListF(LinkNode*& L, ElemType* a, int n)
{
	LinkNode* s;
	L = new LinkNode;
	L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		s = new LinkNode;
		s->data = a[i];
		s->next = L->next;
		L->next = s;
	}
}
  • 尾插建立单链表
void CreateListR(LinkNode*& L, ElemType* a, int n)
{
	LinkNode* s, * r;
	L = new LinkNode;
	r = L;//尾插时头结点不能丢
	for (int i = 0; i < n; i++)
	{
		s = new LinkNode;
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
  • 销毁单链表(方法1)
void DestoryList01(LinkNode* L)
{
	LinkNode* pre, * p;
	pre = L,  p = L->next;
	while (p != NULL)
	{
		delete pre;
		pre = p;
		p = pre->next;
	}
	delete pre;//p 为NULL时pre指向最后一个节点
	cout << "销毁成功" << endl;
}
  • 销毁单链表(方法2)
void DestoryList02(LinkNode* L)
{
	LinkNode* p, * q;
	q = L;
	while ( q != NULL)
	{
		p = q->next;
		delete q;
		q = p;
	}
}
void DestoryList03(LinkNode* L)
{
	LinkNode* p, * q; 
	q = L;
	while (q != NULL)
	{
		p = q;
		q = q->next;
		delete p;
	}
}
  • 输出线性表
void Display(LinkNode* L)
{
	LinkNode* p = L->next;
	while (p != NULL)
	{
		cout << p->data << endl;
		p = p->next;
	}
}
  • 求单链表的长度
void LengthList(LinkNode* L)
{
	LinkNode* p = L;
	int n = 0;
	while (p->next != NULL)
	{
		n++;
		p = p->next;
	}
	cout << n << endl;
	LinkNode* q = L->next;
	int b = 0;
	while (q != NULL)
	{
		b++;
		q = q->next;
	}
	cout << b << endl;
}
  • 按序号求元素的值
bool GetElem(LinkNode* L,int i,ElemType& e)
{
	LinkNode* p = L;
	int j = 0;
	if (i <= 0) return false;
	while (j < i && p != NULL)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		e = p->data;
		return true;
	}
	
}
  • 查找第i个元素并返回该元素的地址

这个函数在查找和删除操i做经常用,所以建议单独封装成一个函数方便后续使用

LinkNode* FindNode(LinkNode* L, int i)
{
	LinkNode* p = L;
	int j = 0;
	while (j < i && p != NULL)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return NULL;
	}
	else
	{
		return p;
	}
}
  • 插入数据
bool InsertList(LinkNode* L, int i, ElemType e)
{
	if (i <= 0) return false;
	LinkNode* p = FindNode(L, i - 1);
	if (p != NULL)
	{
		LinkNode* s=new LinkNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
		return true;
	}
	else return false;

}
  • 删除数据
bool DelList(LinkNode* L, int i, ElemType& e)
{
	if (i <= 0) return false;
	LinkNode* p = FindNode(L, i - 1);
	if (p != NULL)
	{
		if (p->next == NULL)
		{
			return false;
		}
		else
		{
			LinkNode* s = p->next;
			p->next = s->next;
			e = s->data;
			delete s;
			return true;
		}
	}
}
  • 测试代码
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
	ElemType data;
	LNode* next;
}LinkNode;
//头插法建立单链表(含头结点)
void CreateListF(LinkNode*& L, ElemType* a, int n)
{
	LinkNode* s;
	L = new LinkNode;
	L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		s = new LinkNode;
		s->data = a[i];
		s->next = L->next;
		L->next = s;
	}
}
//尾插
void CreateListR(LinkNode*& L, ElemType* a, int n)
{
	LinkNode* s, * r;
	L = new LinkNode;
	r = L;//尾插时头结点不能丢
	for (int i = 0; i < n; i++)
	{
		s = new LinkNode;
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
//初始化线性表
void CreateList(LinkNode*& L)
{
	L = new LinkNode;
	L->next = NULL;
}
//销毁线性表
void DestoryList01(LinkNode* L)
{
	LinkNode* pre, * p;
	pre = L,  p = L->next;
	while (p != NULL)
	{
		delete pre;
		pre = p;
		p = pre->next;
	}
	delete pre;//p 为NULL时pre指向最后一个节点
	cout << "销毁成功" << endl;
}
void DestoryList02(LinkNode* L)
{
	LinkNode* p, * q;
	q = L;
	while ( q != NULL)
	{
		p = q->next;
		delete q;
		q = p;
	}
}
void DestoryList03(LinkNode* L)
{
	LinkNode* p, * q; 
	q = L;
	while (q != NULL)
	{
		p = q;
		q = q->next;
		delete p;
	}
}
//判断线性表是否为空
bool ListEmpty(LinkNode* L)
{
	return L->next;
}
//输出线性表
void Display(LinkNode* L)
{
	LinkNode* p = L->next;
	while (p != NULL)
	{
		cout << p->data << endl;
		p = p->next;
	}
}
//求线性表的长度
void LengthList(LinkNode* L)
{
	LinkNode* p = L;
	int n = 0;
	while (p->next != NULL)
	{
		n++;
		p = p->next;
	}
	cout << n << endl;
	LinkNode* q = L->next;
	int b = 0;
	while (q != NULL)
	{
		b++;
		q = q->next;
	}
	cout << b << endl;
}
//按序号求元素的值
bool GetElem(LinkNode* L,int i,ElemType& e)
{
	LinkNode* p = L;
	int j = 0;
	if (i <= 0) return false;
	while (j < i && p != NULL)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		e = p->data;
		return true;
	}
	
}
//查找第i个元素点并返回该节点的地址
LinkNode* FindNode(LinkNode* L, int i)
{
	LinkNode* p = L;
	int j = 0;
	while (j < i && p != NULL)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return NULL;
	}
	else
	{
		return p;
	}
}
//插入数据
bool InsertList(LinkNode* L, int i, ElemType e)
{
	if (i <= 0) return false;
	LinkNode* p = FindNode(L, i - 1);
	if (p != NULL)
	{
		LinkNode* s=new LinkNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
		return true;
	}
	else return false;

}
//删除数据
bool DelList(LinkNode* L, int i, ElemType& e)
{
	if (i <= 0) return false;
	LinkNode* p = FindNode(L, i - 1);
	if (p != NULL)
	{
		if (p->next == NULL)
		{
			return false;
		}
		else
		{
			LinkNode* s = p->next;
			p->next = s->next;
			e = s->data;
			delete s;
			return true;
		}
	}
}
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		a[i] = i + 1;
	}
	int e;
	LinkNode* b;
	LinkNode* L1 = NULL;
	CreateListR(L1, a, 10);
	Display(L1);
	cout << "----" << endl;
	LengthList(L1);
	cout << "----" << endl;
	GetElem(L1, 5, e);
	cout << e << endl;
	cout << "----" << endl;
	b = FindNode(L1, 5);
	cout << b->data << endl;
	cout << "----" << endl;
	InsertList(L1, 11, 11);
	Display(L1);
	cout << "----" << endl;
	DelList(L1, 11, e);
	cout << e << endl;
	DestoryList01(L1);
	return 0;
}

双链表

  • 头插法
void CreateListF(DLinkNode*& L, ElemType* a, int n)
{
	L = new DLinkNode;
	DLinkNode* s;
	L->prior = L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		s = new DLinkNode;
		s->data = a[i];//s->data=*(a+i);
		s->next = L->next;
		if (L->next != NULL)
		{
			L->next->prior = s;
		}
		L->next = s;
		s->prior = L;
	}
}
  • 尾插法
void CreateListR(DLinkNode*& L, ElemType* a, int n)
{
	L = new DLinkNode;
	DLinkNode* r = L, * s;
	for (int i = 0; i < n; i++)
	{
		s = new DLinkNode;
		s->data = a[i];
		r->next = s;
		s->prior = r;
		r = s;
	}
	r->next = NULL;
}

 


循环链表

循环单链表是将尾节点的next指针域指向头节点,判断尾节点的条件是p->next==NULL

循环双链表是将尾部节点的next指针域指向头节点,将头节点的prior指针域指向尾节点,判断尾节点的条件为p->next==NULL,循环双链表中可以通过p->prior快速找到尾节点

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值