C/C++实现链表的各项功能

目录

1.线性表的属性设置

2.线性表的初始化

3.获取线性表的长度

4.按位序查找值

5.按值查找位序

6.插入元素到链表中

7.按位序删除

8.按值删除

9.清空链表

10.判断链表是否为空

11.逆转链表

12.显示链表中的所有节点


1.线性表的属性设置

//链表的属性设置
typedef int ElemType;//定义ElemType为int
typedef struct LNode* Point;//定义point为结构体指针
struct LNode {
	ElemType data;
	Point next;
};
typedef Point List;//用List表示链表的头节点指针
typedef Point Position;//用Position表示指向某个节点的指针

2.线性表的初始化

//初试化链表
void initlist(List &L)//引用传递
{
	L = (Position)malloc(sizeof(struct LNode));//为头结点分配空间,头指针指向头节点,两者地址一样,所以L->next指向第一个元素
	if (L==NULL)
	{
		cout << "初试化失败" << endl;
		exit(1);//防御性措施,防止出现 “取消对NULL指针的引用”的警告
	}
	else
	{
		cout << "初试化成功" << endl;
	}
	L->next = NULL;
}

3.获取线性表的长度

//获得链表的长度
int getlength(List L)
{
	int length = 0;
	Position p = L->next;//p指向当前第一个元素
	while (p)
	{
		p = p->next;
		length++;
	}
	return length;
}

4.按位序查找值

//按序号查找(返回当前序号的值)
ElemType findwithindex(List L, int index)
{
	Position p = L->next;
	int length = 1;//已遍历的长度
	while (p && length < index)
	{
		p = p->next;
		length++;
	}
	if (p && length == index)//已找到返回当前元素的值
	{
		return p->data;
	}
	else//未找到返回标志位-1
	{
		return -1;
	}
}

5.按值查找位序

//按值查找(返回当前值的序号)
ElemType findwithvalue(List L, ElemType value)
{
	Position p = L->next;
	int length = 1;
	while (p && p->data != value)
	{
		p = p->next;
		length++;
	}
	if (p && p->data == value)
	{
		return length;
	}
	else
	{
		return NULL;//表示没有找到
	}
}

6.插入元素到链表中

//将元素插入到链表中(新)
void insertlist2(List& L, ElemType value, int index)
{
	Position p = L;
	int j = 0;
	while (p != NULL && j < index - 1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL || j > index - 1)
	{
		cout << "插入元素失败" << endl;
		exit(1);
	}
	Position temp = (Position)malloc(sizeof(struct LNode));
	if (temp == NULL)
	{
		cout << "初试化失败" << endl;
		exit(1);//防御性措施,防止出现 “取消对NULL指针的引用”的警告
	}
	temp->data = value;
	temp->next = p->next;
	p->next = temp;
	cout << "插入元素成功" << endl;
}

7.按位序删除

//在表中删除元素,位序按(单链表上插入、删除一个节点时,需要知道这个节点之前的一个节点(前驱节点))
void deletelist(List &L, int index)
{
	Position p, temp;
	p = L;
	int length = 0;
	while (p && length < index - 1)
	{
		p = p->next;
		length++;
	}
	if (!p || length != index - 1 || p->next == NULL)
	{
		cout << "删除元素失败" << endl;
	}
	else
	{
		temp = p->next;
		p->next = p->next->next;
		free(temp);
		cout << "删除成功" << endl;
	}
}

8.按值删除

//按值删除元素(仍需找到待删除元素的前驱节点)
void delete_withvalue(List& L, int value)
{
	Position temp;
	Position p = L->next;//第一个节点
	Position p_last = L;//头结点
	while (p && p->data != value)//循环结束时p为当前删除的元素,p_last为其前驱节点
	{
		p_last = p;
		p = p->next;
	}
	if (!p || p->data != value )
	{
		cout << "删除元素失败" << endl;
	}
	else
	{
		temp = p_last->next;
		p_last->next = p_last->next->next;
		free(temp);
		cout << "删除成功" << endl;
	}

}

9.清空链表

//清空链表
void cleanlist(List &L)
{
	Position p;
	p = L->next;//p指向链表的第一个节点
	while (p)
	{
		Position q;
		q = p;
		p = p->next;
		free(q);
	}
	L->next = NULL;
	cout << "链表已清空" << endl;
}

10.判断链表是否为空

//判断链表是否为空
bool isEmpty(List L)
{
	
	if (L->next== NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

11.逆转链表

//逆转链表(三指针法)
void reverselist(List& L)
{
	Position p1, p2, p3;
	p1 = L;
	p2 = L->next;
	while (p2 != NULL)
	{
		p3 = p2->next;
		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}
	L->next ->next= NULL;//使原来的第一个节点(逆转后为最后一个节点)指向NULL
	L ->next= p1;
}

12.显示链表中的所有节点

//显示链表中的所有内容
void showlist(List L)
{
	Position p = L->next;
	cout << "线性表的内容如下" << endl;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值