单链表的基本操作代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表的基本操作代码
1. 什么是单链表
单链表是一种常见的数据结构,由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。每个节点都只知道下一个节点的地址,而不知道前驱节点的地址。单链表中的第一个节点称为头结点,最后一个节点称为尾节点。单链表的基本操作包括插入、删除、查找等。
2. 单链表的节点定义
在编写单链表的基本操作代码之前,我们首先需要定义单链表的节点结构。一个节点包含两部分信息:数据元素和指向下一个节点的指针。
typedef struct Node {
int data; // 数据元素
struct Node* next; // 指向下一个节点的指针
} Node;
3. 创建单链表
创建单链表的基本操作是不断在链表的末尾添加节点,直至达到指定的长度。下面是创建单链表的代码示例:
Node* createList(int length) {
Node* head = NULL; // 头结点
Node* tail = NULL; // 尾节点
for (int i = 0; i < length; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
printf("请输入第 %d 个节点的数值:", i + 1);
scanf("%d", &(newNode->data));
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
以上代码中,我们通过循环输入节点的数据元素,并依次添加到链表的末尾。首先创建一个空链表,并使用head和tail两个指针分别指向头结点和尾节点。每次添加节点时,我们将其设置为尾节点,更新tail指针即可。
4. 遍历单链表
遍历单链表是指依次访问链表中的每个节点,并对其进行操作或输出。下面是遍历单链表的代码示例:
void traverseList(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
}
以上代码中,我们使用一个指针p初始化为头结点,并进行循环遍历。每次迭代时,输出当前节点的数据元素,并将指针p更新为下一个节点。
5. 在单链表中插入节点
在单链表中插入节点是指在指定位置之前插入一个新的节点。具体的插入操作需要考虑两种情况:插入位置为头结点和插入位置为其他节点。
以下是在单链表中插入节点的代码示例:
void insertNode(Node* head, int position, int value) {
Node* p = head;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (position == 0) { // 插入位置为头结点
newNode->next = head;
head = newNode;
} else { // 插入位置为其他节点
for (int i = 0; i < position - 1 && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("插入位置无效!\n");
return;
}
newNode->next = p->next;
p->next = newNode;
}
}
以上代码中,我们首先根据插入位置创建一个新的节点,并将其值设置为指定值。然后,我们分别考虑了插入位置为头结点和其他节点的情况。如果插入位置为头结点,我们将新节点的指针指向原头结点,并将头指针指向新节点。如果插入位置为其他节点,我们需要遍历链表找到插入位置的前一个节点,并进行相应的插入操作。
6. 在单链表中删除节点
在单链表中删除节点是指从链表中删除指定位置的节点。具体的删除操作也需要考虑两种情况:删除位置为头结点和删除位置为其他节点。
以下是在单链表中删除节点的代码示例:
void deleteNode(Node** head, int position) {
Node* p = *head;
if (position == 0) { // 删除位置为头结点
*head = (*head)->next;
free(p);
} else { // 删除位置为其他节点
Node* prev = NULL;
for (int i = 0; i < position && p != NULL; i++) {
prev = p;
p = p->next;
}
if (p == NULL) {
printf("删除位置无效!\n");
return;
}
prev->next = p->next;
free(p);
}
}
以上代码中,我们分别考虑了删除位置为头结点和其他节点的情况。如果删除位置为头结点,我们首先将头指针指向下一个节点,并释放原头结点的内存空间。如果删除位置为其他节点,我们需要遍历链表找到指定位置的节点,并记录其前一个节点。然后,将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存空间。
7. 单链表的查找操作
在单链表中进行查找操作是指查找给定值的节点,并返回其位置或相关信息。单链表的查找操作包括按值查找和按位置查找两种方式。
以下是单链表的查找操作的代码示例:
int findNodeByValue(Node* head, int value) {
Node* p = head;
int position = 0;
while (p != NULL && p->data != value) {
p = p->next;
position++;
}
if (p == NULL) {
return -1; // 未找到指定值的节点
}
return position;
}
Node* findNodeByPosition(Node* head, int position) {
Node* p = head;
for (int i = 0; i < position && p != NULL; i++) {
p = p->next;
}