数据结构C++实现(单链表) 青岛大学王卓老师

b站  《数据结构与算法基础(青岛大学-王卓)》

所用教材《数据结构C语言版第二版》 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著

代码中名称有些按自己想法写的,只能给一些基本操作供大家参考

#include<iostream>
using namespace std;
class Elem {
public:
	int name;
};
class Lnode {
public:
	Elem data;
	Lnode* next;
};
	void initlist(Lnode *&L);							//创建链表
	void DestroyList(Lnode *&L);					//删除链表
	void ClearList(Lnode* &L);					//清空链表
	int ListLength(Lnode* L);					//返回链表的表长
	int GetElem(Lnode* L, int i, Elem& e);			//查找第i个元素并返回其值
	int LocateElem(Lnode* L, Elem e);			//查找与e相同的值并返回是第几个元素
	int ListInsert(Lnode* &L, int i, Elem e);		//插入1个结点
	int ListDelete(Lnode* &L, int i);				//删除一个结点
	void CreateList_First(Lnode* &L, int n);			//创建一个带有头结点的n个结点的链表(头插法建立链表)
	void CreateList_Last(Lnode* &L, int n);			//尾插法建立链表
	void MergeList(Lnode* LA, Lnode* LB, Lnode* &LC);   //合并链表
    void initlist(Lnode* &L)						//创建链表
{
	L = new Lnode;
	 L->next= nullptr;	
}
void DestroyList(Lnode* &L)				//删除链表
{
	Lnode* p;
	while (L)
	{
		p = L;
		L = L->next;
		delete p;
	}
}
void ClearList(Lnode* &L)						//清空链表
{
	Lnode* p, * q;
	p = L->next;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;
	}
	L->next = nullptr;
}
int ListLength(Lnode* L)				//返回链表的表长
{
	Lnode* p = L->next;
	int Length = 0;
	while (p)
	{
		Length++;
		p = p->next;		
	}
	return Length;
}
int GetElem(Lnode* L, int i, Elem& e)				//查找第i个元素并返回其值
{
	int j = 1;
	Lnode* p=L->next;
	while(p&&j<i)
	{
		p = p->next;
		j++;
	}
	if (!p || i < j)
	{
		cerr << ("您查找的数不存在");
		return 1;
	}
	e = p->data;
}
int LocateElem(Lnode* L, Elem e)					//查找与e相同的值并返回是第几个元素
{
	Lnode* p = L->next;
	int i = 1;
	while (p && p->data.name != e.name)
	{
		p = p->next;
		i++;
	}
	return i;
	if (!p)
		return 1;
}
int ListInsert(Lnode* &L, int i, Elem e)							//插入1个结点
{
	Lnode* p = L;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p||j>i-1)return 1;				//i大于表长+1或i<1,就error
	Lnode *s = new Lnode;
	s->data = e;
	s->next = p->next;
	p->next = s;
}
int ListDelete(Lnode* &L, int i)					//删除一个结点
{
	Lnode*q,* p=L;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)return 1;
	q = p->next;
	p->next = p->next->next;
	delete q;
}
void CreateList_First(Lnode* &L, int n)					//头插法建立链表
{
	L = new Lnode;
	L->next = nullptr;							//建立一个带头结点的单链表
	for (int i = n; i > 0; i--)
	{
		Lnode* p = new Lnode;
		cin >> p->data.name;
		p->next = L->next;				//插入到表头
		L->next = p;
	}
}
void CreateList_Last(Lnode*& L, int n)			//尾插法建立链表
{
	L = new Lnode;
	L->next = nullptr;
	Lnode* r = L;									//尾指针r指向链表的尾结点
	for (int i = 0; i < n; i++)
	{
		Lnode* p = new Lnode;
		cin >> p->data.name;
		r->next = p;
		p->next = nullptr;
		r = p;
	}
}
void MergeList(Lnode* LA, Lnode* LB, Lnode* &LC)				//合并链表
{
	Lnode* pa = LA->next;
	Lnode* pb = LB->next;
	LC = LA;
	Lnode* pc = LC;
	while (pa && pb)
	{
			if(pa->data.name <= pb->data.name)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
			else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;								//插入剩余段
	delete LB;														//删除剩下的头结点

}
int main()
{
	
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值