chap1 数据结构——单链表的实现

#include<iostream>

using namespace std;


//定义链表中的元素
struct Date
{
	int age = 0;
};

//定义单链表(指针和元素)
typedef struct Lnode
{
	Date date;
	Lnode* next;
}Lnode, * ListNode;

//初始化链表
void InitList(ListNode& L)
{
	L->next = NULL;
	L->date.age = 0;
	return;
}

//判断链表是否为空
void Empty_L(ListNode& L)
{
	//为空返回ture,否则返回false
	if (L->next == NULL)cout << "链表L为空" << '\n';
	else cout << "链表L非空" << '\n';
}

//单链表的销毁,销毁后不存在,注意和清空有所区别
void Destroy_L(ListNode& L)
{
	ListNode p = new Lnode;
	while (L)
	{
		p = L;
		L = L->next;
		delete(p);
	}
	return;
}

//清空链表
void Clear_L(ListNode& L)
{
	ListNode p, q;
	p = L->next;
	while (p)
	{
		q = p->next;
		delete(p);
		p = q;
	}
	L->next = NULL;
	return;
}

//求表长
void Length_L(ListNode& L)
{
	ListNode p;
	p = L->next;
	int length = 0;
	while (p)
	{
		length++;
		p = p->next;
	}
	cout << "表长为" << length << '\n';
	return;
}

//取单链表中第i个元素的内容
Date GetElem_L(ListNode& L, int i)
{
	int count = 1;
	ListNode p; p = L->next;
	//i可能是负数
	while (count < i && p != NULL)
	{
		count++;
		p = p->next;
	}
	if (p == NULL || count > i)
	{
		cout << "查找失败" << '\n';
		Date s;
		s.age = -1;
		return s;
	}
	else return p->date;
}

//按值查找,返回所在位置(地址)
ListNode FindElem_L(ListNode& L, Date e)
{
	ListNode p = L->next;
	while (p)
	{
		if (p->date.age == e.age)return p;
		p = p->next;
	}
	cout << "不存在该数值" << '\n';
	return p;
}

//按值查找,返回所在序号
int FindLoca_L(ListNode& L, Date e1)
{
	ListNode p = L->next;
	int count = 1;
	while (p)
	{
		if (p->date.age == e1.age)return count;
		p = p->next;
		count++;
	}
	cout << "不存在该数值" << '\n';
	return -1;
}

//在第i个结点前插入新结点
void Insert_L(ListNode& L, int i, int e2)
{
	int count = 0;
	ListNode p = L;
	while (p && count < i - 1)
	{
		p = p->next;
		count++;
	}
	if (p == NULL || count > i - 1)
	{
		cout << "不存在该结点" << '\n';
		return;
	}
	ListNode q = new Lnode;
	q->date.age = e2;
	q->next = p->next;
	p->next = q;
	return;
}

//删除第i个结点
void Delete_L(ListNode& L, int i)
{
	ListNode p = L;
	int count = 0;
	while (p && count < i - 1)
	{
		count++;
		p = p->next;
	}
	if (p == NULL || count > i - 1)
	{
		cout << "不存在要删除的结点" << '\n';
		return;
	}
	ListNode q = p->next;
	p->next = q->next;
	delete(q);
	return;
}

//单链表的建立(头插法),插入n个元素
void CreatList_H(ListNode& L, int n)
{
	for (int i = 0; i < n; i++)
	{
		ListNode p = new Lnode;
		cin >> p->date.age;
		p->next = L->next;
		L->next = p;
	}
	return;
}

//单链表的建立(尾插法),插入n个元素
void CreatList_E(ListNode& L, int n)
{
	ListNode R = L;
	for (int i = 0; i < n; i++)
	{
		ListNode p = new Lnode;
		cin >> p->date.age;
		p->next = NULL;
		R->next = p;
		R = p;	
	}
}

//输出链表
void Print_L(ListNode& L)
{
	ListNode p = L->next;
	while (p)
	{
		cout << p->date.age <<' ';
		p = p->next;
	}
	cout << '\n';
	return;
}

int main()
{
	//创建一个链表
	Lnode* L = new Lnode;

	//初始化链表
	InitList(L);

	单链表的建立(头插法),插入n个元素
	//int n = 0; cin >> n;
	//CreatList_H(L, n);

	//单链表的建立(尾插法),插入n个元素
	int n = 0; cin >> n;
	CreatList_E(L, n);
	
	//输出链表
	Print_L(L);

	//判断链表是否为空
	Empty_L(L);
	
	单链表的销毁,销毁后不存在,注意和清空有所区别
	//Destroy_L(L);
	判断链表是否为空
	//Empty_L(L);

	清空链表
	//Clear_L(L);
	判断链表是否为空
	//Empty_L(L);

	//求表长
	Length_L(L);

	取单链表中第i个元素的内容
	//int i = 0; cin >> i;
	//Date e = GetElem_L(L, i);
	//cout << e.age << '\n';

	按值查找,返回所在位置(地址)
	//Date e1; cin >> e1.age;
	//ListNode t = FindElem_L(L, e1);
	//cout << t->date.age << '\n';

	按值查找,返回所在序号
	//Date e1; cin >> e1.age;
	//int Loc = FindLoca_L(L, e1);
	//cout << Loc << '\n';

	在第i个结点前插入新结点元素e2
	//int i = 0; cin >> i;
	//int e2 = 0; cin >> e2;
	//Insert_L(L, i, e2);
	输出链表
	//Print_L(L);

	删除第i个结点
	//int i = 0; cin >> i;
	//Delete_L(L, i);
	输出链表
	//Print_L(L);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值