#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.2.1单链表的基本功能
最新推荐文章于 2024-09-11 02:02:22 发布
本文展示了如何使用C++定义一个单链表结构体LNode,包括其数据成员和指针成员。接着,详细解释了LNode和LinkList的概念以及它们在代码中的作用。代码示例涵盖了单链表的初始化、按位置取值、查找指定元素、在指定位置插入元素和删除元素等基本操作。
摘要由CSDN通过智能技术生成