第二章 2.2.1单链表的基本功能

本文展示了如何使用C++定义一个单链表结构体LNode,包括其数据成员和指针成员。接着,详细解释了LNode和LinkList的概念以及它们在代码中的作用。代码示例涵盖了单链表的初始化、按位置取值、查找指定元素、在指定位置插入元素和删除元素等基本操作。
摘要由CSDN通过智能技术生成
#include<iostream>
using namespace std;
typedef struct LNode {
	int data;
	struct LNode *next;
} LNode, *LinkList;
//简单写法
//typedef struct LNode *LinkList;
//typedef struct LNode {
//    int data;
//    LinkList next;
//}LNode;

/*
在这个代码中,`LNode`出现了多次,具体含义如下:

1. `struct LNode`: 这个是结构体的标签,
表示定义了一个名为`LNode`的结构体类型,
其中包含`data`和`next`两个成员变量。

2. `*next`: 这个是结构体中的一个指针类型的成员变量,
表示指向另一个`LNode`类型的结构体的指针。

3. `LNode`: 这个是结构体类型的别名,
使用`LNode`可以代替`struct LNode`来定义该类型的变量或指针类型。

4. `*LinkList`: 这个是结构体指针类型的别名,
表示一个指向`LNode`结构体的指针类型,
使用`LinkList`可以代替`struct LNode *`来定义该类型的指针变量。
*/
//单链表的初始化
int InitList(LinkList &L) {
	L = new LNode; //这个是构建一个头结点
	L->next = NULL;
	return 0;
}
//单链表的取值
int GetData(LinkList &L, int i) {
	LinkList p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) return -1;
	int e = p->data;
	return e;    //注意这里书上是返回ok,但是我们如果想返回值的话必须返回e。
}
/*
为什么使用LinkList p=L.next会报错
在这段代码中,`L`是一个链表结构体,
其中的`next`成员是一个指向下一个节点的指针。
因此,`L->next`表示访问`L`结构体中的`next`成员,
得到一个指向下一个节点的指针。

而如果使用`L.next`,
会被解释为访问`L`结构体中的一个叫做`next`的成员变量,
而这个成员变量是不存在的,因此编译器会报错。

需要注意的是,箭头运算符`->`和点运算符`.`都可以用来访问结构体中的成员变量,
但是它们的使用场景略有不同。箭头运算符`->`通常用于访问结构体指针中的成员变量,
而点运算符`.`则用于访问结构体本身中的成员变量。
*/
/*
所以如何区分用->还是.呢
通常来说,如果你要访问的结构体变量是一个指针类型的变量,
那么你应该使用箭头运算符`->`;
如果你要访问的结构体变量是一个非指针类型的变量,
那么你应该使用点运算符`.`。

具体来说,假设你有一个指向结构体的指针变量`p`和一个结构体变量`q`,
那么你应该按照以下方式选择运算符:

- 如果你要访问`p`所指向的结构体的成员变量,应该使用箭头运算符`->`,例如`p->data`;
- 如果你要访问`q`结构体本身的成员变量,应该使用点运算符`.`,例如`q.data`。

需要注意的是,在C语言中,使用箭头运算符`->`和点运算符`.`时,
前面的操作数必须是一个结构体指针或结构体本身。
如果你使用了错误的操作数,编译器会报错。
*/
//单链表的查找
LinkList FindNode(LinkList &L, int e) { //函数类型是指针。
	LinkList p = L->next;
	while (p->data != e && p) { //这里要注意P不等于空这个条件不要落
		p = p->next;
	}
	return p;
}
int InsertList(LinkList &L,int i,int e)
{
	LinkList p=L;int j=0;
	while(p && j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p ||j>i-1) return -1;
	
	LinkList s= new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return 0;
}
int NodeDelete(LinkList &L, int i) {
	LinkList P = L;
	int j = 1;
	while ((P->next) && j <= i - 1) { //注意找前一个节点。
		P = P->next;
		j++;
	}
	LinkList q = P->next;
	P->next = q->next;
	delete q;
	return 0;
}
int main() {
	LinkList L;
	int ret = InitList(L);
	if (ret == 0) {
		cout << "InitList success!" << endl;
	}

	InsertList(L, 1, 10);
	InsertList(L, 2, 20);
	InsertList(L, 3, 30);
	InsertList(L, 4, 40);
	InsertList(L, 5, 50);

	int data = GetData(L, 1);
	if (data != -1) {
		cout << "The third element is " << data << endl;
	} else {
		cout << "Get data failed!" << endl;
	}

	LinkList node = FindNode(L, 40);
	if (node) {
		cout << "Find the node: " << node->next << endl;
	} else {
		cout << "Node not found!" << endl;
	}

	ret = NodeDelete(L, 2);
	if (ret == 0) {
		cout << "Node deleted!" << endl;
	} else {
		cout << "Delete node failed" << endl;
	}

	data = GetData(L, 2);
	if (data != -1) {
		cout << "The second element is " << data << endl;  //删除第二个节点后,
															//“第二个”节点的值为30
	} else {
		cout << "Get data failed!" << endl;
	}

	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值